jihoon pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=3191776c017d1992bcb9549ea489162a390e2842

commit 3191776c017d1992bcb9549ea489162a390e2842
Author: Jihoon Kim <[email protected]>
Date:   Tue Dec 31 10:01:54 2013 +0900

    ibusimmodule: fix segmentation fault
    
    This patch fixes "free(): invalid pointer issue"
---
 src/modules/ecore_imf/ibus/ibus_imcontext.c | 37 +++++++++++++++++++++++++----
 src/modules/ecore_imf/ibus/ibus_imcontext.h |  2 +-
 2 files changed, 33 insertions(+), 6 deletions(-)

diff --git a/src/modules/ecore_imf/ibus/ibus_imcontext.c 
b/src/modules/ecore_imf/ibus/ibus_imcontext.c
index 67f22f9..66b0df4 100644
--- a/src/modules/ecore_imf/ibus/ibus_imcontext.c
+++ b/src/modules/ecore_imf/ibus/ibus_imcontext.c
@@ -245,6 +245,8 @@ ecore_imf_context_ibus_del(Ecore_IMF_Context *ctx)
    EINA_LOG_DBG("%s", __FUNCTION__);
 
    IBusIMContext *ibusimcontext = 
(IBusIMContext*)ecore_imf_context_data_get(ctx);
+   Ecore_IMF_Preedit_Attr *attr = NULL;
+
    EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
 
    g_signal_handlers_disconnect_by_func(_bus, 
G_CALLBACK(_ecore_imf_context_ibus_bus_connected_cb), ctx);
@@ -255,6 +257,13 @@ ecore_imf_context_ibus_del(Ecore_IMF_Context *ctx)
    // release preedit
    if (ibusimcontext->preedit_string)
      free(ibusimcontext->preedit_string);
+
+   if (ibusimcontext->preedit_attrs)
+     {
+        EINA_LIST_FREE(ibusimcontext->preedit_attrs, attr)
+           free(attr);
+     }
+
    if (_focus_im_context == ctx)
      _focus_im_context = NULL;
 }
@@ -437,20 +446,32 @@ 
ecore_imf_context_ibus_preedit_string_get(Ecore_IMF_Context *ctx,
 EAPI void
 ecore_imf_context_ibus_preedit_string_with_attributes_get(Ecore_IMF_Context   
*ctx,
                                                           char          **str,
-                                                          Eina_List     **attr 
EINA_UNUSED,
+                                                          Eina_List     
**attrs,
                                                           int            
*cursor_pos)
 {
    IBusIMContext *ibusimcontext = 
(IBusIMContext*)ecore_imf_context_data_get(ctx);
    EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
+   Eina_List *l;
+   Ecore_IMF_Preedit_Attr *attr1 = NULL, *attr2 = NULL;
 
    ecore_imf_context_ibus_preedit_string_get(ctx, str, cursor_pos);
 
-   if (attr)
+   if (attrs)
      {
         if (ibusimcontext->preedit_attrs)
-          *attr = ibusimcontext->preedit_attrs;
+          {
+             EINA_LIST_FOREACH(ibusimcontext->preedit_attrs, l, attr1)
+               {
+                  attr2 = (Ecore_IMF_Preedit_Attr *)calloc(1, 
sizeof(Ecore_IMF_Preedit_Attr));
+                  attr2->preedit_type = attr1->preedit_type;
+                  attr2->start_index = attr1->start_index;
+                  attr2->end_index = attr1->end_index;
+
+                  *attrs = eina_list_append(*attrs, (void *)attr2);
+               }
+          }
         else
-          *attr = NULL;
+          *attrs = NULL;
      }
 }
 
@@ -658,7 +679,13 @@ 
_ecore_imf_context_ibus_update_preedit_text_cb(IBusInputContext  *ibuscontext EI
    if (ibusimcontext->preedit_string)
      free(ibusimcontext->preedit_string);
 
-   ibusimcontext->preedit_attrs = NULL;
+   if (ibusimcontext->preedit_attrs)
+     {
+        EINA_LIST_FREE(ibusimcontext->preedit_attrs, attr)
+           free(attr);
+
+        ibusimcontext->preedit_attrs = NULL;
+     }
 
    str = text->text;
 
diff --git a/src/modules/ecore_imf/ibus/ibus_imcontext.h 
b/src/modules/ecore_imf/ibus/ibus_imcontext.h
index cd3060c..3d1bfb7 100644
--- a/src/modules/ecore_imf/ibus/ibus_imcontext.h
+++ b/src/modules/ecore_imf/ibus/ibus_imcontext.h
@@ -21,7 +21,7 @@ EAPI void 
ecore_imf_context_ibus_preedit_string_get(Ecore_IMF_Context     *conte
 
 EAPI void 
ecore_imf_context_ibus_preedit_string_with_attributes_get(Ecore_IMF_Context     
*context,
                                                                     char       
           **str,
-                                                                    Eina_List  
           **attr,
+                                                                    Eina_List  
           **attrs,
                                                                     int        
           *cursor_pos);
 
 EAPI void ecore_imf_context_ibus_cursor_location_set(Ecore_IMF_Context 
*context,

-- 


Reply via email to