[vlc-devel] [PATCH] xcb: fix some memory leaks

Edward Wang edward.c.wang at compdigitec.com
Tue Jun 25 01:56:45 CEST 2013


According to xcb docs, we are responsible for freeing this memory.
---
 modules/control/globalhotkeys/xcb.c |   25 ++++++++++++++-----------
 1 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/modules/control/globalhotkeys/xcb.c b/modules/control/globalhotkeys/xcb.c
index f35ce67..05e5a05 100644
--- a/modules/control/globalhotkeys/xcb.c
+++ b/modules/control/globalhotkeys/xcb.c
@@ -181,10 +181,17 @@ static unsigned GetModifier( xcb_connection_t *p_connection, xcb_key_symbols_t *
     if( sym == 0 )
         return 0; /* no modifier */
 
-    const xcb_keycode_t *p_keys = xcb_key_symbols_get_keycode( p_symbols, sym );
-    if( !p_keys )
+    xcb_get_modifier_mapping_cookie_t r =
+            xcb_get_modifier_mapping( p_connection );
+    xcb_get_modifier_mapping_reply_t *p_map =
+            xcb_get_modifier_mapping_reply( p_connection, r, NULL );
+    if( !p_map )
         return 0;
 
+    xcb_keycode_t *p_keys = xcb_key_symbols_get_keycode( p_symbols, sym );
+    if( !p_keys )
+        goto end;
+
     int i = 0;
     bool no_modifier = true;
     while( p_keys[i] != XCB_NO_SYMBOL )
@@ -198,28 +205,24 @@ static unsigned GetModifier( xcb_connection_t *p_connection, xcb_key_symbols_t *
     }
 
     if( no_modifier )
-        return 0;
-
-    xcb_get_modifier_mapping_cookie_t r =
-            xcb_get_modifier_mapping( p_connection );
-    xcb_get_modifier_mapping_reply_t *p_map =
-            xcb_get_modifier_mapping_reply( p_connection, r, NULL );
-    if( !p_map )
-        return 0;
+        goto end;
 
     xcb_keycode_t *p_keycode = xcb_get_modifier_mapping_keycodes( p_map );
     if( !p_keycode )
-        return 0;
+        goto end;
 
     for( int i = 0; i < 8; i++ )
         for( int j = 0; j < p_map->keycodes_per_modifier; j++ )
             for( int k = 0; p_keys[k] != XCB_NO_SYMBOL; k++ )
                 if( p_keycode[i*p_map->keycodes_per_modifier + j] == p_keys[k])
                 {
+                    free( p_keys );
                     free( p_map );
                     return pi_mask[i];
                 }
 
+end:
+    free( p_keys );
     free( p_map ); // FIXME to check
     return 0;
 }
-- 
1.7.5.4




More information about the vlc-devel mailing list