]> git.sur5r.net Git - i3/i3/commitdiff
ipc: fix memory leaks when clients disconnect
authorMichael Stapelberg <michael@stapelberg.de>
Mon, 7 Nov 2011 21:34:39 +0000 (21:34 +0000)
committerMichael Stapelberg <michael@stapelberg.de>
Mon, 7 Nov 2011 21:34:39 +0000 (21:34 +0000)
src/ipc.c

index b94ef6131b70ebcf0cab89edb3efd6ead60972a2..0a738427eb101f26c669611f1646ab6145f6ee8a 100644 (file)
--- a/src/ipc.c
+++ b/src/ipc.c
@@ -99,9 +99,12 @@ void ipc_send_event(const char *event, uint32_t message_type, const char *payloa
  */
 void ipc_shutdown() {
     ipc_client *current;
-    TAILQ_FOREACH(current, &all_clients, clients) {
+    while (!TAILQ_EMPTY(&all_clients)) {
+        current = TAILQ_FIRST(&all_clients);
         shutdown(current->fd, SHUT_RDWR);
         close(current->fd);
+        TAILQ_REMOVE(&all_clients, current, clients);
+        free(current);
     }
 }
 
@@ -743,10 +746,12 @@ static void ipc_receive_message(EV_P_ struct ev_io *w, int revents) {
             /* We can call TAILQ_REMOVE because we break out of the
              * TAILQ_FOREACH afterwards */
             TAILQ_REMOVE(&all_clients, current, clients);
+            free(current);
             break;
         }
 
         ev_io_stop(EV_A_ w);
+        free(w);
 
         DLOG("IPC: client disconnected\n");
         return;