From 90181a5926e96f34b5ffff21b81a2874a846ff6f Mon Sep 17 00:00:00 2001 From: =?utf8?q?P=C3=A1draig=20Brady?= Date: Thu, 7 Nov 2013 12:32:29 +0000 Subject: [PATCH] shred: avoid data write pass with --size=0 * src/shred.c (dopass): Exit early to avoid redundant heap allocation, and more importantly avoiding a file sync when we're writting no data, as this can have side effects. Also with --verbose, this avoids printing of "pass status" which could be confusing as to whether data was actually written. * tests/misc/shred-passes.sh: Ensure the status for data passes are not written when not doing any data writes. --- src/shred.c | 4 ++++ tests/misc/shred-passes.sh | 14 +++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/shred.c b/src/shred.c index 6ff8322c9c..95a255a5b5 100644 --- a/src/shred.c +++ b/src/shred.c @@ -378,6 +378,10 @@ dopass (int fd, char const *qname, off_t *sizep, int type, size_t soff; /* Offset into buffer for next write */ ssize_t ssize; /* Return value from write */ + /* Do nothing for --size=0 or regular empty files with --exact. */ + if (size == 0) + return 0; + /* Fill pattern buffer. Aligning it to a page so we can do direct I/O. */ size_t page_size = getpagesize (); #define PERIODIC_OUTPUT_SIZE (60 * 1024) diff --git a/tests/misc/shred-passes.sh b/tests/misc/shred-passes.sh index cfdd68e982..938683bcec 100755 --- a/tests/misc/shred-passes.sh +++ b/tests/misc/shred-passes.sh @@ -31,9 +31,21 @@ shred: f: removing shred: f: renamed to 0 shred: f: removed" > exp || framework_failure_ - shred -v -u f 2>out || fail=1 compare exp out || fail=1 +# Likewise but with --exact to bypass the +# data passes for the zero length file +touch f || framework_failure_ +echo "\ +shred: f: removing +shred: f: renamed to 0 +shred: f: removed" > exp || framework_failure_ + +shred -x -v -u f 2>out || fail=1 + +compare exp out || fail=1 + + Exit $fail -- 2.47.2