Aric Stewart : imm: Ensure hCompStr handle is not NULL and check for empty composition strings properly .

Alexandre Julliard julliard at winehq.org
Sat Feb 16 09:57:36 CST 2008


Module: wine
Branch: master
Commit: fd67f32ee38d5d3fc49f301f22a60f9cfce41db9
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=fd67f32ee38d5d3fc49f301f22a60f9cfce41db9

Author: Aric Stewart <aric at codeweavers.com>
Date:   Fri Feb 15 13:22:28 2008 -0600

imm: Ensure hCompStr handle is not NULL and check for empty composition strings properly.

---

 dlls/imm32/imm.c |   24 +++++++++++++++++++++---
 1 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c
index 78c61ce..6b4e288 100644
--- a/dlls/imm32/imm.c
+++ b/dlls/imm32/imm.c
@@ -194,6 +194,18 @@ static LRESULT ImmInternalSendIMENotify(WPARAM notify, LPARAM lParam)
     return 0;
 }
 
+static HIMCC ImmCreateBlankCompStr(void)
+{
+    HIMCC rc;
+    LPCOMPOSITIONSTRING ptr;
+    rc = ImmCreateIMCC(sizeof(COMPOSITIONSTRING));
+    ptr = (LPCOMPOSITIONSTRING)ImmLockIMCC(rc);
+    memset(ptr,0,sizeof(COMPOSITIONSTRING));
+    ptr->dwSize = sizeof(COMPOSITIONSTRING);
+    ImmUnlockIMCC(rc);
+    return rc;
+}
+
 static void ImmInternalSetOpenStatus(BOOL fOpen)
 {
     TRACE("Setting internal state to %s\n",(fOpen)?"OPEN":"CLOSED");
@@ -202,7 +214,7 @@ static void ImmInternalSetOpenStatus(BOOL fOpen)
     {
         ShowWindow(hwndDefault,SW_HIDE);
         ImmDestroyIMCC(root_context->IMC.hCompStr);
-        root_context->IMC.hCompStr = NULL;
+        root_context->IMC.hCompStr = ImmCreateBlankCompStr();
     }
 
     root_context->IMC.fOpen = fOpen;
@@ -597,6 +609,9 @@ HIMC WINAPI ImmCreateContext(void)
 
     new_context = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(InputContextData));
 
+    /* hCompStr is never NULL */
+    new_context->IMC.hCompStr = ImmCreateBlankCompStr();
+
     return (HIMC)new_context;
 }
 
@@ -1411,14 +1426,17 @@ BOOL WINAPI ImmNotifyIME(
                     TRACE("%s - %s\n","NI_COMPOSITIONSTR","CPS_CANCEL");
                     {
                         BOOL send;
+                        LPCOMPOSITIONSTRING lpCompStr;
 
                         if (pX11DRV_ForceXIMReset)
                             pX11DRV_ForceXIMReset(root_context->IMC.hWnd);
 
-                        send = (root_context->IMC.hCompStr!=NULL);
+                        lpCompStr = ImmLockIMCC(root_context->IMC.hCompStr);
+                        send = (lpCompStr->dwCompStrLen != 0);
+                        ImmUnlockIMCC(root_context->IMC.hCompStr);
 
                         ImmDestroyIMCC(root_context->IMC.hCompStr);
-                        root_context->IMC.hCompStr = NULL;
+                        root_context->IMC.hCompStr = ImmCreateBlankCompStr();
 
                         if (send)
                             ImmInternalPostIMEMessage(WM_IME_COMPOSITION, 0,




More information about the wine-cvs mailing list