[NTOSKRNL]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Tue, 4 Nov 2014 20:41:10 +0000 (20:41 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Tue, 4 Nov 2014 20:41:10 +0000 (20:41 +0000)
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!

svn path=/trunk/; revision=65254

reactos/ntoskrnl/ob/obsecure.c

index 15395b7..3009c44 100644 (file)
@@ -144,61 +144,54 @@ ObSetSecurityDescriptorInfo(IN PVOID Object,
                                              &NewDescriptor,
                                              PoolType,
                                              GenericMapping);
-        if (NT_SUCCESS(Status))
+        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;
-            }
+            /* We failed, dereference the old one */
+            if (OldDescriptor) ObDereferenceSecurityDescriptor(OldDescriptor, 1);
+            break;
         }
-        else
+
+        /* 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 */
-            if (OldDescriptor) ObDereferenceSecurityDescriptor(OldDescriptor, 1);
+            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);
+        }
     }
 
     /* Return status */