From: Fabian Maurer Subject: [PATCH v3] user32: Always release menu item in EnableMenuItem Message-Id: <20180622183217.15997-1-dark.shadow4@web.de> Date: Fri, 22 Jun 2018 20:32:17 +0200 The menu must be release on all code-paths, else the underlying lock will never be released. Fixes bug 45355. Signed-off-by: Fabian Maurer --- dlls/user32/menu.c | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c index 8c541cc4f91..ab1ae9bc1bd 100644 --- a/dlls/user32/menu.c +++ b/dlls/user32/menu.c @@ -3741,28 +3741,25 @@ BOOL WINAPI EnableMenuItem( HMENU hMenu, UINT id, UINT wFlags ) item->fState ^= (oldflags ^ wFlags) & (MF_GRAYED | MF_DISABLED); /* If the close item in the system menu change update the close button */ - if ((item->wID == SC_CLOSE) && (oldflags != wFlags)) + if ((item->wID == SC_CLOSE) && (oldflags != wFlags) && menu->hSysMenuOwner) { - if (menu->hSysMenuOwner) - { - RECT rc; - POPUPMENU* parentMenu; - HWND hwnd; + RECT rc; + POPUPMENU* parentMenu; + HWND hwnd; - /* Get the parent menu to access*/ - parentMenu = grab_menu_ptr(menu->hSysMenuOwner); - release_menu_ptr(menu); - if (!parentMenu) - return (UINT)-1; + /* Get the parent menu to access */ + parentMenu = grab_menu_ptr(menu->hSysMenuOwner); + release_menu_ptr(menu); + if (!parentMenu) + return (UINT)-1; - hwnd = parentMenu->hWnd; - release_menu_ptr(parentMenu); + hwnd = parentMenu->hWnd; + release_menu_ptr(parentMenu); - /* Refresh the frame to reflect the change */ - WIN_GetRectangles( hwnd, COORDS_CLIENT, &rc, NULL ); - rc.bottom = 0; - RedrawWindow(hwnd, &rc, 0, RDW_FRAME | RDW_INVALIDATE | RDW_NOCHILDREN); - } + /* Refresh the frame to reflect the change */ + WIN_GetRectangles(hwnd, COORDS_CLIENT, &rc, NULL); + rc.bottom = 0; + RedrawWindow(hwnd, &rc, 0, RDW_FRAME | RDW_INVALIDATE | RDW_NOCHILDREN); } else release_menu_ptr(menu); -- 2.18.0