diff options
author | Vincent Torri <vincent.torri@gmail.com> | 2020-02-25 10:27:14 -0500 |
---|---|---|
committer | Mike Blumenkrantz <zmike@samsung.com> | 2020-02-25 10:27:16 -0500 |
commit | fa562828b8d08fa4e6902b061e8bb8bda430b8a7 (patch) | |
tree | 07ec7b43cdcdacd15573e6a2c5f9216a113a0689 | |
parent | 0ff7469d91df09f859dffd5152dfc508759206e6 (diff) | |
download | efl-fa562828b8d08fa4e6902b061e8bb8bda430b8a7.tar.gz |
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
-rw-r--r-- | src/lib/ecore_win32/ecore_win32_event.c | 47 |
1 files 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 *****/ |