From: Enlightenment S. <no-...@en...> - 2008-12-05 22:32:09
|
Log: Hopefully fix some problems with Edje fnmatch and callbacks. * Fix buffer overflow with EDJE_PROGRAM_CACHE (not tested since I don't use it). * break_prog should always unset walking_callbacks and do after-tasks. * Fix list walking! ouch!!! Author: barbieri Date: 2008-12-05 14:32:04 -0800 (Fri, 05 Dec 2008) New Revision: 37944 Modified: trunk/edje/src/lib/edje_program.c Modified: trunk/edje/src/lib/edje_program.c =================================================================== --- trunk/edje/src/lib/edje_program.c 2008-12-05 21:10:50 UTC (rev 37943) +++ trunk/edje/src/lib/edje_program.c 2008-12-05 22:32:04 UTC (rev 37944) @@ -885,7 +885,8 @@ { Edje_Signals_Sources_Patterns *ssp = &ed->patterns.callbacks; - if (ssp->signals_patterns) + if ((ssp->signals_patterns) || (ssp->sources_patterns) || + (ssp->globing) || (ssp->exact_match)) return; ssp->globing = edje_match_callback_hash_build(ed->callbacks, @@ -919,7 +920,7 @@ #ifdef EDJE_PROGRAM_CACHE l1 = strlen(sig); l2 = strlen(src); - tmps = alloca(l1 + l2 + 2); + tmps = alloca(l1 + l2 + 3); /* \0, \337, \0 */ strcpy(tmps, sig); tmps[l1] = '\377'; strcpy(&(tmps[l1 + 1]), src); @@ -1052,19 +1053,19 @@ goto break_prog; } } + break_prog: ed->walking_callbacks = 0; if ((ed->delete_callbacks) || (ed->just_added_callbacks)) { - Edje_Signal_Callback *escb; - ed->delete_callbacks = 0; ed->just_added_callbacks = 0; - EINA_LIST_FOREACH(ed->callbacks, l, escb) + l = ed->callbacks; + while (l) { - Eina_List *next_l; + Edje_Signal_Callback *escb = l->data; + Eina_List *next_l = l->next; - next_l = eina_list_next(l); if (escb->just_added) escb->just_added = 0; if (escb->delete_me) @@ -1079,7 +1080,6 @@ _edje_callbacks_patterns_clean(ed); } - break_prog: _edje_unblock(ed); _edje_thaw(ed); _edje_unref(ed); |