diff src/mkoctfile.in.cc @ 29699:b98ae05c6b7e

avoid possible buffer corruption introduced in b6f80b1d448f * mkoctfile.in.cc (main): Save arguments in vector of string objects. (wmain): Don't generate char** argv array since we convert its elements back to string objects for most processing anyway. Use std::string operator== instead of strcmp. * main-cli.cc, main-gui.cc (wmain): Save copies of arguments in generated argv array.
author John W. Eaton <jwe@octave.org>
date Mon, 24 May 2021 14:27:07 -0400
parents ce4436d2b206
children 79369ad5cee6 15ae4d97a632
line wrap: on
line diff
--- a/src/mkoctfile.in.cc	Mon May 24 20:05:23 2021 +0200
+++ b/src/mkoctfile.in.cc	Mon May 24 14:27:07 2021 -0400
@@ -703,34 +703,35 @@
 #if defined (OCTAVE_USE_WINDOWS_API) && defined (_UNICODE)
 extern "C"
 int
-wmain (int argc, wchar_t **wargv)
+wmain (int argc, wchar_t **sys_argv)
 {
-  static char **argv = new char * [argc + 1];
-  std::vector<std::string> argv_str;
+  std::vector<std::string> argv;
 
-  // convert wide character strings to multibyte UTF-8 strings
+  // Convert wide character strings to multibyte UTF-8 strings and save
+  // them in a vector of std::string objects for later processing.
+
   std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> wchar_conv;
   for (int i_arg = 0; i_arg < argc; i_arg++)
-    {
-      argv_str.push_back (wchar_conv.to_bytes (wargv[i_arg]));
-      argv[i_arg] = &argv_str[i_arg][0];
-    }
-  argv[argc] = nullptr;
-
+    argv.push_back (wchar_conv.to_bytes (sys_argv[i_arg]));
 #else
 int
-main (int argc, char **argv)
+main (int argc, char **sys_argv)
 {
+  std::vector<std::string> argv;
+
+  // Save args as vector of std::string objects for later processing.
+  for (int i_arg = 0; i_arg < argc; i_arg++)
+    argv.push_back (sys_argv[i_arg]);
 #endif
-  if (argc == 1)
+
+ if (argc == 1)
     {
       std::cout << usage_msg << std::endl;
       return 1;
     }
 
-  if (argc == 2 && (! strcmp (argv[1], "-v")
-                    || ! strcmp (argv[1], "-version")
-                    || ! strcmp (argv[1], "--version")))
+  if (argc == 2 && (argv[1] == "-v" || argv[1] == "-version"
+                    || argv[1] == "--version"))
     {
       std::cout << version_msg << std::endl;
       return 0;
@@ -888,7 +889,7 @@
               ++i;
 
               // FIXME: Remove LFLAGS checking in Octave 7.0
-              if (! strcmp (argv[i], "LFLAGS"))
+              if (argv[i] == "LFLAGS")
                 std::cerr << "mkoctfile: warning: LFLAGS is deprecated and will be removed in a future version of Octave, use LDFLAGS instead" << std::endl;
 
               if (! var_to_print.empty ())