From owner-svn-src-all@FreeBSD.ORG Thu Jan 6 21:13:34 2011 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 1233) id 348241065670; Thu, 6 Jan 2011 21:13:34 +0000 (UTC) Date: Thu, 6 Jan 2011 21:13:34 +0000 From: Alexander Best To: Konstantin Belousov Message-ID: <20110106211334.GA47424@freebsd.org> References: <201101041413.p04EDA4f038360@svn.freebsd.org> <20110106204157.GA41314@freebsd.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110106204157.GA41314@freebsd.org> Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r216955 - head/usr.sbin/rtprio X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 06 Jan 2011 21:13:34 -0000 On Thu Jan 6 11, Alexander Best wrote: > On Tue Jan 4 11, Konstantin Belousov wrote: > > Author: kib > > Date: Tue Jan 4 14:13:09 2011 > > New Revision: 216955 > > URL: http://svn.freebsd.org/changeset/base/216955 > > > > Log: > > Make the parsing of the integer arguments for rtprio(1)/idprio(1) stricter. > > Style. > > > > Based on submission by: Eitan Adler , keramida > > Reviewed by: jhb, keramida > > MFC after: 1 week > > > > Modified: > > head/usr.sbin/rtprio/rtprio.c > > > > Modified: head/usr.sbin/rtprio/rtprio.c > > ============================================================================== > > --- head/usr.sbin/rtprio/rtprio.c Tue Jan 4 13:16:28 2011 (r216954) > > +++ head/usr.sbin/rtprio/rtprio.c Tue Jan 4 14:13:09 2011 (r216955) > > @@ -37,31 +37,31 @@ __FBSDID("$FreeBSD$"); > > > > #include > > #include > > -#include > > > > #include > > #include > > +#include > > #include > > #include > > #include > > #include > > > > -static void usage(); > > +static int parseint(const char *, const char *); > > +static void usage(void); > > > > int > > -main(argc, argv) > > - int argc; > > - char **argv; > > +main(int argc, char *argv[]) > > { > > - char *p; > > - int proc = 0; > > struct rtprio rtp; > > + char *p; > > + pid_t proc; > > > > /* find basename */ > > if ((p = rindex(argv[0], '/')) == NULL) > > p = argv[0]; > > else > > ++p; > > + proc = 0; > > > > if (!strcmp(p, "rtprio")) > > rtp.type = RTP_PRIO_REALTIME; > > @@ -70,12 +70,12 @@ main(argc, argv) > > > > switch (argc) { > > case 2: > > - proc = abs(atoi(argv[1])); /* Should check if numeric > > - * arg! */ > > + proc = parseint(argv[1], "pid"); > > + proc = abs(proc); > > /* FALLTHROUGH */ > > case 1: > > if (rtprio(RTP_LOOKUP, proc, &rtp) != 0) > > - err(1, "%s", argv[0]); > > + err(1, "RTP_LOOKUP"); > > printf("%s: ", p); > > switch (rtp.type) { > > case RTP_PRIO_REALTIME: > > @@ -103,19 +103,17 @@ main(argc, argv) > > usage(); > > break; > > } > > - } else { > > - rtp.prio = atoi(argv[1]); > > - } > > + } else > > + rtp.prio = parseint(argv[1], "priority"); > > } else { > > usage(); > > break; > > } > > > > if (argv[2][0] == '-') > > - proc = -atoi(argv[2]); > > - > > + proc = parseint(argv[2] + 1, "pid"); > > if (rtprio(RTP_SET, proc, &rtp) != 0) > > - err(1, "%s", argv[0]); > > + err(1, "RTP_SET"); > > > > if (proc == 0) { > > this causes problems when pid is -0: > > [id|rt]prio -t -0 and [id|rt]prio 10 -0 will try to run "0" via execvp(). > beforehand however this will also trigger rtprio(). > > a better solution would be to do: > > if (argv[2][0] == '-') { > proc = parseint(argv[2] + 1, "pid"); > if (rtprio(RTP_SET, proc, &rtp) != 0) > err(1, "RTP_SET"); > } else { > execvp(argv[2], &argv[2]); > err(1, "%s", argv[2]); > } ...better make that: if (argv[2][0] == '-') { proc = parseint(argv[2], "pid"); proc = abs(proc); if (rtprio(RTP_SET, proc, &rtp) != 0) err(1, "RTP_SET"); } else { execvp(argv[2], &argv[2]); err(1, "%s", argv[2]); } his prevents something like [id|rt]prio -t --1 to be actually passed over to rtprio(). cheers. alex > > cheers. > alex > > > execvp(argv[2], &argv[2]); > > @@ -123,12 +121,28 @@ main(argc, argv) > > } > > exit(0); > > } > > - exit (1); > > + exit(1); > > +} > > + > > +static int > > +parseint(const char *str, const char *errname) > > +{ > > + char *endp; > > + long res; > > + > > + errno = 0; > > + res = strtol(str, &endp, 10); > > + if (errno != 0 || endp == str || *endp != '\0') > > + err(1, "%s must be a number", errname); > > + if (res >= INT_MAX) > > + err(1, "Integer overflow parsing %s", errname); > > + return (res); > > } > > > > static void > > -usage() > > +usage(void) > > { > > + > > (void) fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n", > > "usage: [id|rt]prio", > > " [id|rt]prio [-]pid", > > -- > a13x -- a13x