# HG changeset patch # User Markus Mützel # Date 1631821863 -7200 # Node ID 8c8031be8072a1883c042fc85378d8c705701dd3 # Parent 57aac5b9cf9d85becfa23fdae9659fcd9843b9ee 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. diff -r 57aac5b9cf9d -r 8c8031be8072 src/main-cli.cc --- 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, 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 diff -r 57aac5b9cf9d -r 8c8031be8072 src/main-gui.cc --- 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, 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 diff -r 57aac5b9cf9d -r 8c8031be8072 src/main.in.cc --- 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, 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 diff -r 57aac5b9cf9d -r 8c8031be8072 src/octave-config.in.cc --- 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, 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 diff -r 57aac5b9cf9d -r 8c8031be8072 src/octave-svgconvert.cc --- 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, 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