[NTOS:CM] Avoid unnecessary ObDereferenceObject when handling an ObInsertObject failu...
authorGleb Surikov <glebs.surikovs@gmail.com>
Sat, 30 Mar 2024 19:10:17 +0000 (21:10 +0200)
committerGitHub <noreply@github.com>
Sat, 30 Mar 2024 19:10:17 +0000 (22:10 +0300)
In case of failure, ObInsertObject itself dereferences the object, so calling ObDereferenceObject one more time in the failure handler is redundant.

- Remove ObDereferenceObject call from CmpCreateRegistryRoot in case ObInsertObject fails.
- Add missing RootKey dereference if CmpCreateRegistryRoot failed to get the key cell (KeyCell).

CORE-17904

ntoskrnl/config/cmsysini.c

index d401c72..a8ddc10 100644 (file)
@@ -1109,7 +1109,11 @@ CmpCreateRegistryRoot(VOID)
     /* Sanity check, and get the key cell */
     ASSERT((&CmiVolatileHive->Hive)->ReleaseCellRoutine == NULL);
     KeyCell = (PCM_KEY_NODE)HvGetCell(&CmiVolatileHive->Hive, RootIndex);
-    if (!KeyCell) return FALSE;
+    if (!KeyCell)
+    {
+        ObDereferenceObject(RootKey);
+        return FALSE;
+    }
 
     /* Create the KCB */
     RtlInitUnicodeString(&KeyName, L"\\REGISTRY");
@@ -1144,7 +1148,6 @@ CmpCreateRegistryRoot(VOID)
                             &CmpRegistryRootHandle);
     if (!NT_SUCCESS(Status))
     {
-        ObDereferenceObject(RootKey);
         return FALSE;
     }