diff options
author | Ludovic Courtès <ludo@gnu.org> | 2015-10-06 23:45:38 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2015-10-06 23:51:04 +0200 |
commit | cf4e7083ed1bc89b9585f0121ebb6c56c291d0ad (patch) | |
tree | 64820fa49509119367d02f6194519a75f361c792 | |
parent | 38e16b49073dd9ea81c3320a84708c4b4d7c60e6 (diff) | |
download | guix-cf4e7083ed1bc89b9585f0121ebb6c56c291d0ad.tar guix-cf4e7083ed1bc89b9585f0121ebb6c56c291d0ad.tar.gz |
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.
-rw-r--r-- | guix/scripts/publish.scm | 13 |
1 files changed, 12 insertions, 1 deletions
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 @@ example: \"/foo/bar\" yields '(\"foo\" \"bar\")." (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 @@ blocking." ;; 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))))) (_ |