Bruno Jesus : shell32: Don' t parse command line if numargs is NULL in CommandLineToArgvW.

Alexandre Julliard julliard at winehq.org
Wed Oct 26 12:35:47 CDT 2011


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

Author: Bruno Jesus <00cpxxx at gmail.com>
Date:   Tue Oct 25 23:35:13 2011 -0200

shell32: Don't parse command line if numargs is NULL in CommandLineToArgvW.

---

 dlls/shell32/shell32_main.c  |   12 ++++++++----
 dlls/shell32/tests/shlexec.c |   10 ++++++++++
 2 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/dlls/shell32/shell32_main.c b/dlls/shell32/shell32_main.c
index 981a245..2561f8c 100644
--- a/dlls/shell32/shell32_main.c
+++ b/dlls/shell32/shell32_main.c
@@ -92,6 +92,12 @@ LPWSTR* WINAPI CommandLineToArgvW(LPCWSTR lpCmdline, int* numargs)
     LPWSTR cmdline;
     int in_quotes,bcount;
 
+    if(!numargs)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return NULL;
+    }
+
     if (*lpCmdline==0)
     {
         /* Return the path to the executable */
@@ -113,8 +119,7 @@ LPWSTR* WINAPI CommandLineToArgvW(LPCWSTR lpCmdline, int* numargs)
             LocalFree( argv );
         }
         argv[0]=(LPWSTR)(argv+1);
-        if (numargs)
-            *numargs=1;
+        *numargs=1;
 
         return argv;
     }
@@ -228,8 +233,7 @@ LPWSTR* WINAPI CommandLineToArgvW(LPCWSTR lpCmdline, int* numargs)
         *d='\0';
         argv[argc++]=arg;
     }
-    if (numargs)
-        *numargs=argc;
+    *numargs=argc;
 
     return argv;
 }
diff --git a/dlls/shell32/tests/shlexec.c b/dlls/shell32/tests/shlexec.c
index 5542ea5..1c5fe7f 100644
--- a/dlls/shell32/tests/shlexec.c
+++ b/dlls/shell32/tests/shlexec.c
@@ -2157,6 +2157,7 @@ static void test_commandline(void)
     LPWSTR *args = (LPWSTR*)0xdeadcafe, pbuf;
     INT numargs = -1;
     size_t buflen;
+    DWORD lerror;
 
     wsprintfW(cmdline,fmt1,one,two,three,four);
     args=CommandLineToArgvW(cmdline,&numargs);
@@ -2171,6 +2172,15 @@ static void test_commandline(void)
     ok(lstrcmpW(args[2],three)==0,"arg2 is not as expected\n");
     ok(lstrcmpW(args[3],four)==0,"arg3 is not as expected\n");
 
+    SetLastError(0xdeadbeef);
+    args=CommandLineToArgvW(cmdline,NULL);
+    lerror=GetLastError();
+    ok(args == NULL && lerror == ERROR_INVALID_PARAMETER, "expected NULL with ERROR_INVALID_PARAMETER got %p with %d\n",args,lerror);
+    SetLastError(0xdeadbeef);
+    args=CommandLineToArgvW(NULL,NULL);
+    lerror=GetLastError();
+    ok(args == NULL && lerror == ERROR_INVALID_PARAMETER, "expected NULL with ERROR_INVALID_PARAMETER got %p with %d\n",args,lerror);
+
     wsprintfW(cmdline,fmt2,one,two,three,four);
     args=CommandLineToArgvW(cmdline,&numargs);
     ok(numargs == 5, "expected 5 args, got %i\n",numargs);




More information about the wine-cvs mailing list