summaryrefslogtreecommitdiff
path: root/guix/scripts
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2019-04-29 21:39:38 +0200
committerLudovic Courtès <ludo@gnu.org>2019-04-29 21:39:38 +0200
commitc21d912a027056c30ee86c1ce021322e89f474c3 (patch)
treef2647db47a3b51e050ca80cdf59f068bb29b549e /guix/scripts
parent6b99afeef89233b71d113a63cf04a6b4b49a4679 (diff)
processes: 'process-open-files' ignores disappeared /proc/PID/fd entries.
Previously, 'process-open-files' would throw ENOENT if an entry had vanished after the 'scandir' call and before the 'readlink' call. * guix/scripts/processes.scm (process-open-files): Catch ENOENT errors from 'readlink'.
Diffstat (limited to 'guix/scripts')
-rw-r--r--guix/scripts/processes.scm15
1 files changed, 11 insertions, 4 deletions
diff --git a/guix/scripts/processes.scm b/guix/scripts/processes.scm
index 6a2f603599..2dd3bbf30a 100644
--- a/guix/scripts/processes.scm
+++ b/guix/scripts/processes.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2018, 2019 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -103,9 +103,16 @@ processes."
(let ((directory (string-append "/proc/"
(number->string (process-id process))
"/fd")))
- (map (lambda (fd)
- (readlink (string-append directory "/" fd)))
- (or (scandir directory string->number) '()))))
+ (filter-map (lambda (fd)
+ ;; There's a TOCTTOU race here, hence the 'catch'.
+ (catch 'system-error
+ (lambda ()
+ (readlink (string-append directory "/" fd)))
+ (lambda args
+ (if (= ENOENT (system-error-errno args))
+ #f
+ (apply throw args)))))
+ (or (scandir directory string->number) '()))))
;; Daemon session.
(define-record-type <daemon-session>