[ros-diffs] [fireball] 42183: - PsLookupProcess/Thread already references the object, so don't reference it yet again! Thaaaaank you Stefan Ginsberg. Fixes a rather big reference leak. See arwinss issue Nr 2.

fireball at svn.reactos.org fireball at svn.reactos.org
Fri Jul 24 23:19:51 CEST 2009


Author: fireball
Date: Fri Jul 24 23:19:50 2009
New Revision: 42183

URL: http://svn.reactos.org/svn/reactos?rev=42183&view=rev
Log:
- PsLookupProcess/Thread already references the object, so don't reference it yet again! Thaaaaank you Stefan Ginsberg. Fixes a rather big reference leak.

See arwinss issue Nr 2.

Modified:
    branches/arwinss/reactos/subsystems/win32/win32k/wine/hook.c
    branches/arwinss/reactos/subsystems/win32/win32k/wine/queue.c
    branches/arwinss/reactos/subsystems/win32/win32k/wine/winstation.c

Modified: branches/arwinss/reactos/subsystems/win32/win32k/wine/hook.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/wine/hook.c?rev=42183&r1=42182&r2=42183&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/wine/hook.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/wine/hook.c [iso-8859-1] Fri Jul 24 23:19:50 2009
@@ -390,21 +390,17 @@
 
     if (!(desktop = get_thread_desktop( current, DESKTOP_HOOKCONTROL ))) return;
 
-    //if (req->pid && !(process = get_process_from_id( req->pid ))) goto done;
     if (req->pid)
     {
         status = PsLookupProcessByProcessId((HANDLE)req->pid, &eprocess);
         if (!NT_SUCCESS(status)) goto done;
-        ObReferenceObjectByPointer(eprocess, 0, NULL, KernelMode);
         process = (PPROCESSINFO)PsGetProcessWin32Process(eprocess);
     }
 
     if (req->tid)
     {
-        //if (!(thread = get_thread_from_id( req->tid ))) goto done;
         status = PsLookupThreadByThreadId((HANDLE)req->tid, &ethread);
         if (!NT_SUCCESS(status)) goto done;
-        ObReferenceObjectByPointer(ethread, 0, NULL, KernelMode);
         thread = (PTHREADINFO)PsGetThreadWin32Thread(ethread);
 
         if (process && process != thread->process)

Modified: branches/arwinss/reactos/subsystems/win32/win32k/wine/queue.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/wine/queue.c?rev=42183&r1=42182&r2=42183&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/wine/queue.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/wine/queue.c [iso-8859-1] Fri Jul 24 23:19:50 2009
@@ -1722,9 +1722,11 @@
 
     status = PsLookupThreadByThreadId((HANDLE)req->id, &ethread);
     if (!NT_SUCCESS(status)) return;
-    if (!(thread = (PTHREADINFO)ethread->Tcb.Win32Thread)) return;
-
-    ObReferenceObjectByPointer(ethread, 0, NULL, KernelMode);
+    if (!(thread = (PTHREADINFO)ethread->Tcb.Win32Thread))
+    {
+        ObDereferenceObject(ethread);
+        return;
+    }
 
     if (!(recv_queue = thread->queue))
     {
@@ -1804,8 +1806,11 @@
         status = PsLookupThreadByThreadId((HANDLE)req->id, &ethread);
         if (!NT_SUCCESS(status)) return;
 
-        if (!(thread = (PTHREADINFO)ethread->Tcb.Win32Thread)) return;
-        ObReferenceObjectByPointer(ethread, 0, NULL, KernelMode);
+        if (!(thread = (PTHREADINFO)ethread->Tcb.Win32Thread))
+        {
+            ObDereferenceObject(ethread);
+            return;
+        }
     }
 
     if (thread && !(recv_queue = thread->queue))
@@ -2113,10 +2118,11 @@
     if (!NT_SUCCESS(status)) return;
 
     status = PsLookupThreadByThreadId((HANDLE)req->tid_to, &ethread_to);
-    if (!NT_SUCCESS(status)) return;
-
-    ObReferenceObjectByPointer(ethread_from, 0, NULL, KernelMode);
-    ObReferenceObjectByPointer(ethread_to, 0, NULL, KernelMode);
+    if (!NT_SUCCESS(status))
+    {
+        ObDereferenceObject(ethread_from);
+        return;
+    }
 
     thread_from = (PTHREADINFO)ethread_from->Tcb.Win32Thread;
     thread_to = (PTHREADINFO)ethread_to->Tcb.Win32Thread;
@@ -2157,9 +2163,11 @@
     {
         status = PsLookupThreadByThreadId((HANDLE)req->tid, &ethread);
         if (!NT_SUCCESS(status)) return;
-        if (!(thread = (PTHREADINFO)ethread->Tcb.Win32Thread)) return;
-        ObReferenceObjectByPointer(ethread, 0, NULL, KernelMode);
-
+        if (!(thread = (PTHREADINFO)ethread->Tcb.Win32Thread))
+        {
+            ObDereferenceObject(ethread);
+            return;
+        }
         input = thread->queue ? thread->queue->input : NULL;
     }
     else input = foreground_input;  /* get the foreground thread info */
@@ -2200,8 +2208,11 @@
 
     status = PsLookupThreadByThreadId((HANDLE)req->tid, &ethread);
     if (!NT_SUCCESS(status)) return;
-    if (!(thread = (PTHREADINFO)ethread->Tcb.Win32Thread)) return;
-    ObReferenceObjectByPointer(ethread, 0, NULL, KernelMode);
+    if (!(thread = (PTHREADINFO)ethread->Tcb.Win32Thread))
+    {
+        ObDereferenceObject(ethread);
+        return;
+    }
 
     input = thread->queue ? thread->queue->input : NULL;
     if (input)
@@ -2223,8 +2234,11 @@
 
     status = PsLookupThreadByThreadId((HANDLE)req->tid, &ethread);
     if (!NT_SUCCESS(status)) return;
-    if (!(thread = (PTHREADINFO)ethread->Tcb.Win32Thread)) return;
-    ObReferenceObjectByPointer(ethread, 0, NULL, KernelMode);
+    if (!(thread = (PTHREADINFO)ethread->Tcb.Win32Thread))
+    {
+        ObDereferenceObject(ethread);
+        return;
+    }
 
     input = thread->queue ? thread->queue->input : NULL;
     if (input)

Modified: branches/arwinss/reactos/subsystems/win32/win32k/wine/winstation.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/wine/winstation.c?rev=42183&r1=42182&r2=42183&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/wine/winstation.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/wine/winstation.c [iso-8859-1] Fri Jul 24 23:19:50 2009
@@ -615,8 +615,11 @@
 
     status = PsLookupThreadByThreadId((HANDLE)req->tid, &ethread);
     if (!NT_SUCCESS(status)) return;
-    if (!(thread = (PTHREADINFO)ethread->Tcb.Win32Thread)) return;
-    ObReferenceObjectByPointer(ethread, 0, NULL, KernelMode);
+    if (!(thread = (PTHREADINFO)ethread->Tcb.Win32Thread))
+    {
+        ObDereferenceObject(ethread);
+        return;
+    }
 
     reply->handle = thread->desktop;
 




More information about the Ros-diffs mailing list