From f6d2f30d93ea612328b1a26ed93aa54f08a9c4ea Mon Sep 17 00:00:00 2001 From: Chris Michael Date: Thu, 26 Jun 2014 10:58:06 -0400 Subject: [PATCH] Port D1089 patch from Seunghun Lee to current E master fix crash and memory leak when press and release any key repeatedly. Summary: since the size of wl_array is determined based on one byte, so in order to compare with uint32_t, the size of wl_array should be divided by uint32_t's size. and when calculate the size of wl_array by difference between two address, address should type cast char* as one byte. Test Plan: (1) run terminology (2) input any key several time. Signed-off-by: Chris Michael --- src/modules/wl_desktop_shell/e_mod_main.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/modules/wl_desktop_shell/e_mod_main.c b/src/modules/wl_desktop_shell/e_mod_main.c index 6a2d83e2f..e98a11067 100644 --- a/src/modules/wl_desktop_shell/e_mod_main.c +++ b/src/modules/wl_desktop_shell/e_mod_main.c @@ -1350,11 +1350,11 @@ _e_wl_shell_shell_surface_cb_key_up(void *data, Evas *e EINA_UNUSED, Evas_Object sym = xkb_keysym_from_name(ev->key, XKB_KEYSYM_CASE_INSENSITIVE); key = sym - 8; } - end = ((unsigned int *)kbd->keys.data + kbd->keys.size); + end = ((unsigned int *)kbd->keys.data + (kbd->keys.size / sizeof(*k))); for (k = kbd->keys.data; k < end; k++) if ((*k == key)) *k = *--end; - kbd->keys.size = end - (unsigned int *)kbd->keys.data; + kbd->keys.size = (const char *)end - (const char *)kbd->keys.data; /* try to get the current keyboard's grab interface. * Fallback to the default grab */ @@ -1425,14 +1425,14 @@ _e_wl_shell_shell_surface_cb_key_down(void *data, Evas *e EINA_UNUSED, Evas_Obje kbd->grab_key = key; kbd->grab_time = ev->timestamp; - end = ((unsigned int *)kbd->keys.data + kbd->keys.size); + end = ((unsigned int *)kbd->keys.data + (kbd->keys.size / sizeof(*k))); for (k = kbd->keys.data; k < end; k++) { /* ignore server generated key repeats */ if ((*k == key)) return; } - kbd->keys.size = end - (unsigned int *)kbd->keys.data; + kbd->keys.size = (const char *)end - (const char *)kbd->keys.data; k = wl_array_add(&kbd->keys, sizeof(*k)); *k = key;