glima pushed a commit to branch master.

commit d5ebe804ddea22bf182128cb2d647620c58b5b8f
Author: José Roberto de Souza <[email protected]>
Date:   Fri May 17 18:44:24 2013 -0300

    edje: Fix edje box crash
    
    When a signal change a state of a edje box to a state that was already 
active
    and we add/del a item of edje box a crash happen.
    
    Example:
    test.edc:
    
    collections {
        group {
                name: "box_text";
                parts {
                        part {
                                name: "elm.box.buttons";
                                type: BOX;
                                description {
                                        state: "default" 0.0;
                                        min: 0 100;
                                        max: 9999 100;
                                        align: 0 0;
                                        box {
                                                layout: "horizontal";
                                                min: 1 1;
                                        }
                                        visible: 0;
                                }
                                description {
                                        state: "show" 0.0;
                                        inherit: "default" 0.0;
                                        visible: 1;
                                }
                        }
                }
                programs {
                        program {
                                signal: "show,buttons";
                                source: "gui";
                                action: STATE_SET "show" 0.0;
                                transition: ACCELERATE 1;
                                target: "elm.box.buttons";
                        }
                        program {
                                signal: "hide,buttons";
                                source: "gui";
                                action: STATE_SET "default" 0.0;
                                transition: ACCELERATE 1;
                                target: "elm.box.buttons";
                        }
                }
        }
    }
    
    test.c:
    
    //Compile with:
    //gcc -g test.c -o test `pkg-config --cflags --libs elementary edje ecore`
    
    static int count = 0;
    
    static Eina_Bool _fill(void *data)
    {
        int i;
        Evas_Object *layout = data;
        Evas_Object *edje = elm_layout_edje_get(layout);
    
        edje_object_part_box_remove_all(edje, "elm.box.buttons", EINA_TRUE);
        elm_layout_signal_emit(layout, "show,buttons", "gui");
    
        printf("_fill()\n");
    
        for (i = 0; i < 5; i++, count++)
        {
                Evas_Object *btn;
                char buf[50];
    
                btn = elm_button_add(layout);
                snprintf(buf, sizeof(buf), "button %d", count);
                elm_object_text_set(btn, buf);
                edje_object_part_box_append(edje, "elm.box.buttons", btn);
                evas_object_show(btn);
        }
    
        return EINA_TRUE;
    }
    
    EAPI_MAIN int
    elm_main(int argc, char **argv)
    {
        Evas_Object *win, *bg, *layout;
    
        win = elm_win_add(NULL, "test", ELM_WIN_BASIC);
        elm_win_title_set(win, "Test");
        elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
        elm_win_autodel_set(win, EINA_TRUE);
    
        bg = elm_bg_add(win);
        elm_bg_color_set(bg, 255, 255, 255);
        evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, 
EVAS_HINT_EXPAND);
        elm_win_resize_object_add(win, bg);
        evas_object_show(bg);
    
        layout = elm_layout_add(win);
        elm_layout_file_set(layout, "test.edj", "box_text");
        evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, 
