Hi all,
I made a small first diff to replace some ato* functions call to strtonum/l
ones ...
Althought not sure about the sudo one because it looks contrib code and
also might appear a bit "overengineered" ... but in case !
Thanks in advance.
Index: bin/ps/ps.c
===================================================================
RCS file: /cvs/src/bin/ps/ps.c,v
retrieving revision 1.62
diff -u -p -r1.62 ps.c
--- bin/ps/ps.c 8 Jul 2014 23:31:22 -0000 1.62
+++ bin/ps/ps.c 9 Dec 2014 13:34:44 -0000
@@ -97,6 +97,7 @@ main(int argc, char *argv[])
uid_t uid;
int all, ch, flag, i, fmt, lineno, nentries;
int prtheader, showthreads, wflag, kflag, what, Uflag, xflg;
+ const char *errstr;
char *nlistf, *memf, *swapf, *cols, errbuf[_POSIX2_LINE_MAX];
if ((cols = getenv("COLUMNS")) != NULL && *cols != '\0') {
@@ -188,7 +189,9 @@ main(int argc, char *argv[])
fmt = 1;
break;
case 'p':
- pid = atol(optarg);
+ pid = (pid_t)strtonum(optarg, -1, (SHRT_MAX - 1), &errstr);
+ if (errstr)
+ errx(1, "pid: %s", errstr);
xflg = 1;
break;
case 'r':
Index: bin/systrace/systrace.c
===================================================================
RCS file: /cvs/src/bin/systrace/systrace.c,v
retrieving revision 1.61
diff -u -p -r1.61 systrace.c
--- bin/systrace/systrace.c 26 Nov 2014 18:34:51 -0000 1.61
+++ bin/systrace/systrace.c 9 Dec 2014 13:34:44 -0000
@@ -644,6 +644,7 @@ int
main(int argc, char **argv)
{
int i, c;
+ const char *errstr;
char **args;
char *filename = NULL;
char *policypath = NULL;
@@ -707,8 +708,9 @@ main(int argc, char **argv)
case 'p':
if (setcredentials)
usage();
- if ((pidattach = atoi(optarg)) == 0) {
- warnx("bad pid: %s", optarg);
+ pidattach = strtonum(optarg, 1, (SHRT_MAX - 1), &errstr);
+ if (errstr) {
+ warnx("bad pid: %s (%s)", optarg, errstr);
usage();
}
break;
Index: usr.bin/sudo/sudo.c
===================================================================
RCS file: /cvs/src/usr.bin/sudo/sudo.c,v
retrieving revision 1.48
diff -u -p -r1.48 sudo.c
--- usr.bin/sudo/sudo.c 7 Dec 2013 14:53:29 -0000 1.48
+++ usr.bin/sudo/sudo.c 9 Dec 2014 13:35:03 -0000
@@ -37,6 +37,9 @@
# include <sys/time.h>
# include <sys/resource.h>
#endif
+#ifdef BSD
+# include <sys/sysctl.h>
+#endif
#include <stdio.h>
#ifdef STDC_HEADERS
# include <stdlib.h>
@@ -853,6 +856,10 @@ parse_args(argc, argv)
int argc;
char **argv;
{
+#ifdef BSD
+ const char *errstr;
+ size_t maxfiles, maxfileslen;
+#endif
int mode = 0; /* what mode is sudo to be run in? */
int flags = 0; /* mode flags */
int valid_flags, ch;
@@ -861,6 +868,12 @@ parse_args(argc, argv)
if (strcmp(getprogname(), "sudoedit") == 0)
mode = MODE_EDIT;
+#ifdef BSD
+ if (sysctl("kern.maxfiles", strlen("kern.maxfiles"), NULL, NULL,
+ &maxfiles, &maxfileslen) == -1)
+ errorx(1, "kern.maxfiles failed");
+#endif
+
/* Returns true if the last option string was "--" */
#define got_end_of_args (optind > 1 && argv[optind - 1][0] == '-' && \
argv[optind - 1][1] == '-' && argv[optind - 1][2] == '\0')
@@ -893,8 +906,14 @@ parse_args(argc, argv)
SET(flags, MODE_BACKGROUND);
break;
case 'C':
+#ifdef BSD
+ user_closefrom = (int)strtonum(optarg, 3, maxfiles, &errstr);
+ if (errstr) {
+ warningx("the argument to -C is invalid: %s", errstr);
+#else
if ((user_closefrom = atoi(optarg)) < 3) {
warningx("the argument to -C must be at least 3");
+#endif
usage(1);
}
break;
Index: usr.bin/vmstat/vmstat.c
===================================================================
RCS file: /cvs/src/usr.bin/vmstat/vmstat.c,v
retrieving revision 1.134
diff -u -p -r1.134 vmstat.c
--- usr.bin/vmstat/vmstat.c 23 Nov 2014 04:34:48 -0000 1.134
+++ usr.bin/vmstat/vmstat.c 9 Dec 2014 13:35:03 -0000
@@ -129,6 +129,7 @@ int
main(int argc, char *argv[])
{
char errbuf[_POSIX2_LINE_MAX];
+ char *preps;
int c, todo = 0, reps = 0;
const char *errstr;
u_int interval = 0;
@@ -136,7 +137,9 @@ main(int argc, char *argv[])
while ((c = getopt(argc, argv, "c:fiM:mN:stw:vz")) != -1) {
switch (c) {
case 'c':
- reps = atoi(optarg);
+ reps = (int)strtol(optarg, &preps, 10);
+ if (*preps != '\0' || errno != 0)
+ errx(1, "-c %s: invalid argument", optarg);
break;
case 'f':
todo |= FORKSTAT;
@@ -224,8 +227,11 @@ main(int argc, char *argv[])
if (errstr)
errx(1, "%s: %s", *argv, errstr);
- if (*++argv)
- reps = atoi(*argv);
+ if (*++argv) {
+ reps = (int)strtol(*argv, &preps, 10);
+ if (preps != '\0' || errno != 0)
+ errx(1, "%s: invalid argument", *argv);
+ }
}
#endif