summaryrefslogtreecommitdiff
path: root/package/busybox/busybox-1.15.1-dd.patch
blob: a3e267625774bba6fa7e16b587e5d05176604794 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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;
 			}
 		}