[patch] have rtprio check that arguments are numeric; change atoi to strtol

Eitan Adler lists at eitanadler.com
Sun Jan 2 23:47:08 UTC 2011


What about this patch? I incorporated  your feedback so I am not going
to reply inline.

> The syntax of the prio commands is weird, there is an obvious corner
> (or wrongly handled) case, where the command name starts with a digit.
> Command name starting with dash is even harder.
>

I agree - and I wouldn't mind seeing the syntax changed (along with
the licensed changed to a 2 clause BSD license) - but I suspect the
benefits conferred by those two things would not be enough to overcome
the reluctance to change a very old command (since 1994). If I'm wrong
I'll gladly write a "cleanroom" version with sane syntax.

Index: rtprio.c
===================================================================
--- rtprio.c	(revision 216679)
+++ rtprio.c	(working copy)
@@ -41,6 +41,7 @@

 #include <ctype.h>
 #include <err.h>
+#include <libgen.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -54,14 +55,12 @@
 	char  **argv;
 {
 	char   *p;
-	int     proc = 0;
+	pid_t     proc;
 	struct rtprio rtp;
+	char *invalidchar;

-	/* find basename */
-	if ((p = rindex(argv[0], '/')) == NULL)
-		p = argv[0];
-	else
-		++p;
+	proc = 0;
+	p = basename(argv[0]);

 	if (!strcmp(p, "rtprio"))
 		rtp.type = RTP_PRIO_REALTIME;
@@ -70,8 +69,10 @@

 	switch (argc) {
 	case 2:
-		proc = abs(atoi(argv[1]));	/* Should check if numeric
-						 * arg! */
+		proc = (int)strtol(argv[1], &invalidchar, 10);
+		if (*invalidchar != '\0')
+			errx(1,"Process should be a pid");
+		proc = abs(proc);
 		/* FALLTHROUGH */
 	case 1:
 		if (rtprio(RTP_LOOKUP, proc, &rtp) != 0)
@@ -104,16 +105,20 @@
 					break;
 				}
 			} else {
-				rtp.prio = atoi(argv[1]);
+				rtp.prio = (int)strtol(argv[1], &invalidchar, 10);
+				if (*invalidchar != '\0')
+					errx(1,"Priority should be a number", invalidchar);
 			}
 		} else {
 			usage();
 			break;
 		}

-		if (argv[2][0] == '-')
-			proc = -atoi(argv[2]);
-
+		if (argv[2][0] == '-') {
+			proc = (int)strtol(argv[2]+1, &invalidchar, 10);
+			if (*invalidchar != '\0')
+				errx(1,"Process should be a pid");
+		}
 		if (rtprio(RTP_SET, proc, &rtp) != 0)
 			err(1, "%s", argv[0]);



-- 
Eitan Adler


More information about the freebsd-hackers mailing list