Module: wine Branch: master Commit: 6e485f13c011b8429a8b44afd53163ddb3c0bfd1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6e485f13c011b8429a8b44afd5...
Author: Piotr Caban piotr@codeweavers.com Date: Wed Dec 26 13:28:14 2012 +0100
msvcrt: NULL terminate program arguments list in __getmainargs.
---
dlls/msvcrt/data.c | 16 ++++++++++------ dlls/msvcrt/tests/data.c | 2 ++ 2 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/dlls/msvcrt/data.c b/dlls/msvcrt/data.c index a9505ed..b31e5f7 100644 --- a/dlls/msvcrt/data.c +++ b/dlls/msvcrt/data.c @@ -424,7 +424,7 @@ static int build_expanded_argv(int *argc, char **argv)
len = strlen(data.cFileName)+1; if(argv) { - argv[args_no] = (char*)(argv+*argc)+size; + argv[args_no] = (char*)(argv+*argc+1)+size; memcpy(argv[args_no], __wine_main_argv[i], path_len*sizeof(char)); memcpy(argv[args_no]+path_len, data.cFileName, len*sizeof(char)); } @@ -437,7 +437,7 @@ static int build_expanded_argv(int *argc, char **argv) if(!len) { len = strlen(__wine_main_argv[i])+1; if(argv) { - argv[args_no] = (char*)(argv+*argc)+size; + argv[args_no] = (char*)(argv+*argc+1)+size; memcpy(argv[args_no], __wine_main_argv[i], len*sizeof(char)); } args_no++; @@ -445,7 +445,9 @@ static int build_expanded_argv(int *argc, char **argv) } }
- size += args_no*sizeof(char*); + if(argv) + argv[args_no] = NULL; + size += (args_no+1)*sizeof(char*); *argc = args_no; return size; } @@ -519,7 +521,7 @@ static int build_expanded_wargv(int *argc, MSVCRT_wchar_t **argv)
len = strlenW(data.cFileName)+1; if(argv) { - argv[args_no] = (MSVCRT_wchar_t*)(argv+*argc)+size; + argv[args_no] = (MSVCRT_wchar_t*)(argv+*argc+1)+size; memcpy(argv[args_no], __wine_main_wargv[i], path_len*sizeof(MSVCRT_wchar_t)); memcpy(argv[args_no]+path_len, data.cFileName, len*sizeof(MSVCRT_wchar_t)); } @@ -532,7 +534,7 @@ static int build_expanded_wargv(int *argc, MSVCRT_wchar_t **argv) if(!len) { len = strlenW(__wine_main_wargv[i])+1; if(argv) { - argv[args_no] = (MSVCRT_wchar_t*)(argv+*argc)+size; + argv[args_no] = (MSVCRT_wchar_t*)(argv+*argc+1)+size; memcpy(argv[args_no], __wine_main_wargv[i], len*sizeof(MSVCRT_wchar_t)); } args_no++; @@ -540,8 +542,10 @@ static int build_expanded_wargv(int *argc, MSVCRT_wchar_t **argv) } }
+ if(argv) + argv[args_no] = NULL; size *= sizeof(MSVCRT_wchar_t); - size += args_no*sizeof(MSVCRT_wchar_t*); + size += (args_no+1)*sizeof(MSVCRT_wchar_t*); *argc = args_no; return size; } diff --git a/dlls/msvcrt/tests/data.c b/dlls/msvcrt/tests/data.c index cdd65a7..e2adc34 100644 --- a/dlls/msvcrt/tests/data.c +++ b/dlls/msvcrt/tests/data.c @@ -146,6 +146,7 @@ static void test___getmainargs(void) ok(!strcmp(argv[2], filepath), "argv[2] = %s\n", argv[2]); sprintf(filepath, "%swine_test/*", tmppath); ok(!strcmp(argv[3], filepath), "argv[3] = %s\n", argv[3]); + ok(!argv[4], "argv[4] != NULL\n");
if(p___p___argc && p___p___argv) { new_argc = *p___p___argc(); @@ -172,6 +173,7 @@ static void test___getmainargs(void) sprintf(filepath, "%swine_test/test", tmppath); ok(!strcmp(argv[3], filepath), "argv[3] = %s\n", argv[3]); } + ok(!argv[5], "argv[5] != NULL\n");
if(p___p___argc && p___p___argv) { new_argc = *p___p___argc();