mirror of
git://git.sv.gnu.org/coreutils.git
synced 2026-04-20 18:56:39 +02:00
Since direct I/O is now enabled with commit v8.21-139-gebaf961 we must handle the case where we write an odd size at the end of a file (with --exact), or we specify an odd --size that is larger than 64KiB, or in the very unlikely case of a device with an odd size. This issue was present since direct I/O support was first added in v5.3.0, but latent since v6.0. Theoretically this could have also been an issue after that on systems which didn't have alignment constraints, but did have size constraints for direct I/O. * src/shred.c (dopass): On the first pass for a file, always retry a write that fails with EINVAL, so we handle direct I/O failure at either the start or end of the file. Adjust the comment as the original case is out of date and implicitly handled by this more general fix. * tests/misc/shred-exact.sh: Add a test case. * NEWS: Add a "bug fix" entry for shred since there are two related issues now fixed.
46 lines
1.4 KiB
Bash
Executable File
46 lines
1.4 KiB
Bash
Executable File
#!/bin/sh
|
|
# Test functionality of --exact
|
|
|
|
# Copyright (C) 2000-2013 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_ shred
|
|
|
|
|
|
# make sure that neither --exact nor --zero gobbles a command line argument
|
|
for opt in --exact --zero; do
|
|
echo a > a || fail=1
|
|
echo bb > b || fail=1
|
|
echo ccc > c || fail=1
|
|
|
|
shred --remove $opt a b || fail=1
|
|
test -f a && fail=1
|
|
test -f b && fail=1
|
|
|
|
shred --remove $opt c || fail=1
|
|
test -f c && fail=1
|
|
done
|
|
|
|
|
|
# make sure direct I/O is handled appropriately at end of file
|
|
# Create a 1MiB file as we'll probably not be using blocks larger than that
|
|
# (i.e. we want to test failed writes not at the start).
|
|
truncate -s1MiB file.slop || framework_failure_
|
|
truncate -s+1 file.slop || framework_failure_
|
|
shred --exact -n1 file.slop || fail=1
|
|
|
|
Exit $fail
|