changeset 30192:8c8031be8072

Windows: Don't get pointers to C strings while vector is still unstable. * src/main-cli.cc, src/main-gui.cc, src/main.in.cc, src/octave-config.in.cc, src/octave-svgconvert.cc: The memory used by a vector is not guaranteed to be stable when elements are added with push_back. Wait until vector is complete before getting the pointers to the corresponding C strings.
author Markus Mützel <markus.muetzel@gmx.de>
date Thu, 16 Sep 2021 21:51:03 +0200
parents 57aac5b9cf9d
children d603f1229301
files src/main-cli.cc src/main-gui.cc src/main.in.cc src/octave-config.in.cc src/octave-svgconvert.cc
diffstat 5 files changed, 23 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/src/main-cli.cc	Thu Sep 16 21:12:15 2021 -0400
+++ b/src/main-cli.cc	Thu Sep 16 21:51:03 2021 +0200
@@ -98,12 +98,11 @@
   // convert wide character strings to multibyte UTF-8 strings
   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_str.push_back (wchar_conv.to_bytes (wargv[i_arg]));
 
-      // Save the string because argv_str[i_arg] may return a temporary.
-      argv[i_arg] = octave::strsave (&argv_str[i_arg][0]);
-    }
+  // Get pointers to C strings not before vector is stable.
+  for (int i_arg = 0; i_arg < argc; i_arg++)
+    argv[i_arg] = &argv_str[i_arg][0];
   argv[argc] = nullptr;
 
 #else
--- a/src/main-gui.cc	Thu Sep 16 21:12:15 2021 -0400
+++ b/src/main-gui.cc	Thu Sep 16 21:51:03 2021 +0200
@@ -111,12 +111,11 @@
   // convert wide character strings to multibyte UTF-8 strings
   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_str.push_back (wchar_conv.to_bytes (wargv[i_arg]));
 
-      // Save the string because argv_str[i_arg] may return a temporary.
-      argv[i_arg] = octave::strsave (&argv_str[i_arg][0]);
-    }
+  // Get pointers to C strings not before vector is stable.
+  for (int i_arg = 0; i_arg < argc; i_arg++)
+    argv[i_arg] = &argv_str[i_arg][0];
   argv[argc] = nullptr;
 
 #else
--- a/src/main.in.cc	Thu Sep 16 21:12:15 2021 -0400
+++ b/src/main.in.cc	Thu Sep 16 21:51:03 2021 +0200
@@ -229,10 +229,11 @@
   // convert wide character strings to multibyte UTF-8 strings
   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_str.push_back (wchar_conv.to_bytes (wargv[i_arg]));
+
+  // Get pointers to C strings not before vector is stable.
+  for (int i_arg = 0; i_arg < argc; i_arg++)
+    argv[i_arg] = &argv_str[i_arg][0];
   argv[argc] = nullptr;
 
 #else
--- a/src/octave-config.in.cc	Thu Sep 16 21:12:15 2021 -0400
+++ b/src/octave-config.in.cc	Thu Sep 16 21:51:03 2021 +0200
@@ -156,10 +156,11 @@
   // convert wide character strings to multibyte UTF-8 strings
   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_str.push_back (wchar_conv.to_bytes (wargv[i_arg]));
+
+  // Get pointers to C strings not before vector is stable.
+  for (int i_arg = 0; i_arg < argc; i_arg++)
+    argv[i_arg] = &argv_str[i_arg][0];
   argv[argc] = nullptr;
 
 #else
--- a/src/octave-svgconvert.cc	Thu Sep 16 21:12:15 2021 -0400
+++ b/src/octave-svgconvert.cc	Thu Sep 16 21:51:03 2021 +0200
@@ -832,10 +832,11 @@
   // convert wide character strings to multibyte UTF-8 strings
   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_str.push_back (wchar_conv.to_bytes (wargv[i_arg]));
+
+  // Get pointers to C strings not before vector is stable.
+  for (int i_arg = 0; i_arg < argc; i_arg++)
+    argv[i_arg] = &argv_str[i_arg][0];
   argv[argc] = nullptr;
 
 #else