]> git.sur5r.net Git - i3/i3/commitdiff
libi3/root_atom_contents: Free xcb reply structures
authorLancelot SIX <lancelot@lancleotsix.com>
Sat, 23 Nov 2013 10:56:28 +0000 (11:56 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 24 Nov 2013 12:52:31 +0000 (13:52 +0100)
Free memory allocated during xcb calls.

libi3/root_atom_contents.c

index 697441ebadf8588f254bb53597032b4ab06dc4b4..236f1b994d03aa13cc98ae2d7a2872167de50674 100644 (file)
@@ -9,6 +9,7 @@
 #include <string.h>
 #include <stdbool.h>
 #include <limits.h>
+#include <stdlib.h>
 
 #include <xcb/xcb.h>
 #include <xcb/xcb_aux.h>
@@ -51,20 +52,35 @@ char *root_atom_contents(const char *atomname, xcb_connection_t *provided_conn,
     prop_cookie = xcb_get_property_unchecked(conn, false, root, atom_reply->atom,
                                              XCB_GET_PROPERTY_TYPE_ANY, 0, PATH_MAX);
     prop_reply = xcb_get_property_reply(conn, prop_cookie, NULL);
-    if (prop_reply == NULL || xcb_get_property_value_length(prop_reply) == 0)
+    if (prop_reply == NULL) {
+        free(atom_reply);
         return NULL;
+    }
+    if (xcb_get_property_value_length(prop_reply) == 0) {
+        free(atom_reply);
+        free(prop_reply);
+        return NULL;
+    }
     if (prop_reply->type == XCB_ATOM_CARDINAL) {
         /* We treat a CARDINAL as a >= 32-bit unsigned int. The only CARDINAL
          * we query is I3_PID, which is 32-bit. */
-        if (asprintf(&content, "%u", *((unsigned int*)xcb_get_property_value(prop_reply))) == -1)
+        if (asprintf(&content, "%u", *((unsigned int*)xcb_get_property_value(prop_reply))) == -1) {
+            free(atom_reply);
+            free(prop_reply);
             return NULL;
+        }
     } else {
         if (asprintf(&content, "%.*s", xcb_get_property_value_length(prop_reply),
-                     (char*)xcb_get_property_value(prop_reply)) == -1)
+                     (char*)xcb_get_property_value(prop_reply)) == -1) {
+            free(atom_reply);
+            free(prop_reply);
             return NULL;
+        }
     }
     if (provided_conn == NULL)
         xcb_disconnect(conn);
+    free(atom_reply);
+    free(prop_reply);
     return content;
 }