emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 5c41240 4/4: emacsclient: don’t leak socket to chi


From: Paul Eggert
Subject: [Emacs-diffs] master 5c41240 4/4: emacsclient: don’t leak socket to child processes
Date: Mon, 3 Dec 2018 02:55:08 -0500 (EST)

branch: master
commit 5c412405c7422b356484a933179f852c30ce2f24
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>

    emacsclient: don’t leak socket to child processes
    
    * lib-src/emacsclient.c [!WINDOWSNT]: Include fcntl.h.
    (cloexec_socket): New function.
    (set_tcp_socket, set_local_socket): Use it.
---
 lib-src/emacsclient.c | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c
index 1c62c09..a428788 100644
--- a/lib-src/emacsclient.c
+++ b/lib-src/emacsclient.c
@@ -50,6 +50,7 @@ char *w32_getenv (const char *);
 # include "syswait.h"
 
 # include <arpa/inet.h>
+# include <fcntl.h>
 # include <netinet/in.h>
 # include <sys/socket.h>
 # include <sys/un.h>
@@ -976,6 +977,24 @@ get_server_config (const char *config_file, struct 
sockaddr_in *server,
   return true;
 }
 
+/* Like socket (DOMAIN, TYPE, PROTOCOL), except arrange for the
+   resulting file descriptor to be close-on-exec.  */
+
+static HSOCKET
+cloexec_socket (int domain, int type, int protocol)
+{
+#ifdef SOCK_CLOEXEC
+  return socket (domain, type | SOCK_CLOEXEC, protocol);
+#else
+  HSOCKET s = socket (domain, type, protocol);
+# ifndef WINDOWSNT
+  if (0 <= s)
+    fcntl (s, F_SETFD, FD_CLOEXEC);
+# endif
+  return s;
+#endif
+}
+
 static HSOCKET
 set_tcp_socket (const char *local_server_file)
 {
@@ -994,7 +1013,7 @@ set_tcp_socket (const char *local_server_file)
             progname, inet_ntoa (server.in.sin_addr));
 
   /* Open up an AF_INET socket.  */
-  HSOCKET s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
+  HSOCKET s = cloexec_socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
   if (s < 0)
     {
       /* Since we have an alternate to try out, this is not an error
@@ -1404,7 +1423,7 @@ set_local_socket (char const *server_name)
 
   if (sock_status == 0)
     {
-      HSOCKET s = socket (AF_UNIX, SOCK_STREAM, 0);
+      HSOCKET s = cloexec_socket (AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
       if (s < 0)
        {
          message (true, "%s: socket: %s\n", progname, strerror (errno));



reply via email to

[Prev in Thread] Current Thread [Next in Thread]