don't touch the key handle in NtOpenKey in failure cases
Modified: trunk/reactos/ntoskrnl/cm/ntfunc.c
_____
Modified: trunk/reactos/ntoskrnl/cm/ntfunc.c
--- trunk/reactos/ntoskrnl/cm/ntfunc.c 2005-12-10 16:38:04 UTC (rev
20038)
+++ trunk/reactos/ntoskrnl/cm/ntfunc.c 2005-12-10 17:00:54 UTC (rev
20039)
@@ -1256,7 +1256,7 @@
UNICODE_STRING RemainingPath;
KPROCESSOR_MODE PreviousMode;
PVOID Object = NULL;
- HANDLE hKey;
+ HANDLE hKey = NULL;
NTSTATUS Status = STATUS_SUCCESS;
UNICODE_STRING ObjectName;
OBJECT_CREATE_INFORMATION ObjectCreateInfo;
@@ -1333,8 +1333,7 @@
if (!NT_SUCCESS(Status))
{
DPRINT("CmpFindObject() returned 0x%08lx\n", Status);
- Status = STATUS_INVALID_HANDLE; /* Because CmpFindObject returns
STATUS_UNSUCCESSFUL */
- hKey = *KeyHandle; /* Preserve hkResult value */
+ Status = STATUS_INVALID_HANDLE; /* Because ObFindObject returns
STATUS_UNSUCCESSFUL */
goto openkey_cleanup;
}
@@ -1346,7 +1345,6 @@
{
RtlFreeUnicodeString(&RemainingPath);
Status = STATUS_OBJECT_NAME_NOT_FOUND;
- hKey = NULL;
goto openkey_cleanup;
}
@@ -1356,7 +1354,6 @@
if (((PKEY_OBJECT)Object)->Flags & KO_MARKED_FOR_DELETE)
{
Status = STATUS_UNSUCCESSFUL;
- hKey = NULL;
goto openkey_cleanup;
}
@@ -1365,9 +1362,6 @@
ObjectCreateInfo.Attributes,
&hKey);
- if (!NT_SUCCESS(Status))
- hKey = NULL;
-
openkey_cleanup:
ObpReleaseCapturedAttributes(&ObjectCreateInfo);
@@ -1381,15 +1375,18 @@
ObDereferenceObject(Object);
}
- _SEH_TRY
+ if (NT_SUCCESS(Status))
{
- *KeyHandle = hKey;
+ _SEH_TRY
+ {
+ *KeyHandle = hKey;
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
}
- _SEH_HANDLE
- {
- Status = _SEH_GetExceptionCode();
- }
- _SEH_END;
return Status;
}