[SERVICES]
authorThomas Faber <thomas.faber@reactos.org>
Wed, 28 Sep 2011 18:43:35 +0000 (18:43 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Wed, 28 Sep 2011 18:43:35 +0000 (18:43 +0000)
- Minor fixes to ScmAssignNewTag
- Correctly handle an invalid parameter case in RCreateServiceW. Fixes second stage boot under certain circumstances.

svn path=/trunk/; revision=53886

reactos/base/system/services/rpcserver.c

index f920b93..13a8238 100644 (file)
@@ -277,6 +277,9 @@ ScmAssignNewTag(PSERVICE lpService)
     PLIST_ENTRY ServiceEntry;
     PSERVICE CurrentService;
 
+    ASSERT(lpService != NULL);
+    ASSERT(lpService->lpGroup != NULL);
+
     dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
                             L"System\\CurrentControlSet\\Control\\GroupOrderList",
                             0,
@@ -295,7 +298,7 @@ ScmAssignNewTag(PSERVICE lpService)
                                NULL,
                                &cbDataSize);
 
-    if (dwError != ERROR_MORE_DATA)
+    if (dwError != ERROR_SUCCESS && dwError != ERROR_MORE_DATA)
         goto findFreeTag;
 
     pdwGroupTags = HeapAlloc(GetProcessHeap(), 0, cbDataSize);
@@ -315,7 +318,10 @@ ScmAssignNewTag(PSERVICE lpService)
     if (dwError != ERROR_SUCCESS)
         goto findFreeTag;
 
-    dwGroupTagCount = min(pdwGroupTags[0], cbDataSize / sizeof(pdwGroupTags[0]));
+    if (cbDataSize < sizeof(pdwGroupTags[0]))
+        goto findFreeTag;
+
+    dwGroupTagCount = min(pdwGroupTags[0], cbDataSize / sizeof(pdwGroupTags[0]) - 1);
 
 findFreeTag:
     do
@@ -336,6 +342,7 @@ findFreeTag:
         ServiceEntry = lpService->ServiceListEntry.Flink;
         while (ServiceEntry != &lpService->ServiceListEntry)
         {
+            ASSERT(ServiceEntry != NULL);
             CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE, ServiceListEntry);
             if (CurrentService->lpGroup == lpService->lpGroup)
             {
@@ -1961,6 +1968,7 @@ DWORD RCreateServiceW(
     DPRINT("dwErrorControl = %lu\n", dwErrorControl);
     DPRINT("lpBinaryPathName = %S\n", lpBinaryPathName);
     DPRINT("lpLoadOrderGroup = %S\n", lpLoadOrderGroup);
+    DPRINT("lpdwTagId = %p\n", lpdwTagId);
 
     if (ScmShutdown)
         return ERROR_SHUTDOWN_IN_PROGRESS;
@@ -2009,6 +2017,11 @@ DWORD RCreateServiceW(
         return ERROR_INVALID_PARAMETER;
     }
 
+    if (lpdwTagId && (!lpLoadOrderGroup || !*lpLoadOrderGroup))
+    {
+        return ERROR_INVALID_PARAMETER;
+    }
+
     /* Lock the service database exclusively */
     ScmLockDatabaseExclusive();