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.
This commit is contained in:
parent
38e16b4907
commit
cf4e7083ed
|
@ -256,6 +256,16 @@ example: \"/foo/bar\" yields '(\"foo\" \"bar\")."
|
||||||
(response-headers response)
|
(response-headers response)
|
||||||
eq?)))
|
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)
|
(define (http-write server client response body)
|
||||||
"Write RESPONSE and BODY to CLIENT, possibly in a separate thread to avoid
|
"Write RESPONSE and BODY to CLIENT, possibly in a separate thread to avoid
|
||||||
blocking."
|
blocking."
|
||||||
|
@ -274,7 +284,8 @@ blocking."
|
||||||
;; way to avoid building the whole nar in memory, which could
|
;; way to avoid building the whole nar in memory, which could
|
||||||
;; quickly become a real problem. As a bonus, we even do
|
;; quickly become a real problem. As a bonus, we even do
|
||||||
;; sendfile(2) directly from the store files to the socket.
|
;; 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)
|
(close-port port)
|
||||||
(values)))))
|
(values)))))
|
||||||
(_
|
(_
|
||||||
|
|
Loading…
Reference in New Issue