Mercurial > octave
comparison 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 |
comparison
equal
deleted
inserted
replaced
29698:bbf5d4ea616c | 29699:b98ae05c6b7e |
---|---|
701 } | 701 } |
702 | 702 |
703 #if defined (OCTAVE_USE_WINDOWS_API) && defined (_UNICODE) | 703 #if defined (OCTAVE_USE_WINDOWS_API) && defined (_UNICODE) |
704 extern "C" | 704 extern "C" |
705 int | 705 int |
706 wmain (int argc, wchar_t **wargv) | 706 wmain (int argc, wchar_t **sys_argv) |
707 { | 707 { |
708 static char **argv = new char * [argc + 1]; | 708 std::vector<std::string> argv; |
709 std::vector<std::string> argv_str; | 709 |
710 | 710 // Convert wide character strings to multibyte UTF-8 strings and save |
711 // convert wide character strings to multibyte UTF-8 strings | 711 // them in a vector of std::string objects for later processing. |
712 | |
712 std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> wchar_conv; | 713 std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> wchar_conv; |
713 for (int i_arg = 0; i_arg < argc; i_arg++) | 714 for (int i_arg = 0; i_arg < argc; i_arg++) |
714 { | 715 argv.push_back (wchar_conv.to_bytes (sys_argv[i_arg])); |
715 argv_str.push_back (wchar_conv.to_bytes (wargv[i_arg])); | |
716 argv[i_arg] = &argv_str[i_arg][0]; | |
717 } | |
718 argv[argc] = nullptr; | |
719 | |
720 #else | 716 #else |
721 int | 717 int |
722 main (int argc, char **argv) | 718 main (int argc, char **sys_argv) |
723 { | 719 { |
724 #endif | 720 std::vector<std::string> argv; |
725 if (argc == 1) | 721 |
722 // Save args as vector of std::string objects for later processing. | |
723 for (int i_arg = 0; i_arg < argc; i_arg++) | |
724 argv.push_back (sys_argv[i_arg]); | |
725 #endif | |
726 | |
727 if (argc == 1) | |
726 { | 728 { |
727 std::cout << usage_msg << std::endl; | 729 std::cout << usage_msg << std::endl; |
728 return 1; | 730 return 1; |
729 } | 731 } |
730 | 732 |
731 if (argc == 2 && (! strcmp (argv[1], "-v") | 733 if (argc == 2 && (argv[1] == "-v" || argv[1] == "-version" |
732 || ! strcmp (argv[1], "-version") | 734 || argv[1] == "--version")) |
733 || ! strcmp (argv[1], "--version"))) | |
734 { | 735 { |
735 std::cout << version_msg << std::endl; | 736 std::cout << version_msg << std::endl; |
736 return 0; | 737 return 0; |
737 } | 738 } |
738 | 739 |
886 if (i < argc-1) | 887 if (i < argc-1) |
887 { | 888 { |
888 ++i; | 889 ++i; |
889 | 890 |
890 // FIXME: Remove LFLAGS checking in Octave 7.0 | 891 // FIXME: Remove LFLAGS checking in Octave 7.0 |
891 if (! strcmp (argv[i], "LFLAGS")) | 892 if (argv[i] == "LFLAGS") |
892 std::cerr << "mkoctfile: warning: LFLAGS is deprecated and will be removed in a future version of Octave, use LDFLAGS instead" << std::endl; | 893 std::cerr << "mkoctfile: warning: LFLAGS is deprecated and will be removed in a future version of Octave, use LDFLAGS instead" << std::endl; |
893 | 894 |
894 if (! var_to_print.empty ()) | 895 if (! var_to_print.empty ()) |
895 std::cerr << "mkoctfile: warning: only one '" << arg | 896 std::cerr << "mkoctfile: warning: only one '" << arg |
896 << "' option will be processed" << std::endl; | 897 << "' option will be processed" << std::endl; |