forked from enlightenment/enlightenment
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
This commit is contained in:
parent
f1bf03e87b
commit
e402e2363a
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue