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);
|
keycode = (ev->keycode - 8);
|
||||||
if (!(cdata = ec->comp->wl_comp_data)) return;
|
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++)
|
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;
|
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 = wl_array_add(&cdata->kbd.keys, sizeof(*k));
|
||||||
*k = keycode;
|
*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);
|
keycode = (ev->keycode - 8);
|
||||||
if (!(cdata = ec->comp->wl_comp_data)) return;
|
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++)
|
for (k = cdata->kbd.keys.data; k < end; k++)
|
||||||
if (*k == keycode) *k = *--end;
|
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);
|
wc = wl_resource_get_client(ec->wl_comp_data->surface);
|
||||||
serial = wl_display_next_serial(cdata->wl.disp);
|
serial = wl_display_next_serial(cdata->wl.disp);
|
||||||
|
|
Loading…
Reference in New Issue