diff --git a/src/main.c b/src/main.c
index a0b90ae..d9c6742 100644
--- a/src/main.c
+++ b/src/main.c
@@ -534,11 +534,14 @@ void handle_x_event(XEvent *e)
         }
         if (e->xany.window == g_tooltip.window || !systray_enabled)
             break;
-        for (GSList *it = systray.list_icons; it; it = it->next)
+        /* we might remove elements in the callback so a copy is needed */
+        GSList *list = g_list_copy(systray.list_icons);
+        for (GSList *it = list; it; it = it->next)
         {
-            if (((TrayWindow *)it->data)->win == e->xany.window)
+            if (it->data != NULL && ((TrayWindow *)it->data)->win == e->xany.window)
                 systray_destroy_event(it->data);
         }
+        g_list_free(list);
         break;
 
     case ClientMessage: {
diff --git a/src/util/uevent.c b/src/util/uevent.c
index b0acefa..5c48b52 100644
--- a/src/util/uevent.c
+++ b/src/util/uevent.c
@@ -146,7 +146,9 @@ void uevent_handler( fd_set *fds, int *fdn)
     struct uevent ev;
 
     if (uevent_new(&ev, buf, len)) {
-        for (GSList *l = notifiers; l; l = l->next)
+        /* we might remove elements in the callback so a copy is needed */
+        GSList *list = g_list_copy(notifiers);
+        for (GSList *l = list; l; l = l->next)
         {
             struct uevent_notify *nb = l->data;
 
@@ -157,6 +159,7 @@ void uevent_handler( fd_set *fds, int *fdn)
 
             nb->cb(&ev, nb->userdata);
         }
+        g_list_free(list);
         uevent_destroy (&ev);
     }
 }
