svn commit: r216955 - head/usr.sbin/rtprio
Alexander Best
arundel at freebsd.org
Thu Jan 6 21:13:34 UTC 2011
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
More information about the svn-src-all
mailing list