Re: [CFR] diskpart(1) buffer overflow fix

Peter Pentchev <[email protected]> Mon, 2 Dec 2002 14:46:42 +0200
Newsgroups gmane.os.freebsd.devel.audit
Message-ID <[email protected]>
On Mon, Dec 02, 2002 at 01:37:52PM +0100, Thomas Quinot wrote:
> Le 2002-12-02, Peter Pentchev ?crivait :
> 
> > > Attached are two patches: a trivial one which just fixes up two problems
> > > in diskpart's argument parsing, and a more complex one, which does it
> > > "the right way" IMHO, using getopt(3).
> 
> The getopt-based version sounds better to me.
> 
> > +			case 'd':
> > +				dflag++;
> > +				if (pflag)
> > +					usage();
> > +				break;
> > +				
> > +			case 'p':
> > +				if (dflag)
> > +					usage();
> > +				pflag++;
> > +				break;
> 
> I'd remove both tests and replace them with a single
>   if (pflag && dflag) usage()
> after all arguments have been processed.

Ahhh; of course this would be better.  Updated patch attached.

G'luck,
Peter

-- 
Peter Pentchev	[email protected]	[email protected]
PGP key:	http://people.FreeBSD.org/~roam/roam.key.asc
Key fingerprint	FDBA FD79 C26F 3C51 C95E  DF9E ED18 B68D 1619 4553
If there were no counterfactuals, this sentence would not have been paradoxical.
usr.sbin-diskpart.patch (text/plain, 1.3 KB)
Index: src/usr.sbin/diskpart/diskpart.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/diskpart/Attic/diskpart.c,v
retrieving revision 1.11.2.1
diff -u -r1.11.2.1 diskpart.c
--- src/usr.sbin/diskpart/diskpart.c	7 Jan 2002 06:00:23 -0000	1.11.2.1
+++ src/usr.sbin/diskpart/diskpart.c	2 Dec 2002 12:45:27 -0000
@@ -55,6 +55,7 @@
 #include <ctype.h>
 #include <err.h>
 #include <stdio.h>
+#include <unistd.h>
 
 #define	for_now			/* show all of `c' partition for disklabel */
 #define	NPARTITIONS	8
@@ -126,22 +127,29 @@
 	int threshhold, numcyls[NPARTITIONS], startcyl[NPARTITIONS];
 	int totsize = 0;
 	char *lp, *tyname;
+	int ch;
 
-	argc--, argv++;
+	while ((ch = getopt(argc, argv, "dps:")) != EOF)
+		switch (ch) {
+			case 'd':
+				dflag++;
+				break;
+				
+			case 'p':
+				pflag++;
+				break;
+
+			case 's':
+				totsize = atoi(optarg);
+				break;
+		}
+	argc -= optind;
+	argv += optind;
+
+	if (dflag && pflag)
+		usage();
 	if (argc < 1)
 		usage();
-	if (argc > 0 && strcmp(*argv, "-p") == 0) {
-		pflag++;
-		argc--, argv++;
-	}
-	if (argc > 0 && strcmp(*argv, "-d") == 0) {
-		dflag++;
-		argc--, argv++;
-	}
-	if (argc > 1 && strcmp(*argv, "-s") == 0) {
-		totsize = atoi(argv[1]);
-		argc += 2, argv += 2;
-	}
 	dp = getdiskbyname(*argv);
 	if (dp == NULL) {
 		if (isatty(0))
signature.asc (application/pgp-signature, 187 B)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (FreeBSD)

iD8DBQE961Yx7Ri2jRYZRVMRAlB6AJsGIHbaIiOpb/+1kkCszSGzKsJjeQCfZvFa
HT9yhe6vNIDvwpvqgPYmsSk=
=M70Q
-----END PGP SIGNATURE-----