summaryrefslogtreecommitdiff
path: root/package/busybox/busybox-1.15.1-dd.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/busybox/busybox-1.15.1-dd.patch')
-rw-r--r--package/busybox/busybox-1.15.1-dd.patch35
1 files changed, 35 insertions, 0 deletions
diff --git a/package/busybox/busybox-1.15.1-dd.patch b/package/busybox/busybox-1.15.1-dd.patch
new file mode 100644
index 000000000..a3e267625
--- /dev/null
+++ b/package/busybox/busybox-1.15.1-dd.patch
@@ -0,0 +1,35 @@
+diff -urpN busybox-1.15.1/coreutils/dd.c busybox-1.15.1-dd/coreutils/dd.c
+--- busybox-1.15.1/coreutils/dd.c 2009-09-12 17:55:58.000000000 +0200
++++ busybox-1.15.1-dd/coreutils/dd.c 2009-09-18 20:48:22.000000000 +0200
+@@ -286,25 +286,26 @@ int dd_main(int argc UNUSED_PARAM, char
+ }
+
+ 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;
+ }
+ }