From 2771d66e4fdb2e2d158d092ead543638115971f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?= Date: Sun, 29 Oct 2017 15:29:05 -0700 Subject: [PATCH] df: fix hang with fifo argument * src/df.c (main): stat() before open(), and avoid the optional open when given a fifo argument. * tests/df/unreadable.sh: Add a test case. * NEWS: Mention the fix. Fixes https://bugs.gnu.org/29038 --- NEWS | 3 +++ src/df.c | 13 ++++++++----- tests/df/unreadable.sh | 3 +++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index 806e3ef..3e6704d 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,9 @@ GNU coreutils NEWS -*- outline -*- invalidated. [bug introduced for "direct" in coreutils-7.5, and with the "nocache" implementation in coreutils-8.11] + df no longer hangs when given a fifo argument. + [bug introduced in coreutils-7.3] + ptx -S no longer infloops for a pattern which returns zero-length matches. [the bug dates back to the initial implementation] diff --git a/src/df.c b/src/df.c index 7345bc9..ee04d51 100644 --- a/src/df.c +++ b/src/df.c @@ -1710,16 +1710,19 @@ main (int argc, char **argv) { /* Prefer to open with O_NOCTTY and use fstat, but fall back on using "stat", in case the file is unreadable. */ - int fd = open (argv[i], O_RDONLY | O_NOCTTY); - if ((fd < 0 || fstat (fd, &stats[i - optind])) - && stat (argv[i], &stats[i - optind])) + if (stat (argv[i], &stats[i - optind])) { error (0, errno, "%s", quotef (argv[i])); exit_status = EXIT_FAILURE; argv[i] = NULL; } - if (0 <= fd) - close (fd); + else if (! S_ISFIFO (stats[i - optind].st_mode)) + { + /* open() is needed to automount in some cases. */ + int fd = open (argv[i], O_RDONLY | O_NOCTTY); + if (0 <= fd) + close (fd); + } } } diff --git a/tests/df/unreadable.sh b/tests/df/unreadable.sh index c28cdc9..fb4c91c 100755 --- a/tests/df/unreadable.sh +++ b/tests/df/unreadable.sh @@ -24,6 +24,9 @@ touch unreadable || fail=1 chmod a-r unreadable || fail=1 df unreadable || fail=1 +mkfifo_or_skip_ fifo +timeout 10 df fifo || fail=1 + test "$fail" = 1 && dump_mount_list_ Exit $fail -- 2.9.3