svn commit: r216955 - head/usr.sbin/rtprio
Alexander Best
arundel at freebsd.org
Thu Jan 6 20:41:57 UTC 2011
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]);
}
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
More information about the svn-src-all
mailing list