Author: tkreuzer
Date: Thu Jun 5 11:57:27 2008
New Revision: 33860
URL: http://svn.reactos.org/svn/reactos?rev=33860&view=rev
Log:
co_MsqTranslateMouseMessage:
- add a comment about who removes a message from a queue
- fix filter handling (typo)
- correct the callers next list entry, if it might have been deleted. Yes, it's ugly, but the only way I could currently think of without rewriting everything and it was already ugly before. This fixes bug 2317 and some random crashes with FF.
See issue #2317 for more details.
Modified:
trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/nt…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c [iso-8859-1] Thu Jun 5 11:57:27 2008
@@ -262,7 +262,7 @@
BOOL static STDCALL
co_MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, UINT FilterLow, UINT FilterHigh,
PUSER_MESSAGE Message, BOOL Remove, PBOOL Freed,
- PWINDOW_OBJECT ScopeWin, PPOINT ScreenPoint, BOOL FromGlobalQueue)
+ PWINDOW_OBJECT ScopeWin, PPOINT ScreenPoint, BOOL FromGlobalQueue, PLIST_ENTRY *Next)
{
USHORT Msg = Message->Msg.message;
PWINDOW_OBJECT Window = NULL;
@@ -319,6 +319,7 @@
MessageQueue->MouseMoveMsg = NULL;
}
}
+ // when FromGlobalQueue is true, the caller has already removed the Message
ExFreePool(Message);
*Freed = TRUE;
return(FALSE);
@@ -386,7 +387,7 @@
*ScreenPoint = Message->Msg.pt;
if((hWnd != NULL && Window->hSelf != hWnd) ||
- ((FilterLow != 0 || FilterLow != 0) && (Msg < FilterLow || Msg > FilterHigh)))
+ ((FilterLow != 0 || FilterHigh != 0) && (Msg < FilterLow || Msg > FilterHigh)))
{
/* Reject the message because it doesn't match the filter */
@@ -410,6 +411,11 @@
/* delete the old message */
RemoveEntryList(&Window->MessageQueue->MouseMoveMsg->ListEntry);
ExFreePool(Window->MessageQueue->MouseMoveMsg);
+ if (!FromGlobalQueue)
+ {
+ // We might have deleted the next one in our queue, so fix next
+ *Next = Message->ListEntry.Flink;
+ }
}
/* always save a pointer to this WM_MOUSEMOVE message here because we're
sure that the message is in the private queue */
@@ -521,7 +527,7 @@
Accept = co_MsqTranslateMouseMessage(MessageQueue, hWnd, FilterLow, FilterHigh,
Current, Remove, &Freed,
- DesktopWindow, &ScreenPoint, FALSE);
+ DesktopWindow, &ScreenPoint, FALSE, &CurrentEntry);
if (Accept)
{
if (Remove)
@@ -621,7 +627,7 @@
/* Translate the message. */
Accept = co_MsqTranslateMouseMessage(MessageQueue, hWnd, FilterLow, FilterHigh,
Current, Remove, &Freed,
- DesktopWindow, &ScreenPoint, TRUE);
+ DesktopWindow, &ScreenPoint, TRUE, NULL);
if (Accept)
{
/* Check for no more messages in the system queue. */
Author: jimtabor
Date: Wed Jun 4 12:45:18 2008
New Revision: 33857
URL: http://svn.reactos.org/svn/reactos?rev=33857&view=rev
Log:
Sorry, I should have spotted this when I was in here.. I think this takes care of the leak and crash. Wine testing is back with the same errors. So we are good to go.
Modified:
trunk/reactos/subsystems/win32/win32k/objects/pen.c
Modified: trunk/reactos/subsystems/win32/win32k/objects/pen.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ob…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/pen.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/pen.c [iso-8859-1] Wed Jun 4 12:45:18 2008
@@ -95,7 +95,7 @@
// If dwPenStyle is PS_COSMETIC, the width must be set to 1.
if ( !(bOldStylePen) && ((dwPenStyle & PS_TYPE_MASK) == PS_COSMETIC) && ( dwWidth != 1) )
- goto EEXIT;
+ goto ExitCleanup;
switch (dwPenStyle & PS_STYLE_MASK)
{
@@ -109,7 +109,7 @@
case PS_ALTERNATE:
/* PS_ALTERNATE is applicable only for cosmetic pens */
- if ((dwPenStyle & PS_TYPE_MASK) == PS_GEOMETRIC) goto EEXIT;
+ if ((dwPenStyle & PS_TYPE_MASK) == PS_GEOMETRIC) goto ExitCleanup;
PenObject->flAttrs |= GDIBRUSH_IS_BITMAP;
PenObject->hbmPattern = IntGdiCreateBitmap(24, 1, 1, 1, (LPBYTE)PatternAlternate);
break;
@@ -137,7 +137,7 @@
case PS_INSIDEFRAME:
/* FIXME: does it need some additional work? */
/* PS_INSIDEFRAME is applicable only for geometric pens */
- if ((dwPenStyle & PS_TYPE_MASK) == PS_COSMETIC) goto EEXIT;
+ if ((dwPenStyle & PS_TYPE_MASK) == PS_COSMETIC) goto ExitCleanup;
PenObject->flAttrs |= (GDIBRUSH_IS_SOLID|GDIBRUSH_IS_INSIDEFRAME);
break;
@@ -162,7 +162,7 @@
if(all_zero || has_neg)
{
- goto EEXIT;
+ goto ExitCleanup;
}
}
/* FIXME: what style here? */
@@ -175,8 +175,13 @@
PENOBJ_UnlockPen(PenObject);
return hPen;
-EEXIT:
+ExitCleanup:
SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ if (PenObject->pStyle)
+ {
+ ExFreePool(PenObject->pStyle);
+ PenObject->pStyle = NULL;
+ }
PENOBJ_UnlockPen(PenObject);
if (bOldStylePen)
PENOBJ_FreePenByHandle(hPen);
@@ -339,11 +344,6 @@
bOldStylePen,
hBrush);
- if (!hPen && pSafeStyle)
- {
- ExFreePool(pSafeStyle);
- }
-// BRUSH_Cleanup takes care of pSafeStyle when deleteing the pen
return hPen;
}