Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 14 Aug 2014 22:55:25 -0700
From:      William Orr <will@worrbase.com>
To:        freebsd-current@freebsd.org
Subject:   Inconsistent behavior with dd(1)
Message-ID:  <3C86F281-D618-4B93-BBA3-2DA33AC407EC@worrbase.com>

next in thread | raw e-mail | index | archive | help

--Apple-Mail=_233B94A7-E514-471C-8B17-784D39D4D1EA
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=windows-1252

Hey,

I found some inconsistent behavior with dd(1) when it comes to =
specifying arguments in -CURRENT.

 [ worr on terra ] ( ~ ) % dd if=3D/dev/zero of=3D/dev/null =
count=3D18446744073709551616
dd: count: Result too large
 [ worr on terra ] ( ~ ) % dd if=3D/dev/zero of=3D/dev/null =
count=3D18446744073709551617
dd: count: Result too large
 [ worr on terra ] ( ~ ) % dd if=3D/dev/zero of=3D/dev/null =
count=3D18446744073709551615
dd: count cannot be negative
 [ worr on terra ] ( ~ ) % dd if=3D/dev/zero of=3D/dev/null =
count=3D-18446744073709551615
1+0 records in
1+0 records out
512 bytes transferred in 0.000373 secs (1373071 bytes/sec)
 [ worr on terra ] ( ~ ) % dd if=3D/dev/zero of=3D/dev/null count=3D-1
dd: count cannot be negative

=97

Any chance someone has the time and could take a look? =
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D191263

Thanks,
William Orr

=97

Here=92s the patch:

Index: bin/dd/args.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- bin/dd/args.c	(revision 267712)
+++ bin/dd/args.c	(working copy)
@@ -186,46 +186,31 @@
 static void
 f_bs(char *arg)
 {
-	uintmax_t res;
-
-	res =3D get_num(arg);
-	if (res < 1 || res > SSIZE_MAX)
-		errx(1, "bs must be between 1 and %jd", =
(intmax_t)SSIZE_MAX);
-	in.dbsz =3D out.dbsz =3D (size_t)res;
+	in.dbsz =3D out.dbsz =3D get_num(arg);
+	if (in.dbsz < 1 || out.dbsz < 1)
+		errx(1, "bs must be between 1 and %ju", (uintmax_t)-1);
 }
=20
 static void
 f_cbs(char *arg)
 {
-	uintmax_t res;
-
-	res =3D get_num(arg);
-	if (res < 1 || res > SSIZE_MAX)
-		errx(1, "cbs must be between 1 and %jd", =
(intmax_t)SSIZE_MAX);
-	cbsz =3D (size_t)res;
+	cbsz =3D get_num(arg);
+	if (cbsz < 1)
+		errx(1, "cbs must be between 1 and %ju", (uintmax_t)-1);
 }
=20
 static void
 f_count(char *arg)
 {
-	intmax_t res;
-
-	res =3D (intmax_t)get_num(arg);
-	if (res < 0)
-		errx(1, "count cannot be negative");
-	if (res =3D=3D 0)
-		cpy_cnt =3D (uintmax_t)-1;
-	else
-		cpy_cnt =3D (uintmax_t)res;
+	cpy_cnt =3D get_num(arg);
 }
=20
 static void
 f_files(char *arg)
 {
-
 	files_cnt =3D get_num(arg);
 	if (files_cnt < 1)
-		errx(1, "files must be between 1 and %jd", =
(uintmax_t)-1);
+		errx(1, "files must be between 1 and %ju", =
(uintmax_t)-1);
 }
=20
 static void
@@ -241,14 +226,10 @@
 static void
 f_ibs(char *arg)
 {
-	uintmax_t res;
-
 	if (!(ddflags & C_BS)) {
-		res =3D get_num(arg);
-		if (res < 1 || res > SSIZE_MAX)
-			errx(1, "ibs must be between 1 and %jd",
-			    (intmax_t)SSIZE_MAX);
-		in.dbsz =3D (size_t)res;
+		in.dbsz =3D get_num(arg);
+		if (in.dbsz < 1)
+			errx(1, "ibs must be between 1 and %ju", =
(uintmax_t)-1);
 	}
 }
