use a safe iterator when deleting clients during comp shutdown
authorMike Blumenkrantz <zmike@osg.samsung.com>
Mon, 15 Jun 2015 17:35:34 +0000 (13:35 -0400)
committerMike Blumenkrantz <zmike@osg.samsung.com>
Mon, 15 Jun 2015 17:35:34 +0000 (13:35 -0400)
it's conceivable that, were there a bug in client refcounting,
this could become an infinite loop and prevent shutdown/restart.
since, at this point, we don't really care about deleting anything,
ensure that the loop will end

src/bin/e_comp.c

index 8290fb6c8d0bbc90f47ae55369eea4fa0416505a..985424b733b65aef709889214038a15b5fd7eb20 100644 (file)
@@ -1290,14 +1290,17 @@ e_comp_internal_save(void)
 EINTERN int
 e_comp_shutdown(void)
 {
+   Eina_List *l, *ll;
+   E_Client *ec;
+
 #ifdef HAVE_WAYLAND
    E_Pixmap_Type type = e_comp->comp_type;
 #endif
    E_FREE_FUNC(action_timeout, ecore_timer_del);
-   while (e_comp->clients)
+   EINA_LIST_FOREACH_SAFE(e_comp->clients, l, ll, ec)
      {
-        DELD(eina_list_data_get(e_comp->clients), 99999);
-        e_object_del(eina_list_data_get(e_comp->clients));
+        DELD(ec, 99999);
+        e_object_del(E_OBJECT(ec));
      }
    e_object_del(E_OBJECT(e_comp));
    E_FREE_LIST(handlers, ecore_event_handler_del);