EVAS_HINT_EXPAND);
        evas_object_show(layout);
    
        _fill(layout);
        ecore_timer_add(5, _fill, layout);
    
        evas_object_resize(win, 800, 320);
        evas_object_show(win);
    
        elm_run();
        elm_shutdown();
    
        return 0;
    }
    ELM_MAIN()
    
    (gdb) bt
    0x00000000 in ?? ()
    0xb7add287 in _edje_box_layout_calculate_coords ()
       from /usr/lib/libedje.so.1
    0xb7add5cd in _edje_box_layout () from /usr/lib/libedje.so.1
    0xb7c98ff7 in _evas_object_box_smart_calculate ()
       from /usr/lib/libevas.so.1
    0xb7c97a36 in evas_object_smart_calculate () from /usr/lib/libevas.so.1
    0xb7ae1b12 in _edje_part_recalc_single () from /usr/lib/libedje.so.1
    0xb7ae3380 in _edje_part_recalc () from /usr/lib/libedje.so.1
    0xb7ae59ff in _edje_recalc_do () from /usr/lib/libedje.so.1
    0xb7b3603a in _edje_smart_calculate () from /usr/lib/libedje.so.1
    0xb7c97be2 in evas_call_smarts_calculate () from /usr/lib/libevas.so.1
    0xb7cc7d88 in evas_render_updates_internal () from /usr/lib/libevas.so.1
    0xb7ba7c97 in _ecore_evas_x_render () from /usr/lib/libecore_evas.so.1
    0xb7ba27c6 in _ecore_evas_idle_enter () from /usr/lib/libecore_evas.so.1
    0xb7c27212 in _ecore_idle_enterer_call () from /usr/lib/libecore.so.1
    0xb7c28d3d in _ecore_main_loop_iterate_internal ()
       from /usr/lib/libecore.so.1
    0xb7c2941f in ecore_main_loop_begin () from /usr/lib/libecore.so.1
    0xb7e8def8 in elm_run () from /usr/lib/libelementary.so.1
    0xb7f6f8ee in appcore_efl_main () from /usr/lib/libappcore-efl.so.1
    0xb7644bb5 in app_efl_main () from /usr/lib/libcapi-appfw-application.so.0
    0x08074c5a in main (argc=1, argv=0xbffffb64) at src/main_tizen.c:155
    
    ==2036== Jump to the invalid address stated on the next line
    ==2036==    at 0x0: ???
    ==2036==    by 0x44C35CC: _edje_box_layout (in /usr/lib/libedje.so.1.7.99)
    ==2036==    by 0x42E8FF6: _evas_object_box_smart_calculate (in 
/usr/lib/libevas.so.1.7.99)
    ==2036==    by 0x42E7A35: evas_object_smart_calculate (in 
/usr/lib/libevas.so.1.7.99)
    ==2036==    by 0x44C7B11: _edje_part_recalc_single (in 
/usr/lib/libedje.so.1.7.99)
    ==2036==    by 0x44C937F: _edje_part_recalc (in /usr/lib/libedje.so.1.7.99)
    ==2036==    by 0x44CB9FE: _edje_recalc_do (in /usr/lib/libedje.so.1.7.99)
    ==2036==    by 0x451C039: _edje_smart_calculate (in 
/usr/lib/libedje.so.1.7.99)
    ==2036==    by 0x42E7BE1: evas_call_smarts_calculate (in 
/usr/lib/libevas.so.1.7.99)
    ==2036==    by 0x4317D87: evas_render_updates_internal (in 
/usr/lib/libevas.so.1.7.99)
    ==2036==    by 0x4465C96: _ecore_evas_x_render (in 
/usr/lib/libecore_evas.so.1.7.99)
    ==2036==    by 0x44607C5: _ecore_evas_idle_enter (in 
/usr/lib/libecore_evas.so.1.7.99)
    ==2036==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
    
    We called anim->start aftwards just to be sure to stick to something if
    all fail.
---
 src/lib/edje/edje_box_layout.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/lib/edje/edje_box_layout.c b/src/lib/edje/edje_box_layout.c
index b006e3a..66bba4f 100644
--- a/src/lib/edje/edje_box_layout.c
+++ b/src/lib/edje/edje_box_layout.c
@@ -64,7 +64,11 @@ _edje_box_layout_calculate_coords(Evas_Object *obj, 
Evas_Object_Box_Data *priv,
      }
    evas_object_box_padding_set(obj, anim->end.padding.x, anim->end.padding.y);
    evas_object_box_align_set(obj, TO_DOUBLE(anim->end.align.x), 
TO_DOUBLE(anim->end.align.y));
-   anim->end.layout(obj, priv, anim->end.data);
+   if (anim->end.layout)
+     anim->end.layout(obj, priv, anim->end.data);
+   else if (anim->start.layout)
+     anim->start.layout(obj, priv, anim->start.data);
+
    EINA_LIST_FOREACH(anim->objs, l, tad)
      {
         evas_object_geometry_get(tad->obj, &tad->end.x, &tad->end.y,

-- 

------------------------------------------------------------------------------
AlienVault Unified Security Management (USM) platform delivers complete
security visibility with the essential security capabilities. Easily and
efficiently configure, manage, and operate all of your security controls
from a single console and one unified framework. Download a free trial.
http://p.sf.net/sfu/alienvault_d2d

Reply via email to