summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2012-02-13 21:47:28 +0000
committerPádraig Brady <P@draigBrady.com>2012-02-13 21:58:21 +0000
commit4bb5dbcfef55c4f66755dd3c48b906e4e9030b96 (patch)
tree319a68a46ddbe044f5851891f1826174e5f88360
parent140eca15c4a3d3213629a048cc307fde0d094738 (diff)
downloadcoreutils-4bb5dbcfef55c4f66755dd3c48b906e4e9030b96.tar.xz
dd: fix issues in the count_bytes and seek_bytes flags change
These edge cases were missed in the previous commit 140eca15c. * src/dd.c (main): Include the bytes slop when truncating without further I/O. Don't invalidate the whole file cache in the case where 0 < count < ibs. * tests/dd/bytes: Change to using the independent truncate command to generate the file for comparison. Remove a redundant test case and replace with one testing the truncation only logic.
-rw-r--r--src/dd.c8
-rwxr-xr-xtests/dd/bytes11
2 files changed, 9 insertions, 10 deletions
diff --git a/src/dd.c b/src/dd.c
index e7f40379b..fe44a30d1 100644
--- a/src/dd.c
+++ b/src/dd.c
@@ -1917,7 +1917,7 @@ dd_copy (void)
while (1)
{
- if (r_partial + r_full >= max_records + (max_bytes ? 1 : 0))
+ if (r_partial + r_full >= max_records + !!max_bytes)
break;
/* Zero the buffer before reading, so that if we get a read error,
@@ -2170,7 +2170,7 @@ main (int argc, char **argv)
if (seek_records != 0 && !(conversions_mask & C_NOTRUNC))
{
- uintmax_t size = seek_records * output_blocksize;
+ uintmax_t size = seek_records * output_blocksize + seek_bytes;
unsigned long int obs = output_blocksize;
if (OFF_T_MAX / output_blocksize < seek_records)
@@ -2207,7 +2207,7 @@ main (int argc, char **argv)
exit_status = dd_copy ();
- if (max_records == 0)
+ if (max_records == 0 && max_bytes == 0)
{
/* Special case to invalidate cache to end of file. */
if (i_nocache && !invalidate_cache (STDIN_FILENO, 0))
@@ -2225,7 +2225,7 @@ main (int argc, char **argv)
}
else if (max_records != (uintmax_t) -1)
{
- /* Invalidate any pending region less that page size,
+ /* Invalidate any pending region less than page size,
in case the kernel might round up. */
if (i_nocache)
invalidate_cache (STDIN_FILENO, 0);
diff --git a/tests/dd/bytes b/tests/dd/bytes
index 603874290..15755aae3 100755
--- a/tests/dd/bytes
+++ b/tests/dd/bytes
@@ -45,13 +45,12 @@ esac
# seek bytes
echo abcdefghijklm |
dd bs=5 seek=8 oflag=seek_bytes > out 2> /dev/null || fail=1
-echo abcdefghijklm |
- dd bs=4 seek=2 > expected 2> /dev/null || fail=1
+printf '\0\0\0\0\0\0\0\0abcdefghijklm\n' > expected
compare expected out || fail=1
-# seek bytes on empty file
-echo abcdefghijklm |
- dd bs=5 seek=8 oflag=seek_bytes > out2 2> /dev/null || fail=1
-compare expected out2 || fail=1
+# Just truncation, no I/O
+dd bs=5 seek=8 oflag=seek_bytes of=out2 count=0 2> /dev/null || fail=1
+truncate -s8 expected2
+compare expected2 out2 || fail=1
Exit $fail