guix-commits
[Top][All Lists]
Advanced

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

[shepherd] 02/02: service: inetd: Close socket when an exception is caug


From: Ludovic Courtès
Subject: [shepherd] 02/02: service: inetd: Close socket when an exception is caught.
Date: Mon, 2 May 2022 17:11:14 -0400 (EDT)

civodul pushed a commit to branch master
in repository shepherd.

commit b4a30a309f0e9451a671691b19fa7a5e1ef92b69
Author: Ludovic Courtès <ludo@gnu.org>
AuthorDate: Mon May 2 22:47:11 2022 +0200

    service: inetd: Close socket when an exception is caught.
    
    This avoids a file descriptor leak when, for example, 'bind' throws an
    EADDRINUSE 'system-error' exception.
    
    Fixes <https://issues.guix.gnu.org/55223>.
    
    * modules/shepherd/service.scm (make-inetd-constructor): Catch
    exceptions after 'socket' call and close SOCK upon exception.
---
 modules/shepherd/service.scm | 43 ++++++++++++++++++++++++-------------------
 1 file changed, 24 insertions(+), 19 deletions(-)

diff --git a/modules/shepherd/service.scm b/modules/shepherd/service.scm
index 850d349..81bd667 100644
--- a/modules/shepherd/service.scm
+++ b/modules/shepherd/service.scm
@@ -1422,29 +1422,34 @@ rejecting connection from ~:[~a~;~*local process~].")
         (loop))))
 
   (lambda args
-    (let ((sock  (non-blocking-port
-                  (socket (sockaddr:fam address) socket-style 0)))
-          (owner (if (integer? socket-owner)
+    (let ((owner (if (integer? socket-owner)
                      socket-owner
                      (passwd:uid (getpwnam socket-owner))))
           (group (if (integer? socket-group)
                      socket-group
-                     (group:gid (getgrnam socket-group)))))
-      (setsockopt sock SOL_SOCKET SO_REUSEADDR 1)
-
-      (when (= AF_UNIX (sockaddr:fam address))
-        (mkdir-p (dirname (sockaddr:path address))
-                 socket-directory-permissions)
-        (chown (dirname (sockaddr:path address)) owner group)
-        (catch-system-error (delete-file (sockaddr:path address))))
-      (bind sock address)
-      (when (= AF_UNIX (sockaddr:fam address))
-        (chown sock owner group)
-        (chmod sock #o666))
-
-      (listen sock listen-backlog)
-      (spawn-fiber (accept-clients sock))
-      sock)))
+                     (group:gid (getgrnam socket-group))))
+          (sock  (socket (sockaddr:fam address) socket-style 0)))
+      (catch #t
+        (lambda ()
+          (non-blocking-port sock)
+          (setsockopt sock SOL_SOCKET SO_REUSEADDR 1)
+
+          (when (= AF_UNIX (sockaddr:fam address))
+            (mkdir-p (dirname (sockaddr:path address))
+                     socket-directory-permissions)
+            (chown (dirname (sockaddr:path address)) owner group)
+            (catch-system-error (delete-file (sockaddr:path address))))
+          (bind sock address)
+          (when (= AF_UNIX (sockaddr:fam address))
+            (chown sock owner group)
+            (chmod sock #o666))
+
+          (listen sock listen-backlog)
+          (spawn-fiber (accept-clients sock))
+          sock)
+        (lambda args
+          (close-port sock)
+          (apply throw args))))))
 
 (define (make-inetd-destructor)
   "Return a procedure that terminates an inetd service."



reply via email to

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