From cf4e7083ed1bc89b9585f0121ebb6c56c291d0ad Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Tue, 6 Oct 2015 23:45:38 +0200 Subject: publish: Fix file descriptor leak. A client closing the connection while reading from a /nar URL would leave an open file descriptor in the server. This patch fixes it. * guix/scripts/publish.scm (swallow-EPIPE): New macro. (http-write): Use it around 'write-file' call. --- guix/scripts/publish.scm | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'guix/scripts/publish.scm') diff --git a/guix/scripts/publish.scm b/guix/scripts/publish.scm index e352090d2d..fb7b4218e0 100644 --- a/guix/scripts/publish.scm +++ b/guix/scripts/publish.scm @@ -256,6 +256,16 @@ (define (sans-content-length response) (response-headers response) eq?))) +(define-syntax-rule (swallow-EPIPE exp ...) + "Swallow EPIPE errors raised by EXP..." + (catch 'system-error + (lambda () + exp ...) + (lambda args + (if (= EPIPE (system-error-errno args)) + (values) + (apply throw args))))) + (define (http-write server client response body) "Write RESPONSE and BODY to CLIENT, possibly in a separate thread to avoid blocking." @@ -274,7 +284,8 @@ (define (http-write server client response body) ;; way to avoid building the whole nar in memory, which could ;; quickly become a real problem. As a bonus, we even do ;; sendfile(2) directly from the store files to the socket. - (write-file (utf8->string body) port) + (swallow-EPIPE + (write-file (utf8->string body) port)) (close-port port) (values))))) (_ -- cgit v1.2.3