diff options
author | Pádraig Brady <P@draigBrady.com> | 2014-06-24 15:34:39 +0100 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2014-06-25 09:55:12 +0100 |
commit | d71c12f1e4e165c7da59989b49ded2805b7977cc (patch) | |
tree | 51dc1d73c2d81c7d28feddc6fe6c535fca829897 /tests | |
parent | 828801a174de8fa6e492f311210c37394f13b30f (diff) | |
download | coreutils-d71c12f1e4e165c7da59989b49ded2805b7977cc.tar.xz |
df: report correct device in presence of eclipsed mounts
* src/df.c (last_device_for_mount): A new function to identify
the last device mounted for a mount point.
(get_disk): Use the above to discard mount entries for a device,
where a later mount entry uses a different device name than
that of the user specified device.
* tests/df/over-mount-device.sh: A new root test.
* tests/local.mk: Reference the new test.
* NEWS: Reword for all these related recent fixes.
Discussed at: http://bugs.gnu.org/16539#69
Diffstat (limited to 'tests')
-rwxr-xr-x | tests/df/over-mount-device.sh | 57 | ||||
-rw-r--r-- | tests/local.mk | 1 |
2 files changed, 58 insertions, 0 deletions
diff --git a/tests/df/over-mount-device.sh b/tests/df/over-mount-device.sh new file mode 100755 index 000000000..a85ce8dbf --- /dev/null +++ b/tests/df/over-mount-device.sh @@ -0,0 +1,57 @@ +#!/bin/sh +# Ensure that df /dev/loop0 errors out if overmounted by another device + +# Copyright (C) 2014 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/>. + +. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src +print_ver_ df +require_root_ + +cwd=$(pwd) +cleanup_() { cd /; umount "$cwd/mnt"; umount "$cwd/mnt"; } + +skip=0 + +# Create 2 file systems +for i in 1 2; do + dd if=/dev/zero of=blob$i bs=8192 count=200 > /dev/null 2>&1 \ + || skip=1 + mkfs -t ext2 -F blob$i \ + || skip_ "failed to create ext2 file system" +done + +# Mount both at the same place (eclipsing the first) +mkdir mnt || skip=1 +mount -oloop blob1 mnt || skip=1 +eclipsed_dev=$(df --o=source mnt | tail -n1) || skip=1 +mount -oloop blob2 mnt || skip=1 + +test $skip = 1 \ + && skip_ "insufficient mount/ext2 support" + +df . || skip_ "failed to lookup the device for the current dir" + +echo "df: cannot access '$eclipsed_dev': over-mounted by another device" > exp + +# We should get an error for the eclipsed device and continue +df $eclipsed_dev . > out 2> err && fail=1 + +# header and single entry in output +test $(wc -l < out) = 2 || fail=1 + +compare exp err || fail=1 + +Exit $fail diff --git a/tests/local.mk b/tests/local.mk index cd7da5b2f..86050dc79 100644 --- a/tests/local.mk +++ b/tests/local.mk @@ -115,6 +115,7 @@ all_root_tests = \ tests/cp/sparse-fiemap.sh \ tests/dd/skip-seek-past-dev.sh \ tests/df/problematic-chars.sh \ + tests/df/over-mount-device.sh \ tests/du/bind-mount-dir-cycle.sh \ tests/id/setgid.sh \ tests/install/install-C-root.sh \ |