Date: Thu, 6 Jan 2011 21:13:34 +0000 From: Alexander Best <arundel@freebsd.org> To: Konstantin Belousov <kib@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 Message-ID: <20110106211334.GA47424@freebsd.org> In-Reply-To: <20110106204157.GA41314@freebsd.org> References: <201101041413.p04EDA4f038360@svn.freebsd.org> <20110106204157.GA41314@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
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 <lists eitanadler com>, 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 <sys/param.h> > > #include <sys/rtprio.h> > > -#include <sys/errno.h> > > > > #include <ctype.h> > > #include <err.h> > > +#include <errno.h> > > #include <stdio.h> > > #include <stdlib.h> > > #include <string.h> > > #include <unistd.h> > > > > -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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20110106211334.GA47424>