diff options
author | Ludovic Courtès <ludo@gnu.org> | 2019-04-29 21:39:38 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2019-04-29 21:39:38 +0200 |
commit | c21d912a027056c30ee86c1ce021322e89f474c3 (patch) | |
tree | f2647db47a3b51e050ca80cdf59f068bb29b549e | |
parent | 6b99afeef89233b71d113a63cf04a6b4b49a4679 (diff) | |
download | patches-c21d912a027056c30ee86c1ce021322e89f474c3.tar patches-c21d912a027056c30ee86c1ce021322e89f474c3.tar.gz |
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'.
-rw-r--r-- | guix/scripts/processes.scm | 15 |
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> |