shithub: choc

Download patch

ref: 5ccf89a00d7be33b1934d22a9eb8d82a2be153c4
parent: 85bcd1c917864673aa86cc14921e0ac0f209da9a
parent: 745e7342badc686f40ee25c2fa211e69924ad938
author: Turo Lamminen <turol@users.noreply.github.com>
date: Fri Aug 27 17:39:25 EDT 2021

Merge pull request #1346 from turol/const

Refactor myargv and fix const correctness issue

--- a/src/i_main.c
+++ b/src/i_main.c
@@ -18,6 +18,7 @@
 
 #include "config.h"
 
+#include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 
@@ -26,7 +27,9 @@
 #include "doomtype.h"
 #include "i_system.h"
 #include "m_argv.h"
+#include "m_misc.h"
 
+
 //
 // D_DoomMain()
 // Not a globally visible function, just included for source reference,
@@ -40,7 +43,13 @@
     // save arguments
 
     myargc = argc;
-    myargv = argv;
+    myargv = malloc(argc * sizeof(char *));
+    assert(myargv != NULL);
+
+    for (int i = 0; i < argc; i++)
+    {
+        myargv[i] = M_StringDuplicate(argv[i]);
+    }
 
     //!
     // Print the program version and exit.
--- a/src/m_argv.c
+++ b/src/m_argv.c
@@ -132,6 +132,7 @@
     for (i=0; i<argv_index; ++i)
     {
         newargv[i] = myargv[i];
+        myargv[i] = NULL;
         ++newargc;
     }
 
@@ -158,10 +159,11 @@
 
         if (infile[k] == '\"')
         {
+            char *argstart;
             // Skip the first character(")
             ++k;
 
-            newargv[newargc++] = &infile[k];
+            argstart = &infile[k];
 
             // Read all characters between quotes
 
@@ -180,12 +182,14 @@
 
             infile[k] = '\0';
             ++k;
+            newargv[newargc++] = M_StringDuplicate(argstart);
         }
         else
         {
+            char *argstart;
             // Read in the next argument until a space is reached
 
-            newargv[newargc++] = &infile[k];
+            argstart = &infile[k];
 
             while(k < size && !isspace(infile[k]))
             {
@@ -197,6 +201,7 @@
             infile[k] = '\0';
 
             ++k;
+            newargv[newargc++] = M_StringDuplicate(argstart);
         }
     }
 
@@ -205,12 +210,26 @@
     for (i=argv_index + 1; i<myargc; ++i)
     {
         newargv[newargc] = myargv[i];
+        myargv[i] = NULL;
         ++newargc;
     }
 
+    // Free any old strings in myargv which were not moved to newargv
+    for (i = 0; i < myargc; ++i)
+    {
+        if (myargv[i] != NULL)
+        {
+            free(myargv[i]);
+            myargv[i] = NULL;
+        }
+    }
+
+    free(myargv);
     myargv = newargv;
     myargc = newargc;
 
+    free(file);
+
 #if 0
     // Disabled - Vanilla Doom does not do this.
     // Display arguments
@@ -259,7 +278,8 @@
         // the loop we'll ignore it. Since some parameters stop reading when
         // an argument beginning with a '-' is encountered, we keep something
         // that starts with a '-'.
-        myargv[i] = "-_";
+        free(myargv[i]);
+        myargv[i] = M_StringDuplicate("-_");
         LoadResponseFile(i + 1, myargv[i + 1]);
     }
 }