From 885ca2f7f399b82f10a2f6562582fa2b40f8715b Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sat, 7 Feb 2004 17:30:14 +0000 Subject: [PATCH] - Free or recycle the remaining path string after a call to ObFindObject. svn path=/trunk/; revision=8081 --- reactos/ntoskrnl/cm/ntfunc.c | 20 +++++++++++++++++-- reactos/ntoskrnl/cm/registry.c | 36 ++++++++++++++++++++++------------ 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/reactos/ntoskrnl/cm/ntfunc.c b/reactos/ntoskrnl/cm/ntfunc.c index caf27aa4303..8f4a83555e3 100644 --- a/reactos/ntoskrnl/cm/ntfunc.c +++ b/reactos/ntoskrnl/cm/ntfunc.c @@ -69,6 +69,7 @@ NtCreateKey(OUT PHANDLE KeyHandle, if (((PKEY_OBJECT) Object)->Flags & KO_MARKED_FOR_DELETE) { ObDereferenceObject(Object); + RtlFreeUnicodeString(&RemainingPath); return(STATUS_UNSUCCESSFUL); } @@ -83,6 +84,7 @@ NtCreateKey(OUT PHANDLE KeyHandle, DPRINT("Status %x\n", Status); ObDereferenceObject(Object); + RtlFreeUnicodeString(&RemainingPath); return Status; } @@ -96,6 +98,7 @@ NtCreateKey(OUT PHANDLE KeyHandle, if (End != NULL) { ObDereferenceObject(Object); + RtlFreeUnicodeString(&RemainingPath); return STATUS_OBJECT_NAME_NOT_FOUND; } @@ -124,6 +127,7 @@ NtCreateKey(OUT PHANDLE KeyHandle, if (!NT_SUCCESS(Status)) { ObDereferenceObject(KeyObject); + RtlFreeUnicodeString(&RemainingPath); return(Status); } @@ -159,11 +163,20 @@ NtCreateKey(OUT PHANDLE KeyHandle, KeLeaveCriticalRegion(); ObDereferenceObject(KeyObject); ObDereferenceObject(Object); + RtlFreeUnicodeString(&RemainingPath); return STATUS_UNSUCCESSFUL; } - RtlCreateUnicodeString(&KeyObject->Name, - Start); + if (Start == RemainingPath.Buffer) + { + KeyObject->Name = RemainingPath; + } + else + { + RtlCreateUnicodeString(&KeyObject->Name, + Start); + RtlFreeUnicodeString(&RemainingPath); + } if (KeyObject->RegistryHive == KeyObject->ParentKey->RegistryHive) { @@ -847,9 +860,12 @@ NtOpenKey(OUT PHANDLE KeyHandle, if ((RemainingPath.Buffer != NULL) && (RemainingPath.Buffer[0] != 0)) { ObDereferenceObject(Object); + RtlFreeUnicodeString(&RemainingPath); return STATUS_OBJECT_NAME_NOT_FOUND; } + RtlFreeUnicodeString(&RemainingPath); + /* Fail if the key has been deleted */ if (((PKEY_OBJECT)Object)->Flags & KO_MARKED_FOR_DELETE) { diff --git a/reactos/ntoskrnl/cm/registry.c b/reactos/ntoskrnl/cm/registry.c index bf658cf42cb..1ef39d93d93 100644 --- a/reactos/ntoskrnl/cm/registry.c +++ b/reactos/ntoskrnl/cm/registry.c @@ -1,4 +1,4 @@ -/* $Id: registry.c,v 1.120 2004/01/19 16:18:33 ekohl Exp $ +/* $Id: registry.c,v 1.121 2004/02/07 17:30:14 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -532,6 +532,7 @@ CmiConnectHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes, if ((RemainingPath.Buffer == NULL) || (RemainingPath.Buffer[0] == 0)) { ObDereferenceObject (ParentKey); + RtlFreeUnicodeString(&RemainingPath); return STATUS_OBJECT_NAME_COLLISION; } @@ -544,6 +545,7 @@ CmiConnectHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes, if (wcschr (SubName, L'\\') != NULL) { ObDereferenceObject (ParentKey); + RtlFreeUnicodeString(&RemainingPath); return STATUS_OBJECT_NAME_NOT_FOUND; } @@ -563,6 +565,7 @@ CmiConnectHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes, { DPRINT1 ("ObCreateObject() failed (Status %lx)\n", Status); ObDereferenceObject (ParentKey); + RtlFreeUnicodeString(&RemainingPath); return Status; } @@ -572,28 +575,37 @@ CmiConnectHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes, NewKey->Flags = 0; NewKey->NumberOfSubKeys = 0; NewKey->SubKeys = ExAllocatePool(PagedPool, - NewKey->KeyCell->NumberOfSubKeys * sizeof(ULONG)); + NewKey->KeyCell->NumberOfSubKeys * sizeof(ULONG)); if ((NewKey->SubKeys == NULL) && (NewKey->KeyCell->NumberOfSubKeys != 0)) { DPRINT("NumberOfSubKeys %d\n", NewKey->KeyCell->NumberOfSubKeys); ObDereferenceObject (NewKey); ObDereferenceObject (ParentKey); + RtlFreeUnicodeString(&RemainingPath); return STATUS_INSUFFICIENT_RESOURCES; } - Status = RtlCreateUnicodeString(&NewKey->Name, - SubName); - if (!NT_SUCCESS(Status)) + if (SubName == RemainingPath.Buffer) { - DPRINT1("RtlCreateUnicodeString() failed (Status %lx)\n", Status); - if (NewKey->SubKeys != NULL) - { - ExFreePool (NewKey->SubKeys); + NewKey->Name = RemainingPath; + } + else + { + Status = RtlCreateUnicodeString(&NewKey->Name, + SubName); + RtlFreeUnicodeString(&RemainingPath); + if (!NT_SUCCESS(Status)) + { + DPRINT1("RtlCreateUnicodeString() failed (Status %lx)\n", Status); + if (NewKey->SubKeys != NULL) + { + ExFreePool (NewKey->SubKeys); + } + ObDereferenceObject (NewKey); + ObDereferenceObject (ParentKey); + return STATUS_INSUFFICIENT_RESOURCES; } - ObDereferenceObject (NewKey); - ObDereferenceObject (ParentKey); - return STATUS_INSUFFICIENT_RESOURCES; } CmiAddKeyToList (ParentKey, NewKey);