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;