diff options
author | Jim Meyering <meyering@redhat.com> | 2009-09-03 19:36:34 +0200 |
---|---|---|
committer | Jim Meyering <meyering@redhat.com> | 2009-09-03 19:52:47 +0200 |
commit | e0e8429c2433bd9820f42250236badc585bd9dd7 (patch) | |
tree | 12128f28af5a7c86f570058a2531c6031355bf4a | |
parent | 1422cabf930572f22849c55914352e915af1f677 (diff) | |
download | coreutils-e0e8429c2433bd9820f42250236badc585bd9dd7.tar.xz |
df: don't fail due to an unreadable argument
* src/df.c (main): If open or fstat fails when we're trying to ensure
that all arg-partitions are automounted, fall back on using stat.
Inspired by the report and patch from Olivier Fourdan in
http://bugzilla.redhat.com/520630.
* NEWS (Bug fixes): Mention it.
* tests/df/unreadable: New test for the above.
* tests/Makefile.am (TESTS): Add df/unreadable.
The bug was introduced in coreutils-7.3 via commit dbd17157,
2009-04-28, "df: use open(2), not stat, to trigger automounting".
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | THANKS | 1 | ||||
-rw-r--r-- | src/df.c | 5 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rwxr-xr-x | tests/df/unreadable | 32 |
5 files changed, 41 insertions, 1 deletions
@@ -19,6 +19,9 @@ GNU coreutils NEWS -*- outline -*- printing a summary to stderr. [bug introduced in coreutils-6.11] + df no longer requires that each command-line argument be readable + [bug introduced in coreutils-7.3] + ls -i now prints consistent inode numbers also for mount points. This makes ls -i DIR less efficient on systems with dysfunctional readdir, because ls must stat every file in order to obtain a guaranteed-valid @@ -440,6 +440,7 @@ Olatunji Oluwabukunmi Ruwase tjruwase@stanford.edu Olav Morkrid olav@funcom.com Ole Laursen olau@hardworking.dk Oliver Kiddle okiddle@yahoo.co.uk +Olivier Fourdan ofourdan@redhat.com Ørn E. Hansen oehansen@daimi.aau.dk Oskar Liljeblad osk@hem.passagen.se Otavio Salvador otavio@ossystems.com.br @@ -994,8 +994,11 @@ main (int argc, char **argv) stats = xnmalloc (argc - optind, sizeof *stats); for (i = optind; i < argc; ++i) { + /* 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])) + if ((fd < 0 || fstat (fd, &stats[i - optind])) + && stat (argv[i], &stats[i - optind])) { error (0, errno, "%s", quote (argv[i])); exit_status = EXIT_FAILURE; diff --git a/tests/Makefile.am b/tests/Makefile.am index 0151cb091..d9ff95be4 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -300,6 +300,7 @@ TESTS = \ cp/src-base-dot \ cp/symlink-slash \ cp/thru-dangling \ + df/unreadable \ dd/direct \ dd/misc \ dd/not-rewound \ diff --git a/tests/df/unreadable b/tests/df/unreadable new file mode 100755 index 000000000..8e6002860 --- /dev/null +++ b/tests/df/unreadable @@ -0,0 +1,32 @@ +#!/bin/sh +# ensure that df can handle an unreadable argument + +# Copyright (C) 2009 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +if test "$VERBOSE" = yes; then + set -x + df --version +fi + +. $srcdir/test-lib.sh +skip_if_root_ + +fail=0 +touch unreadable || fail=1 +chmod a-r unreadable || fail=1 +df unreadable || fail=1 + +Exit $fail |