summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Torri <vincent.torri@gmail.com>2020-02-25 10:27:14 -0500
committerMike Blumenkrantz <zmike@samsung.com>2020-02-25 10:27:16 -0500
commitfa562828b8d08fa4e6902b061e8bb8bda430b8a7 (patch)
tree07ec7b43cdcdacd15573e6a2c5f9216a113a0689
parent0ff7469d91df09f859dffd5152dfc508759206e6 (diff)
downloadefl-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.c47
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 *****/