]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: ipc_receive_message reply leak
authorTony Crisci <tony@dubstepdish.com>
Sat, 8 Mar 2014 04:56:25 +0000 (23:56 -0500)
committerMichael Stapelberg <michael@stapelberg.de>
Sat, 8 Mar 2014 19:58:56 +0000 (20:58 +0100)
The function ipc_recv_message in libi3 allocates memory to the location
of the `message` reply in src/ipc_receive_message.c with malloc and must
be freed.

This memory leak was found using valgrind.

src/ipc.c

index 4247ca5c88fbb8db4f031ee7a6e81981ee8f1e61..74edc741c2a5ba2a8d27d8e91576d89ddba9998e 100644 (file)
--- a/src/ipc.c
+++ b/src/ipc.c
@@ -833,14 +833,16 @@ handler_t handlers[8] = {
 static void ipc_receive_message(EV_P_ struct ev_io *w, int revents) {
     uint32_t message_type;
     uint32_t message_length;
-    uint8_t *message;
+    uint8_t *message = NULL;
 
     int ret = ipc_recv_message(w->fd, &message_type, &message_length, &message);
     /* EOF or other error */
     if (ret < 0) {
         /* Was this a spurious read? See ev(3) */
-        if (ret == -1 && errno == EAGAIN)
+        if (ret == -1 && errno == EAGAIN) {
+            FREE(message);
             return;
+        }
 
         /* If not, there was some kind of error. We don’t bother
          * and close the connection */
@@ -863,6 +865,7 @@ static void ipc_receive_message(EV_P_ struct ev_io *w, int revents) {
 
         ev_io_stop(EV_A_ w);
         free(w);
+        FREE(message);
 
         DLOG("IPC: client disconnected\n");
         return;
@@ -874,6 +877,8 @@ static void ipc_receive_message(EV_P_ struct ev_io *w, int revents) {
         handler_t h = handlers[message_type];
         h(w->fd, message, 0, message_length, message_type);
     }
+
+    FREE(message);
 }
 
 /*