From e402e2363a2bd17d118e3da1f29abbb8646ce710 Mon Sep 17 00:00:00 2001 From: Seunghun Lee Date: Thu, 26 Jun 2014 09:19:23 -0400 Subject: [PATCH] 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. Reviewers: devilhorns, zmike, raster CC: cedric Differential Revision: https://phab.enlightenment.org/D1089 --- src/bin/e_comp_wl.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c index 26d291b29..b275ba253 100644 --- a/src/bin/e_comp_wl.c +++ b/src/bin/e_comp_wl.c @@ -1350,7 +1350,7 @@ _e_comp_wl_evas_cb_key_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj keycode = (ev->keycode - 8); if (!(cdata = ec->comp->wl_comp_data)) return; - end = (uint32_t *)cdata->kbd.keys.data + cdata->kbd.keys.size; + end = (uint32_t *)cdata->kbd.keys.data + (cdata->kbd.keys.size / sizeof(*k)); for (k = cdata->kbd.keys.data; k < end; k++) { @@ -1358,7 +1358,7 @@ _e_comp_wl_evas_cb_key_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj if (*k == keycode) return; } - cdata->kbd.keys.size = end - (uint32_t *)cdata->kbd.keys.data; + cdata->kbd.keys.size = (const char *)end - (const char *)cdata->kbd.keys.data; k = wl_array_add(&cdata->kbd.keys, sizeof(*k)); *k = keycode; @@ -1395,11 +1395,11 @@ _e_comp_wl_evas_cb_key_up(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj E keycode = (ev->keycode - 8); if (!(cdata = ec->comp->wl_comp_data)) return; - end = (uint32_t *)cdata->kbd.keys.data + cdata->kbd.keys.size; + end = (uint32_t *)cdata->kbd.keys.data + (cdata->kbd.keys.size / sizeof(*k)); for (k = cdata->kbd.keys.data; k < end; k++) if (*k == keycode) *k = *--end; - cdata->kbd.keys.size = end - (uint32_t *)cdata->kbd.keys.data; + cdata->kbd.keys.size = (const char *)end - (const char *)cdata->kbd.keys.data; wc = wl_resource_get_client(ec->wl_comp_data->surface); serial = wl_display_next_serial(cdata->wl.disp);