From 922f076616b72e30a07d8f1cd4b2608b1bf9fc06 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sun, 18 Sep 2011 12:33:38 +0000 Subject: [PATCH] [win32k] - Fix several issues detected by static code analysis svn path=/trunk/; revision=53732 --- .../subsystems/win32/win32k/ntuser/message.c | 17 +++++--- .../subsystems/win32/win32k/ntuser/window.c | 26 ++++++------ .../subsystems/win32/win32k/ntuser/winpos.c | 41 ++++++++++++++----- 3 files changed, 56 insertions(+), 28 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index fbb21929f3d..d9e5d79ac03 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -334,6 +334,11 @@ PackParam(LPARAM *lParamPacked, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL Non return STATUS_SUCCESS; } PackedData = ExAllocatePoolWithTag(NonPagedPool, size, TAG_MSG); + if (PackedData == NULL) + { + ERR("Not enough memory to pack lParam\n"); + return STATUS_NO_MEMORY; + } RtlCopyMemory(PackedData, (PVOID)lParam, MsgMemorySize(MsgMemoryEntry, wParam, lParam)); *lParamPacked = (LPARAM)PackedData; } @@ -375,6 +380,7 @@ UnpackParam(LPARAM lParamPacked, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL No { PMSGMEMORY MsgMemoryEntry; MsgMemoryEntry = FindMsgMemory(Msg); + ASSERT(MsgMemoryEntry); if (MsgMemoryEntry->Size < 0) { /* Keep previous behavior */ @@ -587,7 +593,7 @@ IntCallWndProcRet ( PWND Window, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar CWPR.message = Msg; CWPR.wParam = wParam; CWPR.lParam = lParam; - CWPR.lResult = *uResult; + CWPR.lResult = uResult ? (*uResult) : 0; co_HOOK_CallHooks( WH_CALLWNDPROCRET, HC_ACTION, SameThread, (LPARAM)&CWPR ); } @@ -608,7 +614,7 @@ IntDispatchMessage(PMSG pMsg) pti = PsGetCurrentThreadWin32Thread(); - if ( Window->head.pti != pti) + if ( Window && Window->head.pti != pti) { EngSetLastError( ERROR_MESSAGE_SYNC_ONLY ); return 0; @@ -2050,7 +2056,7 @@ NtUserMessageCall( HWND hWnd, { case FNID_DEFWINDOWPROC: /* Validate input */ - if (hWnd && (hWnd != INVALID_HANDLE_VALUE)) + if (hWnd) { Window = UserGetWindowObject(hWnd); if (!Window) @@ -2058,11 +2064,12 @@ NtUserMessageCall( HWND hWnd, UserLeave(); return FALSE; } + UserRefObjectCo(Window, &Ref); } - UserRefObjectCo(Window, &Ref); lResult = IntDefWindowProc(Window, Msg, wParam, lParam, Ansi); Ret = TRUE; - UserDerefObjectCo(Window); + if (hWnd) + UserDerefObjectCo(Window); break; case FNID_SENDNOTIFYMESSAGE: Ret = UserSendNotifyMessage(hWnd, Msg, wParam, lParam); diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 14874b3d106..7a76a95cc7c 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -1591,7 +1591,7 @@ PWND FASTCALL IntCreateWindow(CREATESTRUCTW* Cs, Dialog boxes and message boxes do not inherit layout, so you must set the layout explicitly. */ - if ( Class && Class->fnid != FNID_DIALOG) + if ( Class->fnid != FNID_DIALOG) { PPROCESSINFO ppi = PsGetCurrentProcessWin32Process(); if (ppi->dwLayout & LAYOUT_RTL) @@ -2170,6 +2170,9 @@ co_UserCreateWindowEx(CREATESTRUCTW* Cs, if (Window->ExStyle & WS_EX_MDICHILD) { + ASSERT(ParentWindow); + if(!ParentWindow) + goto cleanup; co_IntSendMessage(UserHMGetHandle(ParentWindow), WM_MDIREFRESHMENU, 0, 0); /* ShowWindow won't activate child windows */ co_WinPosSetWindowPos(Window, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE); @@ -2291,20 +2294,19 @@ NtUserCreateWindowEx( lstrWindowName.Buffer = NULL; lstrClassName.Buffer = NULL; - /* Check if we got a Window name */ - if (plstrWindowName) + ASSERT(plstrWindowName); + + /* Copy the window name to kernel mode */ + Status = ProbeAndCaptureLargeString(&lstrWindowName, plstrWindowName); + if (!NT_SUCCESS(Status)) { - /* Copy the string to kernel mode */ - Status = ProbeAndCaptureLargeString(&lstrWindowName, plstrWindowName); - if (!NT_SUCCESS(Status)) - { - ERR("NtUserCreateWindowEx: failed to capture plstrWindowName\n"); - SetLastNtError(Status); - return NULL; - } - plstrWindowName = &lstrWindowName; + ERR("NtUserCreateWindowEx: failed to capture plstrWindowName\n"); + SetLastNtError(Status); + return NULL; } + plstrWindowName = &lstrWindowName; + /* Check if the class is an atom */ if (IS_ATOM(plstrClassName)) { diff --git a/reactos/subsystems/win32/win32k/ntuser/winpos.c b/reactos/subsystems/win32/win32k/ntuser/winpos.c index eb9f132fe56..6f4813b701e 100644 --- a/reactos/subsystems/win32/win32k/ntuser/winpos.c +++ b/reactos/subsystems/win32/win32k/ntuser/winpos.c @@ -162,6 +162,12 @@ co_WinPosArrangeIconicWindows(PWND parent) ASSERT_REFS_CO(parent); + /* Check if we found any children */ + if(List == NULL) + { + return 0; + } + IntGetClientRect( parent, &rectParent ); x = rectParent.left; y = rectParent.bottom; @@ -693,15 +699,14 @@ co_WinPosDoWinPosChanging(PWND Window, */ static HWND FASTCALL -WinPosDoOwnedPopups(HWND hWnd, HWND hWndInsertAfter) +WinPosDoOwnedPopups(PWND Window, HWND hWndInsertAfter) { HWND *List = NULL; HWND Owner; LONG Style; - PWND Window ,DesktopWindow, ChildObject; + PWND DesktopWindow, ChildObject; int i; - Window = UserGetWindowObject(hWnd); Owner = Window->spwndOwner ? Window->spwndOwner->head.h : NULL; Style = Window->style; @@ -732,7 +737,7 @@ WinPosDoOwnedPopups(HWND hWnd, HWND hWndInsertAfter) } } } - if (List[i] != hWnd) + if (List[i] != Window->head.h) hWndLocalPrev = List[i]; if (hWndLocalPrev == hWndInsertAfter) break; @@ -757,7 +762,7 @@ WinPosDoOwnedPopups(HWND hWnd, HWND hWndInsertAfter) { PWND Wnd; - if (List[i] == hWnd) + if (List[i] == Window->head.h) break; if (!(Wnd = UserGetWindowObject(List[i]))) @@ -896,11 +901,15 @@ WinPosFixupFlags(WINDOWPOS *WinPos, PWND Wnd) && HWND_NOTOPMOST != WinPos->hwndInsertAfter && HWND_BOTTOM != WinPos->hwndInsertAfter) { - PWND InsAfterWnd, Parent = Wnd->spwndParent; + PWND InsAfterWnd; InsAfterWnd = UserGetWindowObject(WinPos->hwndInsertAfter); + if(!InsAfterWnd) + { + return TRUE; + } - if (InsAfterWnd && UserGetAncestor(InsAfterWnd, GA_PARENT) != Parent) + if (InsAfterWnd->spwndParent != Wnd->spwndParent) { return FALSE; } @@ -995,7 +1004,7 @@ co_WinPosSetWindowPos( SWP_NOZORDER && Ancestor && Ancestor->head.h == IntGetDesktopWindow() ) { - WinPos.hwndInsertAfter = WinPosDoOwnedPopups(WinPos.hwnd, WinPos.hwndInsertAfter); + WinPos.hwndInsertAfter = WinPosDoOwnedPopups(Window, WinPos.hwndInsertAfter); } if (!(WinPos.flags & SWP_NOREDRAW)) @@ -1604,9 +1613,8 @@ co_WinPosSearchChildren( return pwndChild; } } + ExFreePool(List); } - - ExFreePool(List); } *HitTest = co_IntSendMessage(ScopeWin->head.h, WM_NCHITTEST, 0, @@ -1756,17 +1764,28 @@ BOOL FASTCALL IntEndDeferWindowPosEx( HDWP hdwp ) for (i = 0, winpos = pDWP->acvr; res && i < pDWP->ccvr; i++, winpos++) { + PWND pwnd; + USER_REFERENCE_ENTRY Ref; + TRACE("hwnd %p, after %p, %d,%d (%dx%d), flags %08x\n", winpos->pos.hwnd, winpos->pos.hwndInsertAfter, winpos->pos.x, winpos->pos.y, winpos->pos.cx, winpos->pos.cy, winpos->pos.flags); + + pwnd = UserGetWindowObject(winpos->pos.hwnd); + if(!pwnd) + continue; - res = co_WinPosSetWindowPos( UserGetWindowObject(winpos->pos.hwnd), + UserRefObjectCo(pwnd, &Ref); + + res = co_WinPosSetWindowPos( pwnd, winpos->pos.hwndInsertAfter, winpos->pos.x, winpos->pos.y, winpos->pos.cx, winpos->pos.cy, winpos->pos.flags); + + UserDerefObjectCo(pwnd); } ExFreePoolWithTag(pDWP->acvr, USERTAG_SWP); UserDereferenceObject(pDWP);