~ruther/guix-local

4e431fda5f2ec76b6d6a271be7c30b1324431329 — Ludovic Courtès 2 years ago 5cec983
services: shepherd: Remove ‘dynamic-wind’ in ‘call-with-*-file’.

Fixes <https://issues.guix.gnu.org/64653>.

The ‘dynamic-wind’ was causing files to be closed prematurely when
leaving the dynamic extent of PROC for instance via a delimited
continuation, using Fibers (that ‘dynamic-wind’ call was also
semantically incorrect in the first place).

* gnu/services/shepherd.scm (shepherd-configuration-file)
[config](call-with-file): Remove.
(call-with-input-file, call-with-output-file): Rewrite in terms of
‘call-with-port’.

Change-Id: Ica8af71a04f525a15be99985552063cb98cd6ee8
1 files changed, 5 insertions(+), 16 deletions(-)

M gnu/services/shepherd.scm
M gnu/services/shepherd.scm => gnu/services/shepherd.scm +5 -16
@@ 1,5 1,5 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013-2016, 2018-2023 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2013-2016, 2018-2024 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org>
;;; Copyright © 2018 Carlo Zancanaro <carlo@zancanaro.id.au>
;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>


@@ 371,17 371,6 @@ as shepherd package."
          (use-modules (srfi srfi-34)
                       (system repl error-handling))

          (define (call-with-file file flags proc)
            (let ((port #f))
              (dynamic-wind
                (lambda ()
                  (set! port (open file flags)))
                (lambda ()
                  (proc port))
                (lambda ()
                  (close-port port)
                  (set! port #f)))))

          ;; There's code run from shepherd that uses 'call-with-input-file' &
          ;; co.--e.g., the 'urandom-seed' service.  Starting from Shepherd
          ;; 0.9.2, users need to make sure not to leak non-close-on-exec file


@@ 389,12 378,12 @@ as shepherd package."
          ;; standard bindings with O_CLOEXEC variants.
          (set! call-with-input-file
                (lambda (file proc)
                  (call-with-file file (logior O_RDONLY O_CLOEXEC)
                                  proc)))
                  (call-with-port (open file (logior O_RDONLY O_CLOEXEC))
                    proc)))
          (set! call-with-output-file
                (lambda (file proc)
                  (call-with-file file (logior O_WRONLY O_CREAT O_CLOEXEC)
                                  proc)))
                  (call-with-port (open file (logior O_WRONLY O_CREAT O_CLOEXEC))
                    proc)))

          ;; Specify the default environment visible to all the services.
          ;; Without this statement, all the environment variables of PID 1