fix segv when adding optimizations to edje message handling
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>
Fri, 21 Jun 2019 08:29:52 +0000 (09:29 +0100)
committerJongmin Lee <jm105.lee@samsung.com>
Wed, 26 Jun 2019 01:40:50 +0000 (10:40 +0900)
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

index 2e7e7ad..ea3adc8 100644 (file)
@@ -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++;