=20
@@ -262,14 +243,10 @@
 static void
 f_obs(char *arg)
 {
-	uintmax_t res;
-
 	if (!(ddflags & C_BS)) {
-		res =3D get_num(arg);
-		if (res < 1 || res > SSIZE_MAX)
-			errx(1, "obs must be between 1 and %jd",
-			    (intmax_t)SSIZE_MAX);
-		out.dbsz =3D (size_t)res;
+		out.dbsz =3D get_num(arg);
+		if (out.dbsz < 1)
+			errx(1, "obs must be between 1 and %ju", =
(uintmax_t)-1);
 	}
 }
=20
@@ -378,11 +355,14 @@
 	uintmax_t num, mult, prevnum;
 	char *expr;
=20
+	if (val[0] =3D=3D '-')
+		errx(1, "%s: cannot be negative", oper);
+
 	errno =3D 0;
 	num =3D strtouq(val, &expr, 0);
 	if (errno !=3D 0)				/* Overflow or =
underflow. */
 		err(1, "%s", oper);
-=09
+
 	if (expr =3D=3D val)			/* No valid digits. */
 		errx(1, "%s: illegal numeric value", oper);
=20
Index: bin/dd/dd.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- bin/dd/dd.c	(revision 267712)
+++ bin/dd/dd.c	(working copy)
@@ -284,8 +284,6 @@
=20
 	for (;;) {
 		switch (cpy_cnt) {
-		case -1:			/* count=3D0 was =
specified */
-			return;
 		case 0:
 			break;
 		default:



--Apple-Mail=_233B94A7-E514-471C-8B17-784D39D4D1EA
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename=signature.asc
Content-Type: application/pgp-signature;
	name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----

iQIcBAEBAgAGBQJT7aDNAAoJEOWIWopNkblkQ1MP/0KH4PyTj907Uppcw+vZgfVr
DFw8cslqSrmDVV4H9jByFmi2H8orCwDC4Viv2gwOerZ0KkUgj0qZTJmQrYu5vPK/
xno9AIIoq5BPaCWz9Rou1/nQEMzJmxHOEuaqx5+m9mE8xMCmO75mF1c8BzuUgpAv
7oPDNokH+BOpSU70+PWXoIBu/r1bwyb8qKpBtFw1MKKLceaYPzvmmG5dlo5FGZgl
/ChfQR5bwkYMMSRABzY4DBo9+eE1MFNYYasHCA5asSdENdU02NeWwTxYtrKZtuE5
IQGGXqVutHwYJYCQgx4elr9PFXqdkI4ZtvKhwWFaItMxLVQJphYioDf7Bip3Jzsw
IBVxAEkJ9zqxK3o5JwTUobQKz0p9KOP9136P6E/pEsyiLnAnvefSmzJFHhXklKhb
CmHijeRqIAH4BT6P2a+Ut9JyMdxYh5Yt7NQCCK3uYw3xiRDZ5R9Q/knru2HCLMnu
SqUaL0rgZ200/icyfAjXnEgcbRxTD7m2/zJu2WAUd9/MaHworbgWmIsuThKH/2LV
Uy99SEMfJoiQR9oXpWUNKtTZIbPt/Aj76l1plflxnEP9CWzbn26yZC7LvLmniL5c
dy8X+PEdi4qkJ23/eWGifaa9Mg38ZdQwqkDOK52qrAdPYY9PVkevOAUFSESO+4Uf
62kWPf6bzHfeA/IXnJ4h
=14jE
-----END PGP SIGNATURE-----

--Apple-Mail=_233B94A7-E514-471C-8B17-784D39D4D1EA--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3C86F281-D618-4B93-BBA3-2DA33AC407EC>