Author: tkreuzer
Date: Tue Nov 4 20:41:10 2014
New Revision: 65254
URL:
http://svn.reactos.org/svn/reactos?rev=65254&view=rev
Log:
[NTOSKRNL]
Merge r62304 and r65253 from kernel-fun branch:
Fix logic in ObSetSecurityDescriptorInfo. To understand the change: it is not only style
change! The old code modified SecurityDescriptor, which must always stay the same in the
loop!
Modified:
trunk/reactos/ (props changed)
trunk/reactos/ntoskrnl/ob/obsecure.c
Propchange: trunk/reactos/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Nov 4 20:41:10 2014
@@ -6,6 +6,7 @@
/branches/condrv_restructure:63104-64101
/branches/header-work:45691-47721
/branches/kd++:58883-58973
+/branches/kernel-fun/reactos:62304,65253
/branches/ntvdm:59241-63176
/branches/reactos-yarotows:45219-46371,46373-48025,48027-49273
/branches/reactx/reactos:49994-49995
Modified: trunk/reactos/ntoskrnl/ob/obsecure.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ob/obsecure.c?rev…
==============================================================================
--- trunk/reactos/ntoskrnl/ob/obsecure.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ob/obsecure.c [iso-8859-1] Tue Nov 4 20:41:10 2014
@@ -144,60 +144,53 @@
&NewDescriptor,
PoolType,
GenericMapping);
- if (NT_SUCCESS(Status))
- {
- /* Now add this to the cache */
- Status = ObLogSecurityDescriptor(NewDescriptor,
- &CachedDescriptor,
- MAX_FAST_REFS + 1);
-
- /* Let go of our uncached copy */
- ExFreePool(NewDescriptor);
-
- /* Check for success */
- if (NT_SUCCESS(Status))
- {
- /* Do the swap */
- FastRef = (PEX_FAST_REF)OutputSecurityDescriptor;
- OldValue = ExCompareSwapFastReference(FastRef,
- CachedDescriptor,
- OldDescriptor);
-
- /* Get the security descriptor */
- SecurityDescriptor = ExGetObjectFastReference(OldValue);
- Count = ExGetCountFastReference(OldValue);
-
- /* Make sure the swap worked */
- if (SecurityDescriptor == OldDescriptor)
- {
- /* Flush waiters */
- ObpAcquireObjectLock(ObjectHeader);
- ObpReleaseObjectLock(ObjectHeader);
-
- /* And dereference the old one */
- ObDereferenceSecurityDescriptor(OldDescriptor, Count + 2);
- break;
- }
- else
- {
- /* Someone changed it behind our back -- try again */
- ObDereferenceSecurityDescriptor(OldDescriptor, 1);
- ObDereferenceSecurityDescriptor(CachedDescriptor,
- MAX_FAST_REFS + 1);
- }
- }
- else
- {
- /* We failed, dereference the old one */
- ObDereferenceSecurityDescriptor(OldDescriptor, 1);
- break;
- }
- }
- else
+ if (!NT_SUCCESS(Status))
{
/* We failed, dereference the old one */
if (OldDescriptor) ObDereferenceSecurityDescriptor(OldDescriptor, 1);
break;
+ }
+
+ /* Now add this to the cache */
+ Status = ObLogSecurityDescriptor(NewDescriptor,
+ &CachedDescriptor,
+ MAX_FAST_REFS + 1);
+
+ /* Let go of our uncached copy */
+ ExFreePool(NewDescriptor);
+
+ /* Check for success */
+ if (!NT_SUCCESS(Status))
+ {
+ /* We failed, dereference the old one */
+ ObDereferenceSecurityDescriptor(OldDescriptor, 1);
+ break;
+ }
+
+ /* Do the swap */
+ FastRef = (PEX_FAST_REF)OutputSecurityDescriptor;
+ OldValue = ExCompareSwapFastReference(FastRef,
+ CachedDescriptor,
+ OldDescriptor);
+
+ /* Make sure the swap worked */
+ if (ExGetObjectFastReference(OldValue) == OldDescriptor)
+ {
+ /* Flush waiters */
+ ObpAcquireObjectLock(ObjectHeader);
+ ObpReleaseObjectLock(ObjectHeader);
+
+ /* And dereference the old one */
+ Count = ExGetCountFastReference(OldValue);
+ ObDereferenceSecurityDescriptor(OldDescriptor, Count + 2);
+ break;
+ }
+ else
+ {
+ /* Someone changed it behind our back -- try again */
+ ObDereferenceSecurityDescriptor(OldDescriptor, 1);
+ ObDereferenceSecurityDescriptor(CachedDescriptor,
+ MAX_FAST_REFS + 1);
}
}