From 1c02b7740de0938bcbad2e26ee055ad570cdf77c Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Fri, 21 Jun 2019 09:29:52 +0100 Subject: [PATCH] fix segv when adding optimizations to edje message handling 613e1715be1114c2221f1a12f067e3d1e215265f (and friends) added a bit a biug where messages in the queue were not skipped as they were before causing a segv witha null lookup. this fixes that. eclipse about dialog showed this bug up. no longer happens now. --- src/lib/edje/edje_message_queue.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/lib/edje/edje_message_queue.c b/src/lib/edje/edje_message_queue.c index 2e7e7ad9ba..ea3adc824a 100644 --- a/src/lib/edje/edje_message_queue.c +++ b/src/lib/edje/edje_message_queue.c @@ -180,7 +180,7 @@ static void _edje_object_message_signal_process_do(Eo *obj EINA_UNUSED, Edje *ed) { Eina_Inlist *l, *ln; - Edje *lookup_ed; + Edje *lookup_ed = NULL; Eina_List *groups = NULL, *lg; Edje_Message *em; int gotos = 0; @@ -188,19 +188,21 @@ _edje_object_message_signal_process_do(Eo *obj EINA_UNUSED, Edje *ed) if (!ed) return; groups = ed->groups; - - for (l = msgq; l; l = ln) + if (groups) { - ln = l->next; - em = INLIST_CONTAINER(Edje_Message, l, inlist_main); - EINA_LIST_FOREACH(groups, lg, lookup_ed) + for (l = msgq; l; l = ln) { - if (em->edje == lookup_ed) + ln = l->next; + em = INLIST_CONTAINER(Edje_Message, l, inlist_main); + EINA_LIST_FOREACH(groups, lg, lookup_ed) { - msgq = eina_inlist_remove(msgq, &(em->inlist_main)); - tmp_msgq = eina_inlist_append(tmp_msgq, &(em->inlist_main)); - em->in_tmp_msgq = EINA_TRUE; - break; + if (em->edje == lookup_ed) + { + msgq = eina_inlist_remove(msgq, &(em->inlist_main)); + tmp_msgq = eina_inlist_append(tmp_msgq, &(em->inlist_main)); + em->in_tmp_msgq = EINA_TRUE; + break; + } } } } @@ -213,12 +215,14 @@ again: em = INLIST_CONTAINER(Edje_Message, l, inlist_edje); if (!em->in_tmp_msgq) continue; // so why this? any group edje is not the parent - skip this + lookup_ed = NULL; EINA_LIST_FOREACH(groups, lg, lookup_ed) { if (em->edje == lookup_ed) break; } + if (!lookup_ed) continue; tmp_msgq = eina_inlist_remove(tmp_msgq, &(em->inlist_main)); - em->edje->messages = eina_inlist_remove(em->edje->messages, &(em->inlist_edje)); + lookup_ed->messages = eina_inlist_remove(lookup_ed->messages, &(em->inlist_edje)); if (!lookup_ed->delete_me) { lookup_ed->processing_messages++;