mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 19:25:51 +00:00
- Fixed releasing of window object in IntValidateParent and NtUserRedrawWindow. Spotted by Thomas Weidenmuller.
- Fixed potencial deadlock in IntPaintWindows. Spotted by Thomas Weidenmuller. svn path=/trunk/; revision=8295
This commit is contained in:
parent
d83db81881
commit
f38fdd47c3
1 changed files with 16 additions and 4 deletions
|
@ -16,7 +16,7 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* $Id: painting.c,v 1.69 2004/02/21 13:51:13 navaraf Exp $
|
||||
* $Id: painting.c,v 1.70 2004/02/21 22:22:26 navaraf Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -87,8 +87,15 @@ IntValidateParent(PWINDOW_OBJECT Child, HRGN ValidRegion)
|
|||
}
|
||||
ExReleaseFastMutex(&ParentWindow->UpdateLock);
|
||||
}
|
||||
IntReleaseWindowObject(ParentWindow);
|
||||
Parent = NtUserGetAncestor(Parent, GA_PARENT);
|
||||
if (ParentWindow)
|
||||
{
|
||||
IntReleaseWindowObject(ParentWindow);
|
||||
Parent = NtUserGetAncestor(Parent, GA_PARENT);
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -103,6 +110,7 @@ IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags)
|
|||
{
|
||||
HDC hDC;
|
||||
HWND hWnd = Window->Self;
|
||||
HRGN TempRegion;
|
||||
|
||||
if (Flags & (RDW_ERASENOW | RDW_UPDATENOW))
|
||||
{
|
||||
|
@ -113,11 +121,12 @@ IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags)
|
|||
{
|
||||
IntValidateParent(Window, Window->NCUpdateRegion);
|
||||
}
|
||||
IntSendMessage(hWnd, WM_NCPAINT, (WPARAM)Window->NCUpdateRegion, 0);
|
||||
TempRegion = Window->NCUpdateRegion;
|
||||
Window->NCUpdateRegion = NULL;
|
||||
Window->Flags &= ~WINDOWOBJECT_NEED_NCPAINT;
|
||||
MsqDecPaintCountQueue(Window->MessageQueue);
|
||||
ExReleaseFastMutex(&Window->UpdateLock);
|
||||
IntSendMessage(hWnd, WM_NCPAINT, (WPARAM)TempRegion, 0);
|
||||
}
|
||||
|
||||
if (Window->Flags & WINDOWOBJECT_NEED_ERASEBKGND)
|
||||
|
@ -912,6 +921,7 @@ NtUserRedrawWindow(HWND hWnd, CONST RECT *lprcUpdate, HRGN hrgnUpdate,
|
|||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
||||
IntReleaseWindowObject(Wnd);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
@ -923,9 +933,11 @@ NtUserRedrawWindow(HWND hWnd, CONST RECT *lprcUpdate, HRGN hrgnUpdate,
|
|||
{
|
||||
/* IntRedrawWindow fails only in case that flags are invalid */
|
||||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
||||
IntReleaseWindowObject(Wnd);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
IntReleaseWindowObject(Wnd);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue