diff --git a/reactos/ntoskrnl/io/create.c b/reactos/ntoskrnl/io/create.c index 4fae8a52dcc..a31ee49f429 100644 --- a/reactos/ntoskrnl/io/create.c +++ b/reactos/ntoskrnl/io/create.c @@ -67,7 +67,11 @@ NTSTATUS IopCreateFile(PVOID ObjectBody, DPRINT("DeviceObject was NULL\n"); return(STATUS_SUCCESS); } - + if( BODY_TO_HEADER( Parent )->ObjectType != IoDeviceType ) + { + DPRINT( "Parent is not a device type\n" ); + return STATUS_UNSUCCESSFUL; + } Status = ObReferenceObjectByPointer(DeviceObject, STANDARD_RIGHTS_REQUIRED, IoDeviceType, diff --git a/reactos/ntoskrnl/ob/object.c b/reactos/ntoskrnl/ob/object.c index 93b822ba0bc..db62a60ac58 100644 --- a/reactos/ntoskrnl/ob/object.c +++ b/reactos/ntoskrnl/ob/object.c @@ -176,7 +176,10 @@ PVOID ObCreateObject(PHANDLE Handle, ObjectAttributes); if (!NT_SUCCESS(Status)) { - return(NULL); + ObDereferenceObject( Parent ); + RtlFreeUnicodeString( &Header->Name ); + ExFreePool( Header ); + return(NULL); } } return(HEADER_TO_BODY(Header)); @@ -260,6 +263,7 @@ NTSTATUS ObPerformRetentionChecks(POBJECT_HEADER Header) if (Header->Name.Buffer != NULL) { ObRemoveEntry(Header); + RtlFreeUnicodeString( &Header->Name ); } DPRINT("ObPerformRetentionChecks() = Freeing object\n"); ExFreePool(Header);