summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeunghun Lee <shiin.lee@samsung.com>2014-06-26 09:19:23 -0400
committerMike Blumenkrantz <zmike@osg.samsung.com>2014-08-04 18:01:21 -0400
commit2b14f570b7c3fce94bab9f26da81c1c4ff452b64 (patch)
tree1d61be1442f5c26d3c892b4a55c22e3ef3ce96d1
parentc386a28c6f1b20e12f9e24bc1469797435167c55 (diff)
downloadenlightenment-2b14f570b7c3fce94bab9f26da81c1c4ff452b64.tar.gz
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
-rw-r--r--src/bin/e_comp_wl.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c
index 26d291b299..b275ba2531 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);