Fixed crash when accessing sysmenu.
diff --git a/controls/menu.c b/controls/menu.c
index 4b2beb8..c076f2e 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -3783,6 +3783,7 @@
HMENU WINAPI GetSystemMenu( HWND hWnd, BOOL bRevert )
{
WND *wndPtr = WIN_FindWndPtr( hWnd );
+ HMENU retvalue = 0;
if (wndPtr)
{
@@ -3797,8 +3798,17 @@
{
POPUPMENU *menu = (POPUPMENU*)
USER_HEAP_LIN_ADDR(wndPtr->hSysMenu);
- if( menu->nItems > 0 && menu->items[0].hSubMenu == MENU_DefSysPopup )
- menu->items[0].hSubMenu = MENU_CopySysPopup();
+ if( IS_A_MENU(menu) )
+ {
+ if( menu->nItems > 0 && menu->items[0].hSubMenu == MENU_DefSysPopup )
+ menu->items[0].hSubMenu = MENU_CopySysPopup();
+ }
+ else
+ {
+ WARN("Current sys-menu (%04x) of wnd %04x is broken\n",
+ wndPtr->hSysMenu, hWnd);
+ wndPtr->hSysMenu = 0;
+ }
}
}
@@ -3807,19 +3817,18 @@
if( wndPtr->hSysMenu )
{
- HMENU retvalue = GetSubMenu16(wndPtr->hSysMenu, 0);
+ POPUPMENU *menu;
+ retvalue = GetSubMenu16(wndPtr->hSysMenu, 0);
/* Store the dummy sysmenu handle to facilitate the refresh */
/* of the close button if the SC_CLOSE item change */
- POPUPMENU *menu = (POPUPMENU*) USER_HEAP_LIN_ADDR(retvalue);
- menu->hSysMenuOwner = wndPtr->hSysMenu;
-
- WIN_ReleaseWndPtr(wndPtr);
- return retvalue;
+ menu = (POPUPMENU*) USER_HEAP_LIN_ADDR(retvalue);
+ if ( IS_A_MENU(menu) )
+ menu->hSysMenuOwner = wndPtr->hSysMenu;
}
WIN_ReleaseWndPtr(wndPtr);
}
- return 0;
+ return retvalue;
}