]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: mark IPC fd CLOEXEC (Thanks Layus)
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 14 Apr 2013 08:12:21 +0000 (10:12 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 14 Apr 2013 08:12:21 +0000 (10:12 +0200)
Without this fix, children of i3bar would inherit the file descriptor of
the IPC connection to i3. Therefore, even if i3bar exits with SIGSEGV,
the connection to i3 stays open. Because nobody actually reads any
messages by i3, the buffer will fill up and i3 can’t deliver any more
messages, and thus busy-loops at that point.

fixes #995

libi3/ipc_connect.c

index 44ff7056e4cb9b0766d9e76a71a8fd280fc072ac..d27e04678e0e50c511addf5b2c8639181227ed04 100644 (file)
@@ -2,7 +2,7 @@
  * vim:ts=4:sw=4:expandtab
  *
  * i3 - an improved dynamic tiling window manager
- * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE)
+ * © 2009-2013 Michael Stapelberg and contributors (see also: LICENSE)
  *
  */
 #include <sys/types.h>
@@ -11,6 +11,8 @@
 #include <string.h>
 #include <err.h>
 #include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
 
 #include "libi3.h"
 
@@ -24,6 +26,8 @@ int ipc_connect(const char *socket_path) {
     if (sockfd == -1)
         err(EXIT_FAILURE, "Could not create socket");
 
+    (void)fcntl(sockfd, F_SETFD, FD_CLOEXEC);
+
     struct sockaddr_un addr;
     memset(&addr, 0, sizeof(struct sockaddr_un));
     addr.sun_family = AF_LOCAL;