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!!! SVN revision: 37944
This commit is contained in:
parent
9c381ceb1f
commit
288a77ea18
|
@ -885,7 +885,8 @@ _edje_callbacks_patterns_init(Edje *ed)
|
||||||
{
|
{
|
||||||
Edje_Signals_Sources_Patterns *ssp = &ed->patterns.callbacks;
|
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;
|
return;
|
||||||
|
|
||||||
ssp->globing = edje_match_callback_hash_build(ed->callbacks,
|
ssp->globing = edje_match_callback_hash_build(ed->callbacks,
|
||||||
|
@ -919,7 +920,7 @@ _edje_emit_handle(Edje *ed, const char *sig, const char *src)
|
||||||
#ifdef EDJE_PROGRAM_CACHE
|
#ifdef EDJE_PROGRAM_CACHE
|
||||||
l1 = strlen(sig);
|
l1 = strlen(sig);
|
||||||
l2 = strlen(src);
|
l2 = strlen(src);
|
||||||
tmps = alloca(l1 + l2 + 2);
|
tmps = alloca(l1 + l2 + 3); /* \0, \337, \0 */
|
||||||
strcpy(tmps, sig);
|
strcpy(tmps, sig);
|
||||||
tmps[l1] = '\377';
|
tmps[l1] = '\377';
|
||||||
strcpy(&(tmps[l1 + 1]), src);
|
strcpy(&(tmps[l1 + 1]), src);
|
||||||
|
@ -1052,19 +1053,19 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src)
|
||||||
goto break_prog;
|
goto break_prog;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break_prog:
|
||||||
|
|
||||||
ed->walking_callbacks = 0;
|
ed->walking_callbacks = 0;
|
||||||
if ((ed->delete_callbacks) || (ed->just_added_callbacks))
|
if ((ed->delete_callbacks) || (ed->just_added_callbacks))
|
||||||
{
|
{
|
||||||
Edje_Signal_Callback *escb;
|
|
||||||
|
|
||||||
ed->delete_callbacks = 0;
|
ed->delete_callbacks = 0;
|
||||||
ed->just_added_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)
|
if (escb->just_added)
|
||||||
escb->just_added = 0;
|
escb->just_added = 0;
|
||||||
if (escb->delete_me)
|
if (escb->delete_me)
|
||||||
|
@ -1079,7 +1080,6 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src)
|
||||||
|
|
||||||
_edje_callbacks_patterns_clean(ed);
|
_edje_callbacks_patterns_clean(ed);
|
||||||
}
|
}
|
||||||
break_prog:
|
|
||||||
_edje_unblock(ed);
|
_edje_unblock(ed);
|
||||||
_edje_thaw(ed);
|
_edje_thaw(ed);
|
||||||
_edje_unref(ed);
|
_edje_unref(ed);
|
||||||
|
|
Loading…
Reference in New Issue