From 6e485f13c011b8429a8b44afd53163ddb3c0bfd1 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Wed, 26 Dec 2012 13:28:14 +0100 Subject: [PATCH] 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 a9505ed4b01..b31e5f78fca 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 cdd65a73e6f..e2adc34da62 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();