Author: tfaber
Date: Sun Apr  5 08:58:08 2015
New Revision: 67059

URL: http://svn.reactos.org/svn/reactos?rev=67059&view=rev
Log:
[SERVICES]
- Free unknown groups when their reference count reaches zero
CORE-9480 #resolve

Modified:
    trunk/reactos/base/system/services/database.c
    trunk/reactos/base/system/services/groupdb.c

Modified: trunk/reactos/base/system/services/database.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/services/database.c?rev=67059&r1=67058&r2=67059&view=diff
==============================================================================
--- trunk/reactos/base/system/services/database.c       [iso-8859-1] (original)
+++ trunk/reactos/base/system/services/database.c       [iso-8859-1] Sun Apr  5 
08:58:08 2015
@@ -416,8 +416,7 @@
         ScmDereferenceServiceImage(lpService->lpImage);
 
     /* Decrement the group reference counter */
-    if (lpService->lpGroup)
-        lpService->lpGroup->dwRefCount--;
+    ScmSetServiceGroup(lpService, NULL);
 
     /* FIXME: SecurityDescriptor */
 

Modified: trunk/reactos/base/system/services/groupdb.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/services/groupdb.c?rev=67059&r1=67058&r2=67059&view=diff
==============================================================================
--- trunk/reactos/base/system/services/groupdb.c        [iso-8859-1] (original)
+++ trunk/reactos/base/system/services/groupdb.c        [iso-8859-1] Sun Apr  5 
08:58:08 2015
@@ -33,10 +33,25 @@
 
     if (lpService->lpGroup != NULL)
     {
-        lpService->lpGroup->dwRefCount--;
-
-        /* FIXME: What do we have to do when dwRefCount is 0? */
-    }
+        ASSERT(lpService->lpGroup->dwRefCount != 0);
+        ASSERT(lpService->lpGroup->dwRefCount == (DWORD)-1 ||
+               lpService->lpGroup->dwRefCount < 10000);
+        if (lpService->lpGroup->dwRefCount != (DWORD)-1)
+        {
+            lpService->lpGroup->dwRefCount--;
+            if (lpService->lpGroup->dwRefCount == 0)
+            {
+                ASSERT(lpService->lpGroup->TagCount == 0);
+                ASSERT(lpService->lpGroup->TagArray == NULL);
+                RemoveEntryList(&lpService->lpGroup->GroupListEntry);
+                HeapFree(GetProcessHeap(), 0, lpService->lpGroup);
+                lpService->lpGroup = NULL;
+            }
+        }
+    }
+
+    if (lpGroupName == NULL)
+        return ERROR_SUCCESS;
 
     GroupEntry = GroupListHead.Flink;
     while (GroupEntry != &GroupListHead)


Reply via email to