Date: Sun, 2 Jan 2011 18:46:47 -0500 From: Eitan Adler <lists@eitanadler.com> To: Kostik Belousov <kostikbel@gmail.com> Cc: hackers@freebsd.org Subject: Re: [patch] have rtprio check that arguments are numeric; change atoi to strtol Message-ID: <AANLkTinfKYYy0s3_LLvgRZtx=hGjbZP4%2Bqtnk31oi9GP@mail.gmail.com> In-Reply-To: <20110102101845.GC90883@deviant.kiev.zoral.com.ua> References: <AANLkTimiJPiHBSw5i5TVJYfh9uGOyrNJx%2BoUPeB%2Bt%2BY_@mail.gmail.com> <6BEFA669-2E1F-44E6-897A-0A51DA939A74@gmail.com> <AANLkTimmQHRoQOZBgfheds=_sv5SMzD9DrPfYk9em7j8@mail.gmail.com> <AANLkTimdEpZ1DBoKU9g6w-j=F9KS0ONvo9racgOesdPf@mail.gmail.com> <20110102101845.GC90883@deviant.kiev.zoral.com.ua>
next in thread | previous in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AANLkTinfKYYy0s3_LLvgRZtx=hGjbZP4%2Bqtnk31oi9GP>