[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."