zmike pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=fa562828b8d08fa4e6902b061e8bb8bda430b8a7

commit fa562828b8d08fa4e6902b061e8bb8bda430b8a7
Author: Vincent Torri <[email protected]>
Date:   Tue Feb 25 10:27:14 2020 -0500

    Ecore_Win32: free 'compose' field when needed, fix memory leak
    
    Reviewers: raster, zmike
    
    Reviewed By: zmike
    
    Subscribers: cedric, #reviewers, #committers
    
    Tags: #efl
    
    Differential Revision: https://phab.enlightenment.org/D11415
---
 src/lib/ecore_win32/ecore_win32_event.c | 47 ++++++++++++++++++++++-----------
 1 file changed, 32 insertions(+), 15 deletions(-)

diff --git a/src/lib/ecore_win32/ecore_win32_event.c 
b/src/lib/ecore_win32/ecore_win32_event.c
index c2e9200580..0c232e7bc3 100644
--- a/src/lib/ecore_win32/ecore_win32_event.c
+++ b/src/lib/ecore_win32/ecore_win32_event.c
@@ -273,7 +273,8 @@ _ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data 
*msg,
    char string[2] = { 0, 0 };
    const char *keyname = NULL;
    const char *key = NULL;
-   const char *compose = NULL;
+   char *compose = NULL;
+   unsigned char free_compose = 0;
 
    switch (msg->window_param)
      {
@@ -1178,12 +1179,16 @@ 
_ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg,
              {
                 /* dead key, but managed like normal key */
                 compose = evil_utf16_to_utf8(buf);
+                free_compose = 1;
              }
            else if (res == 0)
              {
                 INF("No translatable character found, skipping");
                 if (msg->window_param >= 0x30 && msg->window_param <= 0x39)
-                  compose = evil_utf16_to_utf8(buf);
+                  {
+                     compose = evil_utf16_to_utf8(buf);
+                     free_compose = 1;
+                  }
                 /* otherwise, compose is NULL */
              }
            else if (res >= 2)
@@ -1197,11 +1202,17 @@ 
_ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg,
                                 MapVirtualKey(msg->window_param, 
MAPVK_VK_TO_CHAR),
                                 kbd_state, buf, 4, 0);
                 if (!((res != 1) && (res != -1)))
-                  compose = evil_utf16_to_utf8(buf);
+                  {
+                     compose = evil_utf16_to_utf8(buf);
+                     free_compose = 1;
+                  }
                 /* otherwise, compose is NULL */
              }
            else /* res == 1 : 1 char written to buf */
-             compose = evil_utf16_to_utf8(buf);
+             {
+                compose = evil_utf16_to_utf8(buf);
+                free_compose = 1;
+             }
 
            /*** key field ***/
 
@@ -1214,7 +1225,7 @@ 
_ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg,
                 _ecore_win32_modifiers_ctrl_save(kbd_state, &modifiers_save);
 
                 if (!SetKeyboardState(kbd_state))
-                  return NULL;
+                  goto _free_compose;
              }
 
            is_dead_key = EINA_FALSE;
@@ -1246,7 +1257,7 @@ 
_ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg,
                 if (res == -1)
                   is_dead_key = EINA_TRUE;
                 if ((res != 1) && (res != -1))
-                  return NULL;
+                  goto _free_compose;
              }
 
            if (is_dead_key)
@@ -1264,13 +1275,13 @@ 
_ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg,
                 _ecore_win32_modifiers_ctrl_restore(kbd_state, modifiers_save);
 
                 if (!SetKeyboardState(kbd_state))
-                  return NULL;
+                  goto _free_compose;
              }
 
            if (!key)
              {
                 WRN("no keysym found for keycode %d\n", string[0]);
-                return NULL;
+                goto _free_compose;
              }
 
            /*** keyname field ***/
@@ -1284,7 +1295,7 @@ 
_ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg,
            _ecore_win32_modifiers_win_save(kbd_state, &modifiers_save);
 
            if (!SetKeyboardState(kbd_state))
-             return NULL;
+             goto _free_compose;
 
            is_dead_key = EINA_FALSE;
            res = ToUnicode(msg->window_param,
@@ -1317,7 +1328,7 @@ 
_ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg,
                 if (res == -1)
                   is_dead_key = EINA_TRUE;
                 if ((res != 1) && (res != -1))
-                  return NULL;
+                  goto _free_compose;
              }
 
            if (is_dead_key)
@@ -1336,25 +1347,25 @@ 
_ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg,
            _ecore_win32_modifiers_win_restore(kbd_state, modifiers_save);
 
            if (!SetKeyboardState(kbd_state))
-             return NULL;
+             goto _free_compose;
 
            if (!keyname)
              {
                 WRN("no keysym found for keycode %d\n", string[0]);
-                return NULL;
+                goto _free_compose;
              }
         }
      }
 
    if (!keyname || !key)
-     return NULL;
+     goto _free_compose;
 
    e = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key) +
                                  strlen(keyname) + 1 +
                                  strlen(key) + 1 +
                                  (compose ? strlen(compose) : 0) + 1);
    if (!e)
-     return NULL;
+     goto _free_compose;
 
    e->keyname = (char *)(e + 1);
    e->key = e->keyname + strlen(keyname) + 1;
@@ -1368,11 +1379,17 @@ 
_ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg,
    if (compose)
      {
         memcpy((char *)e->compose, compose, strlen(compose));
-        free(compose);
+        if (free_compose)
+          free(compose);
      }
 
 
    return e;
+
+ _free_compose:
+   if (free_compose)
+     free(compose);
+   return NULL;
 }
 
 /***** Global functions definitions *****/

-- 


Reply via email to