bin/185070: [patch] dd(1) add better error message when partial write to dev

Chang-Hsien Tsai luke.tw at gmail.com
Sat Dec 21 14:40:01 UTC 2013


>Number:         185070
>Category:       bin
>Synopsis:       [patch] dd(1) add better error message when partial write to dev
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sat Dec 21 14:40:00 UTC 2013
>Closed-Date:
>Last-Modified:
>Originator:     Chang-Hsien Tsai
>Release:        FreeBSD 10.0-RC2
>Organization:
>Environment:
FreeBSD bsd10 10.0-RC2 FreeBSD 10.0-RC2 #0 r259404: Sun Dec 15 08:18:20 UTC 2013     root at snap.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64

>Description:
when dd writes to a device, the error message is misleading if the write size is less than the sector size of the device.
>How-To-Repeat:
1. create input files
bsd10# dd if=/dev/random of=/root/512b bs=1 count=512
512+0 records in
512+0 records out
512 bytes transferred in 0.001007 secs (508400 bytes/sec)
bsd10# dd if=/dev/random of=/root/513b bs=1 count=513
513+0 records in
513+0 records out
513 bytes transferred in 0.000936 secs (548059 bytes/sec)

2. dd these input files to /dev/
bsd10# dd if=/root/512b of=/dev/da1
1+0 records in
1+0 records out
512 bytes transferred in 0.005722 secs (89478 bytes/sec)
bsd10# dd if=/root/513b of=/dev/da1
dd: /dev/da1: Invalid argument
1+1 records in
1+0 records out
512 bytes transferred in 0.000363 secs (1410962 bytes/sec)
bsd10# dd if=/root/513b of=/dev/da1 bs=1
dd: /dev/da1: Invalid argument
1+0 records in
0+0 records out
0 bytes transferred in 0.000159 secs (0 bytes/sec)


>Fix:
3. after applying the patch:
bsd10# ./dd if=/root/513b of=/dev/da1
dd: /root/513b: not a multiple of /dev/da1's sector size (512 bytes)
1+1 records in
1+0 records out
512 bytes transferred in 0.003080 secs (166227 bytes/sec)
bsd10# ./dd if=/root/513b of=/dev/da1 bs=1
dd: bs=1: not a multiple of /dev/da1's sector size (512 bytes)
1+0 records in
0+0 records out
0 bytes transferred in 0.000059 secs (0 bytes/sec)

Patch attached with submission follows:

--- dd.c.old	2013-12-21 21:07:38.000000000 +0800
+++ dd.c	2013-12-21 21:57:32.000000000 +0800
@@ -49,6 +49,7 @@
 #include <sys/stat.h>
 #include <sys/conf.h>
 #include <sys/disklabel.h>
+#include <sys/disk.h>
 #include <sys/filio.h>
 #include <sys/time.h>
 
@@ -469,6 +470,17 @@
 			if (nw <= 0) {
 				if (nw == 0)
 					errx(1, "%s: end of device", out.name);
+				if (errno == EINVAL){
+					size_t sectorsz = 0;
+					if (ioctl(out.fd, DIOCGSECTORSIZE , &sectorsz) == 0) { 
+						if ( out.dbsz % sectorsz)
+							errx(1, "bs=%zu: not a multiple of %s's sector size (%zu bytes)",
+									out.dbsz, out.name, sectorsz);
+						else if (cnt < sectorsz)
+							errx(1, "%s: not a multiple of %s's sector size (%zu bytes)",
+									in.name, out.name, sectorsz);
+					}
+				}
 				if (errno != EINTR)
 					err(1, "%s", out.name);
 				nw = 0;


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list