Fix merge r65567.
[reactos.git] / ntoskrnl / ob / oblife.c
index 636130b..1edc2ff 100644 (file)
@@ -1145,7 +1145,7 @@ ObCreateObjectType(IN PUNICODE_STRING TypeName,
 
             /* Set the key and free the converted name */
             LocalObjectType->Key = *(PULONG)AnsiName.Buffer;
-            ExFreePool(AnsiName.Buffer);
+            RtlFreeAnsiString(&AnsiName);
         }
         else
         {
@@ -1227,15 +1227,25 @@ ObCreateObjectType(IN PUNICODE_STRING TypeName,
     InitializeListHead(&LocalObjectType->TypeList);
 
     /* Lock the object type */
-    ObpEnterObjectTypeMutex(LocalObjectType);
+    ObpEnterObjectTypeMutex(ObpTypeObjectType);
 
     /* Get creator info and insert it into the type list */
     CreatorInfo = OBJECT_HEADER_TO_CREATOR_INFO(Header);
-    if (CreatorInfo) InsertTailList(&ObpTypeObjectType->TypeList,
-                                    &CreatorInfo->TypeList);
+    if (CreatorInfo)
+    {
+        InsertTailList(&ObpTypeObjectType->TypeList,
+                       &CreatorInfo->TypeList);
+
+        /* CORE-8423: Avoid inserting this a second time if someone creates a
+         * handle to the object type (bug in Windows 2003) */
+        Header->Flags &= ~OB_FLAG_CREATE_INFO;
+    }
 
     /* Set the index and the entry into the object type array */
     LocalObjectType->Index = ObpTypeObjectType->TotalNumberOfObjects;
+
+    NT_ASSERT(LocalObjectType->Index != 0);
+
     if (LocalObjectType->Index < 32)
     {
         /* It fits, insert it */
@@ -1243,7 +1253,7 @@ ObCreateObjectType(IN PUNICODE_STRING TypeName,
     }
 
     /* Release the object type */
-    ObpLeaveObjectTypeMutex(LocalObjectType);
+    ObpLeaveObjectTypeMutex(ObpTypeObjectType);
 
     /* Check if we're actually creating the directory object itself */
     if (!(ObpTypeDirectoryObject) ||
@@ -1269,6 +1279,24 @@ ObCreateObjectType(IN PUNICODE_STRING TypeName,
     return STATUS_INSUFFICIENT_RESOURCES;
 }
 
+VOID
+NTAPI
+ObDeleteCapturedInsertInfo(IN PVOID Object)
+{
+    POBJECT_HEADER ObjectHeader;
+    PAGED_CODE();
+
+    /* Check if there is anything to free */
+    ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object);
+    if ((ObjectHeader->Flags & OB_FLAG_CREATE_INFO) &&
+        (ObjectHeader->ObjectCreateInfo != NULL))
+    {
+        /* Free the create info */
+        ObpFreeObjectCreateInformation(ObjectHeader->ObjectCreateInfo);
+        ObjectHeader->ObjectCreateInfo = NULL;
+    }
+}
+
 VOID
 NTAPI
 ObpDeleteObjectType(IN PVOID Object)
@@ -1664,14 +1692,14 @@ NtSetInformationObject(IN HANDLE ObjectHandle,
     switch (ObjectInformationClass)
     {
         case ObjectHandleFlagInformation:
-        
+
             /* Validate the length */
             if (Length != sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION))
             {
                 /* Invalid length */
                 return STATUS_INFO_LENGTH_MISMATCH;
             }
-            
+
             /* Save the previous mode */
             Context.PreviousMode = ExGetPreviousMode();
 
@@ -1703,7 +1731,7 @@ NtSetInformationObject(IN HANDLE ObjectHandle,
             }
 
             /* Check if this is a kernel handle */
-            if (ObIsKernelHandle(ObjectHandle, Context.PreviousMode))
+            if (ObpIsKernelHandle(ObjectHandle, Context.PreviousMode))
             {
                 /* Get the actual handle */
                 ObjectHandle = ObKernelHandleToHandle(ObjectHandle);
@@ -1741,9 +1769,9 @@ NtSetInformationObject(IN HANDLE ObjectHandle,
             /* De-attach if we were attached, and return status */
             if (AttachedToProcess) KeUnstackDetachProcess(&ApcState);
             break;
-        
+
         case ObjectSessionInformation:
-        
+
             /* Only a system process can do this */
             PreviousMode = ExGetPreviousMode();
             if (!SeSinglePrivilegeCheck(SeTcbPrivilege, PreviousMode))
@@ -1755,8 +1783,8 @@ NtSetInformationObject(IN HANDLE ObjectHandle,
             else
             {
                 /* Get the object directory */
-                Status = ObReferenceObjectByHandle(ObjectHandle, 
-                                                   0, 
+                Status = ObReferenceObjectByHandle(ObjectHandle,
+                                                   0,
                                                    ObDirectoryType,
                                                    PreviousMode,
                                                    (PVOID*)&Directory,
@@ -1770,7 +1798,7 @@ NtSetInformationObject(IN HANDLE ObjectHandle,
                 }
             }
             break;
-        
+
         default:
             /* Unsupported class */
             Status = STATUS_INVALID_INFO_CLASS;