Alexandre Julliard : advapi32: Fix the parameter checks in QueryServiceStatusEx.

Alexandre Julliard julliard at winehq.org
Fri Jun 10 11:16:18 CDT 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Jun  9 21:40:08 2011 +0200

advapi32: Fix the parameter checks in QueryServiceStatusEx.

---

 dlls/advapi32/service.c       |   23 +++++++++++++++++------
 dlls/advapi32/tests/service.c |   16 ++++++----------
 2 files changed, 23 insertions(+), 16 deletions(-)

diff --git a/dlls/advapi32/service.c b/dlls/advapi32/service.c
index 2b37338..1674c6f 100644
--- a/dlls/advapi32/service.c
+++ b/dlls/advapi32/service.c
@@ -1172,21 +1172,32 @@ BOOL WINAPI QueryServiceStatusEx(SC_HANDLE hService, SC_STATUS_TYPE InfoLevel,
 
     TRACE("%p %d %p %d %p\n", hService, InfoLevel, lpBuffer, cbBufSize, pcbBytesNeeded);
 
-    __TRY
+    if (InfoLevel != SC_STATUS_PROCESS_INFO)
     {
-        err = svcctl_QueryServiceStatusEx(hService, InfoLevel, lpBuffer, cbBufSize, pcbBytesNeeded);
+        err = ERROR_INVALID_LEVEL;
     }
-    __EXCEPT(rpc_filter)
+    else if (cbBufSize < sizeof(SERVICE_STATUS_PROCESS))
     {
-        err = map_exception_code(GetExceptionCode());
+        *pcbBytesNeeded = sizeof(SERVICE_STATUS_PROCESS);
+        err = ERROR_INSUFFICIENT_BUFFER;
+    }
+    else
+    {
+        __TRY
+        {
+            err = svcctl_QueryServiceStatusEx(hService, InfoLevel, lpBuffer, cbBufSize, pcbBytesNeeded);
+        }
+        __EXCEPT(rpc_filter)
+        {
+            err = map_exception_code(GetExceptionCode());
+        }
+        __ENDTRY
     }
-    __ENDTRY
     if (err != ERROR_SUCCESS)
     {
         SetLastError(err);
         return FALSE;
     }
-
     return TRUE;
 }
 
diff --git a/dlls/advapi32/tests/service.c b/dlls/advapi32/tests/service.c
index e86208f..e243db0 100644
--- a/dlls/advapi32/tests/service.c
+++ b/dlls/advapi32/tests/service.c
@@ -956,7 +956,6 @@ static void test_query_svc(void)
     SetLastError(0xdeadbeef);
     ret = pQueryServiceStatusEx(NULL, 1, NULL, 0, NULL);
     ok(!ret, "Expected failure\n");
-    todo_wine
     ok(GetLastError() == ERROR_INVALID_LEVEL,
        "Expected ERROR_INVALID_LEVEL, got %d\n", GetLastError());
 
@@ -966,8 +965,8 @@ static void test_query_svc(void)
 
     /* Only info level is correct. It looks like the buffer/size is checked second */
     SetLastError(0xdeadbeef);
-    ret = pQueryServiceStatusEx(NULL, 0, NULL, 0, &needed);
-    /* NT4 and Wine check the handle first */
+    ret = pQueryServiceStatusEx(NULL, SC_STATUS_PROCESS_INFO, NULL, 0, &needed);
+    /* NT4 checks the handle first */
     if (GetLastError() != ERROR_INVALID_HANDLE)
     {
         ok(!ret, "Expected failure\n");
@@ -981,7 +980,7 @@ static void test_query_svc(void)
     statusproc = HeapAlloc(GetProcessHeap(), 0, sizeof(SERVICE_STATUS_PROCESS));
     bufsize = needed;
     SetLastError(0xdeadbeef);
-    ret = pQueryServiceStatusEx(NULL, 0, (BYTE*)statusproc, bufsize, &needed);
+    ret = pQueryServiceStatusEx(NULL, SC_STATUS_PROCESS_INFO, (BYTE*)statusproc, bufsize, &needed);
     ok(!ret, "Expected failure\n");
     ok(GetLastError() == ERROR_INVALID_HANDLE,
        "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
@@ -989,25 +988,22 @@ static void test_query_svc(void)
 
     /* Correct handle and info level */
     SetLastError(0xdeadbeef);
-    ret = pQueryServiceStatusEx(svc_handle, 0, NULL, 0, &needed);
+    ret = pQueryServiceStatusEx(svc_handle, SC_STATUS_PROCESS_INFO, NULL, 0, &needed);
     /* NT4 doesn't return the needed size */
     if (GetLastError() != ERROR_INVALID_PARAMETER)
     {
         ok(!ret, "Expected failure\n");
-        todo_wine
-        {
         ok(needed == sizeof(SERVICE_STATUS_PROCESS),
            "Needed buffersize is wrong : %d\n", needed);
         ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
            "Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
-        }
     }
 
     /* All parameters are OK but we don't have enough rights */
     statusproc = HeapAlloc(GetProcessHeap(), 0, sizeof(SERVICE_STATUS_PROCESS));
     bufsize = sizeof(SERVICE_STATUS_PROCESS);
     SetLastError(0xdeadbeef);
-    ret = pQueryServiceStatusEx(svc_handle, 0, (BYTE*)statusproc, bufsize, &needed);
+    ret = pQueryServiceStatusEx(svc_handle, SC_STATUS_PROCESS_INFO, (BYTE*)statusproc, bufsize, &needed);
     ok(!ret, "Expected failure\n");
     ok(GetLastError() == ERROR_ACCESS_DENIED,
        "Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
@@ -1021,7 +1017,7 @@ static void test_query_svc(void)
     statusproc = HeapAlloc(GetProcessHeap(), 0, sizeof(SERVICE_STATUS_PROCESS));
     bufsize = sizeof(SERVICE_STATUS_PROCESS);
     SetLastError(0xdeadbeef);
-    ret = pQueryServiceStatusEx(svc_handle, 0, (BYTE*)statusproc, bufsize, &needed);
+    ret = pQueryServiceStatusEx(svc_handle, SC_STATUS_PROCESS_INFO, (BYTE*)statusproc, bufsize, &needed);
     ok(ret, "Expected success, got error %u\n", GetLastError());
     if (statusproc->dwCurrentState == SERVICE_RUNNING)
         ok(statusproc->dwProcessId != 0,




More information about the wine-cvs mailing list