- Make ObReferenceObjectEx return the new ref count instead of old ref count.
authorAleksey Bragin <aleksey@reactos.org>
Fri, 22 May 2009 17:19:27 +0000 (17:19 +0000)
committerAleksey Bragin <aleksey@reactos.org>
Fri, 22 May 2009 17:19:27 +0000 (17:19 +0000)
- Fix same bug ObDereferenceObjectEx.
- Fix a typo in ObDereferenceObjectEx which resulted in ObpDeferObjectDeletion not being called when needed. Fixes missing object deletions in ObDereferenceObjectEx-using code (e.g. executive timers in reactos kernel).
- Original problem found by http://www.reactos.org/forum/viewtopic.php?f=14&t=6969&p=59669, fixes inspired by the discussion too.

svn path=/trunk/; revision=41043

reactos/ntoskrnl/ob/obref.c

index 0c66bfc..f86a905 100644 (file)
@@ -80,7 +80,7 @@ ObReferenceObjectEx(IN PVOID Object,
     /* Increment the reference count and return the count now */
     return InterlockedExchangeAdd(&OBJECT_TO_OBJECT_HEADER(Object)->
                                   PointerCount,
-                                  Count);
+                                  Count) + Count;
 }
 
 LONG
@@ -95,8 +95,8 @@ ObDereferenceObjectEx(IN PVOID Object,
     Header = OBJECT_TO_OBJECT_HEADER(Object);
 
     /* Check whether the object can now be deleted. */
-    NewCount = InterlockedExchangeAdd(&Header->PointerCount, -Count);
-    if (!Count) ObpDeferObjectDeletion(Header);
+    NewCount = InterlockedExchangeAdd(&Header->PointerCount, -Count) - Count;
+    if (!NewCount) ObpDeferObjectDeletion(Header);
 
     /* Return the current count */
     return NewCount;