[git commit master] dd: fix conv=noerror w/o sync to not write out zeroed blocks
Denys Vlasenko
vda.linux at googlemail.com
Fri Sep 18 18:49:36 UTC 2009
commit: http://git.busybox.net/busybox/commit/?id=f00cfdfae53d8ef623238ecb1001969b5f649cbd
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master
function old new delta
dd_main 1480 1463 -17
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
coreutils/dd.c | 11 ++++++-----
1 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/coreutils/dd.c b/coreutils/dd.c
index 3fdfc23..627e7e7 100644
--- a/coreutils/dd.c
+++ b/coreutils/dd.c
@@ -286,25 +286,26 @@ int dd_main(int argc UNUSED_PARAM, char **argv)
}
while (!(flags & FLAG_COUNT) || (G.in_full + G.in_part != count)) {
- if (flags & FLAG_NOERROR) /* Pre-zero the buffer if conv=noerror */
- memset(ibuf, 0, ibs);
n = safe_read(ifd, ibuf, ibs);
if (n == 0)
break;
if (n < 0) {
+ /* "Bad block" */
if (!(flags & FLAG_NOERROR))
goto die_infile;
- n = ibs;
bb_simple_perror_msg(infile);
- /* GNU dd with conv=noerror skips over "bad blocks" */
+ /* GNU dd with conv=noerror skips over bad blocks */
xlseek(ifd, ibs, SEEK_CUR);
+ /* conv=noerror,sync writes NULs,
+ * conv=noerror just ignores input bad blocks */
+ n = 0;
}
if ((size_t)n == ibs)
G.in_full++;
else {
G.in_part++;
if (flags & FLAG_SYNC) {
- memset(ibuf + n, '\0', ibs - n);
+ memset(ibuf + n, 0, ibs - n);
n = ibs;
}
}
--
1.6.3.3
More information about the busybox-cvs
mailing list