From f00cfdfae53d8ef623238ecb1001969b5f649cbd Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 18 Sep 2009 20:49:36 +0200 Subject: [PATCH] dd: fix conv=noerror w/o sync to not write out zeroed blocks function old new delta dd_main 1480 1463 -17 Signed-off-by: Denys Vlasenko --- coreutils/dd.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/coreutils/dd.c b/coreutils/dd.c index 3fdfc236a..627e7e7b5 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; } }