Piotr Caban : msvcrt: NULL terminate program arguments list in __getmainargs.

Alexandre Julliard julliard at winehq.org
Wed Dec 26 14:05:17 CST 2012


Module: wine
Branch: master
Commit: 6e485f13c011b8429a8b44afd53163ddb3c0bfd1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6e485f13c011b8429a8b44afd53163ddb3c0bfd1

Author: Piotr Caban <piotr at 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();




More information about the wine-cvs mailing list