diff options
author | Seunghun Lee <shiin.lee@samsung.com> | 2014-06-26 09:19:23 -0400 |
---|---|---|
committer | Mike Blumenkrantz <zmike@osg.samsung.com> | 2014-08-04 18:01:21 -0400 |
commit | 2b14f570b7c3fce94bab9f26da81c1c4ff452b64 (patch) | |
tree | 1d61be1442f5c26d3c892b4a55c22e3ef3ce96d1 | |
parent | c386a28c6f1b20e12f9e24bc1469797435167c55 (diff) | |
download | enlightenment-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.c | 8 |
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); |