From 266c1101b3e0e0297b6062a4d34b2b766b4c9d33 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Fri, 15 Oct 2021 15:26:57 +0200 Subject: [PATCH] imm32: Exit on invalid window in ImmAssociateContext. Signed-off-by: Piotr Caban Signed-off-by: Alexandre Julliard --- dlls/imm32/imm.c | 45 +++++++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c index d933ca06c2f..cbcc70daedf 100644 --- a/dlls/imm32/imm.c +++ b/dlls/imm32/imm.c @@ -583,12 +583,13 @@ BOOL WINAPI ImmSetActiveContext(HWND hwnd, HIMC himc, BOOL activate) */ HIMC WINAPI ImmAssociateContext(HWND hWnd, HIMC hIMC) { - HIMC old = NULL; InputContextData *data = get_imc_data(hIMC); + HIMC defaultContext; + HIMC old; TRACE("(%p, %p):\n", hWnd, hIMC); - if(hIMC && !data) + if (!IsWindow(hWnd) || (hIMC && !data)) return NULL; /* @@ -600,30 +601,26 @@ HIMC WINAPI ImmAssociateContext(HWND hWnd, HIMC hIMC) if (hIMC && IMM_IsCrossThreadAccess(hWnd, hIMC)) return NULL; - if (hWnd) + defaultContext = get_default_context( hWnd ); + old = RemovePropW(hWnd, szwWineIMCProperty); + if (old == NULL) + old = defaultContext; + else if (old == (HIMC)-1) + old = NULL; + + if (hIMC != defaultContext) { - HIMC defaultContext = get_default_context( hWnd ); - old = RemovePropW(hWnd,szwWineIMCProperty); + if (hIMC == NULL) /* Meaning disable imm for that window*/ + SetPropW(hWnd, szwWineIMCProperty, (HANDLE)-1); + else + SetPropW(hWnd, szwWineIMCProperty, hIMC); + } - if (old == NULL) - old = defaultContext; - else if (old == (HIMC)-1) - old = NULL; - - if (hIMC != defaultContext) - { - if (hIMC == NULL) /* Meaning disable imm for that window*/ - SetPropW(hWnd,szwWineIMCProperty,(HANDLE)-1); - else - SetPropW(hWnd,szwWineIMCProperty,hIMC); - } - - if (old) - { - InputContextData *old_data = old; - if (old_data->IMC.hWnd == hWnd) - old_data->IMC.hWnd = NULL; - } + if (old) + { + InputContextData *old_data = old; + if (old_data->IMC.hWnd == hWnd) + old_data->IMC.hWnd = NULL; } if (!hIMC)