devilhorns pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=f6d2f30d93ea612328b1a26ed93aa54f08a9c4ea

commit f6d2f30d93ea612328b1a26ed93aa54f08a9c4ea
Author: Chris Michael <[email protected]>
Date:   Thu Jun 26 10:58:06 2014 -0400

    Port D1089 patch from Seunghun Lee <[email protected]> to current
    E master
    
    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.
    
    Signed-off-by: Chris Michael <[email protected]>
---
 src/modules/wl_desktop_shell/e_mod_main.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/modules/wl_desktop_shell/e_mod_main.c 
b/src/modules/wl_desktop_shell/e_mod_main.c
index 6a2d83e..e98a110 100644
--- a/src/modules/wl_desktop_shell/e_mod_main.c
+++ b/src/modules/wl_desktop_shell/e_mod_main.c
@@ -1350,11 +1350,11 @@ _e_wl_shell_shell_surface_cb_key_up(void *data, Evas *e 
EINA_UNUSED, Evas_Object
           sym = xkb_keysym_from_name(ev->key, XKB_KEYSYM_CASE_INSENSITIVE);
         key = sym - 8;
      }
-   end = ((unsigned int *)kbd->keys.data + kbd->keys.size);
+   end = ((unsigned int *)kbd->keys.data + (kbd->keys.size / sizeof(*k)));
    for (k = kbd->keys.data; k < end; k++)
      if ((*k == key)) *k = *--end;
 
-   kbd->keys.size = end - (unsigned int *)kbd->keys.data;
+   kbd->keys.size = (const char *)end - (const char *)kbd->keys.data;
 
    /* try to get the current keyboard's grab interface. 
     * Fallback to the default grab */
@@ -1425,14 +1425,14 @@ _e_wl_shell_shell_surface_cb_key_down(void *data, Evas 
*e EINA_UNUSED, Evas_Obje
    kbd->grab_key = key;
    kbd->grab_time = ev->timestamp;
 
-   end = ((unsigned int *)kbd->keys.data + kbd->keys.size);
+   end = ((unsigned int *)kbd->keys.data + (kbd->keys.size / sizeof(*k)));
    for (k = kbd->keys.data; k < end; k++)
      {
         /* ignore server generated key repeats */
         if ((*k == key)) return;
      }
 
-   kbd->keys.size = end - (unsigned int *)kbd->keys.data;
+   kbd->keys.size = (const char *)end - (const char *)kbd->keys.data;
    k = wl_array_add(&kbd->keys, sizeof(*k));
    *k = key;
 

-- 


Reply via email to