diff --git a/bin/ls/ls.c b/bin/ls/ls.c index 604d4ad..3a758bd 100644 --- a/bin/ls/ls.c +++ b/bin/ls/ls.c @@ -139,6 +139,7 @@ main(int argc, char *argv[]) struct winsize win; int ch, fts_options, notused; char *p; + const char *errstr = NULL; #ifdef COLORLS char termcapbuf[1024]; /* termcap definition buffer */ char tcapbuf[512]; /* capability buffer */ @@ -150,9 +151,11 @@ main(int argc, char *argv[]) /* Terminal defaults to -Cq, non-terminal defaults to -1. */ if (isatty(STDOUT_FILENO)) { termwidth = 80; - if ((p = getenv("COLUMNS")) != NULL && *p != '\0') - termwidth = atoi(p); - else if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &win) != -1 && + if ((p = getenv("COLUMNS")) != NULL && *p != '\0') { + termwidth = strtonum(p, 0, INT_MAX, &errstr); + if (errstr) + termwidth = 80; + } else if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &win) != -1 && win.ws_col > 0) termwidth = win.ws_col; f_nonprint = 1; @@ -160,8 +163,11 @@ main(int argc, char *argv[]) f_singlecol = 1; /* retrieve environment variable, in case of explicit -C */ p = getenv("COLUMNS"); - if (p) - termwidth = atoi(p); + if (p) { + termwidth = strtonum(p, 0, INT_MAX, &errstr); + if (errstr) + termwidth = 80; + } } /* diff --git a/bin/pax/options.c b/bin/pax/options.c index 4cf4ebf..cf29369 100644 --- a/bin/pax/options.c +++ b/bin/pax/options.c @@ -179,6 +179,7 @@ pax_options(int argc, char **argv) unsigned int flg = 0; unsigned int bflg = 0; char *pt; + const char *errstr = NULL; FSUB tmp; /* @@ -407,9 +408,12 @@ pax_options(int argc, char **argv) flg |= CEF; if (strcmp(NONE, optarg) == 0) maxflt = -1; - else if ((maxflt = atoi(optarg)) < 0) { - paxwarn(1, "Error count value must be positive"); - pax_usage(); + else { + maxflt = strtonum(optarg, 0, INT_MAX, &errstr); + if (errstr) { + paxwarn(1, "Error count value : %s", errstr); + pax_usage(); + } } break; case 'G': @@ -1013,6 +1017,7 @@ cpio_options(int argc, char **argv) { int c, i; char *str; + const char *errstr = NULL; FSUB tmp; FILE *fp; @@ -1140,7 +1145,11 @@ cpio_options(int argc, char **argv) /* * set block size in bytes */ - wrblksz = atoi(optarg); + wrblksz = strtonum(optarg, 0, INT_MAX, &errstr); + if (errstr) { + paxwarn(1, "Error byte size : %s", errstr); + pax_usage(); + } break; case 'E': /* diff --git a/contrib/nvi/cl/cl_term.c b/contrib/nvi/cl/cl_term.c index d851930..9b489d2 100644 --- a/contrib/nvi/cl/cl_term.c +++ b/contrib/nvi/cl/cl_term.c @@ -356,6 +356,7 @@ cl_ssize(SCR *sp, int sigwinch, size_t *rowp, size_t *colp, int *changedp) size_t col, row; int rval; char *p; + char *rowptr = NULL, *colptr = NULL; /* Assume it's changed. */ if (changedp != NULL) @@ -447,10 +448,15 @@ noterm: if (row == 0) * deleting the LINES and COLUMNS environment variables from their * dot-files. */ - if ((p = getenv("LINES")) != NULL) - row = strtol(p, NULL, 10); - if ((p = getenv("COLUMNS")) != NULL) - col = strtol(p, NULL, 10); + if ((p = getenv("LINES")) != NULL) { + row = strtol(p, &rowptr, 10); + if (errno == ERANGE || *rowptr != '\0') + row = 24; + } if ((p = getenv("COLUMNS")) != NULL) { + col = strtol(p, &colptr, 10); + if (errno == ERANGE || *colptr != '\0') + col = 80; + } if (rowp != NULL) *rowp = row; diff --git a/sbin/camcontrol/camcontrol.c b/sbin/camcontrol/camcontrol.c index 19268c6..0759e24 100644 --- a/sbin/camcontrol/camcontrol.c +++ b/sbin/camcontrol/camcontrol.c @@ -2995,14 +2995,20 @@ scsiformat(struct cam_device *device, int argc, char **argv, && (timeout == 0)) { char str[1024]; int new_timeout = 0; + const char *errstr = NULL; fprintf(stdout, "Enter new timeout in seconds or press\n" "return to keep the current timeout [%d] ", use_timeout / 1000); if (fgets(str, sizeof(str), stdin) != NULL) { - if (str[0] != '\0') - new_timeout = atoi(str); + if (str[0] != '\0') { + new_timeout = strtonum(str, 0, INT_MAX, &errstr); + if (errstr) { + fprintf(stderr, "Invalid new timeout %s\n", errstr); + goto scsiformat_bailout; + } + } } if (new_timeout != 0) { diff --git a/sbin/comcontrol/comcontrol.c b/sbin/comcontrol/comcontrol.c index 561131f..644e9b6 100644 --- a/sbin/comcontrol/comcontrol.c +++ b/sbin/comcontrol/comcontrol.c @@ -96,14 +96,18 @@ main(int argc, char *argv[]) usage(); if (argv[3] == NULL || !isdigit(argv[3][0])) usage(); - dtrwait = atoi(argv[3]); + dtrwait = strtol(argv[3], NULL, 10); + if (errno == ERANGE) + usage(); argv += 2; } else if (strcmp(argv[2],"drainwait") == 0) { if (drainwait >= 0) usage(); if (argv[3] == NULL || !isdigit(argv[3][0])) usage(); - drainwait = atoi(argv[3]); + drainwait = strtol(argv[3], NULL, 10); + if (errno == ERANGE) + usage(); argv += 2; } else { usage(); diff --git a/sbin/fsdb/fsdbutil.c b/sbin/fsdb/fsdbutil.c index 8ea6f83..6ec3595 100644 --- a/sbin/fsdb/fsdbutil.c +++ b/sbin/fsdb/fsdbutil.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -158,13 +159,17 @@ charsperline(void) { int columns; char *cp; + char *p = NULL; struct winsize ws; columns = 0; if (ioctl(0, TIOCGWINSZ, &ws) != -1) columns = ws.ws_col; - if (columns == 0 && (cp = getenv("COLUMNS"))) - columns = atoi(cp); + if (columns == 0 && (cp = getenv("COLUMNS"))) { + columns = strtol(cp, &p, 10); + if (errno == ERANGE || *p != '\0') + columns = 80; + } if (columns == 0) columns = 80; /* last resort */ return (columns); diff --git a/sbin/growfs/growfs.c b/sbin/growfs/growfs.c index bda65fe..7f31176 100644 --- a/sbin/growfs/growfs.c +++ b/sbin/growfs/growfs.c @@ -55,6 +55,7 @@ #include #include #include +#include #include #include @@ -1869,6 +1870,7 @@ charsperline(void) { int columns; char *cp; + char *p = NULL; struct winsize ws; DBG_ENTER; @@ -1878,7 +1880,9 @@ charsperline(void) columns = ws.ws_col; } if (columns == 0 && (cp = getenv("COLUMNS"))) { - columns = atoi(cp); + columns = strtol(cp, &p, 10); + if (errno == ERANGE || *p != '\0') + columns = 80; } if (columns == 0) { columns = 80; /* last resort */ diff --git a/sbin/ifconfig/ifcarp.c b/sbin/ifconfig/ifcarp.c index abb2ae1..4046de4 100644 --- a/sbin/ifconfig/ifcarp.c +++ b/sbin/ifconfig/ifcarp.c @@ -119,11 +119,12 @@ setcarp_vhid(const char *val, int d, int s, const struct afswtch *afp) { int vhid; struct carpreq carpr; + const char *errstr = NULL; - vhid = atoi(val); + vhid = strtonum(val, 1, INT_MAX, &errstr); - if (vhid <= 0) - errx(1, "vhid must be greater than 0"); + if (errstr) + errx(1, "invalid vhid : %s", errstr); memset((char *)&carpr, 0, sizeof(struct carpreq)); ifr.ifr_data = (caddr_t)&carpr; @@ -142,8 +143,11 @@ setcarp_advskew(const char *val, int d, int s, const struct afswtch *afp) { int advskew; struct carpreq carpr; + const char *errstr = NULL; - advskew = atoi(val); + advskew = strtonum(val, 1, 255, &errstr); + if (errstr) + errx(1, "invalid advskew value : %s", errstr); memset((char *)&carpr, 0, sizeof(struct carpreq)); ifr.ifr_data = (caddr_t)&carpr; @@ -162,8 +166,11 @@ setcarp_advbase(const char *val, int d, int s, const struct afswtch *afp) { int advbase; struct carpreq carpr; + const char *errstr = NULL; - advbase = atoi(val); + advbase = strtonum(val, 1, 254, &errstr); + if (errstr) + errx(1, "invalid advbase value : %s", errstr); memset((char *)&carpr, 0, sizeof(struct carpreq)); ifr.ifr_data = (caddr_t)&carpr; diff --git a/sbin/ifconfig/ifconfig.c b/sbin/ifconfig/ifconfig.c index 0e9363d..c5d2bf8 100644 --- a/sbin/ifconfig/ifconfig.c +++ b/sbin/ifconfig/ifconfig.c @@ -779,9 +779,12 @@ static void setifmetric(const char *val, int dummy __unused, int s, const struct afswtch *afp) { + const char *errstr = NULL; strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); - ifr.ifr_metric = atoi(val); - if (ioctl(s, SIOCSIFMETRIC, (caddr_t)&ifr) < 0) + ifr.ifr_metric = strtonum(val, 0, INT_MAX, &errstr); + if (errstr) + warn("invalid metric value %s", errstr); + else if (ioctl(s, SIOCSIFMETRIC, (caddr_t)&ifr) < 0) warn("ioctl (set metric)"); } @@ -789,9 +792,12 @@ static void setifmtu(const char *val, int dummy __unused, int s, const struct afswtch *afp) { + const char *errstr = NULL; strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); - ifr.ifr_mtu = atoi(val); - if (ioctl(s, SIOCSIFMTU, (caddr_t)&ifr) < 0) + ifr.ifr_mtu = strtonum(val, 0, INT_MAX, &errstr); + if (errstr) + warn("invalid mtu value %s", errstr); + else if (ioctl(s, SIOCSIFMTU, (caddr_t)&ifr) < 0) warn("ioctl (set mtu)"); } @@ -799,9 +805,12 @@ static void setiftsolen(const char *val, int dummy __unused, int s, const struct afswtch *afp) { + const char *errstr = NULL; strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); - ifr.ifr_tsolen = atoi(val); - if (ioctl(s, SIOCSIFTSOLEN, (caddr_t)&ifr) < 0) + ifr.ifr_tsolen = strtonum(val, 0, INT_MAX, &errstr); + if (errstr) + warn("invalid tsolen value %s", errstr); + else if (ioctl(s, SIOCSIFTSOLEN, (caddr_t)&ifr) < 0) warn("ioctl (set tsolen)"); } diff --git a/sbin/ifconfig/ifieee80211.c b/sbin/ifconfig/ifieee80211.c index e0e890b..1e37fe2 100644 --- a/sbin/ifconfig/ifieee80211.c +++ b/sbin/ifconfig/ifieee80211.c @@ -1848,13 +1848,13 @@ DECL_CMD_FUNC(set80211meshttl, val, d) static DECL_CMD_FUNC(set80211meshforward, val, d) { - set80211(s, IEEE80211_IOC_MESH_FWRD, atoi(val), 0, NULL); + set80211(s, IEEE80211_IOC_MESH_FWRD, d, 0, NULL); } static DECL_CMD_FUNC(set80211meshpeering, val, d) { - set80211(s, IEEE80211_IOC_MESH_AP, atoi(val), 0, NULL); + set80211(s, IEEE80211_IOC_MESH_AP, d, 0, NULL); } static diff --git a/sbin/route/route.c b/sbin/route/route.c index 924c764..e289b92 100644 --- a/sbin/route/route.c +++ b/sbin/route/route.c @@ -543,6 +543,7 @@ set_metric(char *value, int key) { int flag = 0; u_long noval, *valp = &noval; + char *p = NULL; switch (key) { #define caseof(x, y, z) case x: valp = &rt_metrics.z; flag = y; break @@ -563,7 +564,9 @@ set_metric(char *value, int key) rt_metrics.rmx_locks |= flag; if (locking) locking = 0; - *valp = atoi(value); + *valp = strtol(value, &p, 10); + if (errno == ERANGE || *p != '\0') + errx(EX_OSERR, "%s : bad metric", value); } static void diff --git a/sbin/slattach/slattach.c b/sbin/slattach/slattach.c index f6794b6..35978ef 100644 --- a/sbin/slattach/slattach.c +++ b/sbin/slattach/slattach.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -105,6 +106,7 @@ int main(int argc, char **argv) { int option; + const char *errstr = NULL; while ((option = getopt(argc, argv, "ace:fhlnr:s:u:zLK:O:S:")) != -1) { switch (option) { @@ -135,7 +137,11 @@ main(int argc, char **argv) redial_cmd = (char*) strdup (optarg); break; case 's': - speed = atoi(optarg); + speed = strtonum(optarg, 0, INT_MAX, &errstr); + if (errstr) { + fprintf(stderr, "bad speed value : %s", errstr); + exit(1); + } break; case 'u': config_cmd = (char*) strdup (optarg); diff --git a/sbin/startslip/startslip.c b/sbin/startslip/startslip.c index c035ec8..fb2fe94 100644 --- a/sbin/startslip/startslip.c +++ b/sbin/startslip/startslip.c @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -115,6 +116,7 @@ main(int argc, char **argv) pid_t pid; struct termios t; int result; + const char *errstr = NULL; while ((ch = getopt(argc, argv, "dhlb:s:t:w:A:U:D:W:K:O:S:L")) != -1) switch (ch) { @@ -122,7 +124,9 @@ main(int argc, char **argv) debug = 1; break; case 'b': - speed = atoi(optarg); + speed = strtonum(optarg, 0, INT_MAX, &errstr); + if (errstr) + errx(1, "bad speed value (%s)", errstr); break; case 's': if (diali >= MAXDIALS) @@ -130,10 +134,14 @@ main(int argc, char **argv) dials[diali++] = strdup(optarg); break; case 't': - script_timeout = atoi(optarg); + script_timeout = strtonum(optarg, 0, INT_MAX, &errstr); + if (errstr) + errx(1, "bad script_timeout value (%s)", errstr); break; case 'w': - wait_time = atoi(optarg); + wait_time = strtonum(optarg, 0, INT_MAX, &errstr); + if (errstr) + errx(1, "bas wait_time value (%s)", errstr); break; case 'W': MAXTRIES = atoi(optarg); diff --git a/sbin/sysctl/sysctl.c b/sbin/sysctl/sysctl.c index 14f9d89..f4acacb 100644 --- a/sbin/sysctl/sysctl.c +++ b/sbin/sysctl/sysctl.c @@ -208,21 +208,29 @@ parse(const char *string) (char *)newval); } else intval = (int) strtol(newval, NULL, 0); + if (errno == ERANGE) + errx(1, "value %s out of range", (char *)newval); newval = &intval; newsize = sizeof(intval); break; case CTLTYPE_UINT: uintval = (int) strtoul(newval, NULL, 0); + if (errno == ERANGE) + errx(1, "value %s out of range", (char *)newval); newval = &uintval; newsize = sizeof uintval; break; case CTLTYPE_LONG: longval = strtol(newval, NULL, 0); + if (errno == ERANGE) + errx(1, "value %s out of range", (char *)newval); newval = &longval; newsize = sizeof longval; break; case CTLTYPE_ULONG: ulongval = strtoul(newval, NULL, 0); + if (errno == ERANGE) + errx(1, "value %s out of range", (char *)newval); newval = &ulongval; newsize = sizeof ulongval; break; diff --git a/sbin/vinum/v.c b/sbin/vinum/v.c index 13b8de4..e08f5e8 100644 --- a/sbin/vinum/v.c +++ b/sbin/vinum/v.c @@ -316,6 +316,7 @@ parseline(int args, char *argv[]) int j; enum keyword command; /* command to execute */ + const char *errstr = NULL; if (hist != NULL) { /* save the command to history file */ timestamp(); for (i = 0; i < args; i++) /* all args */ @@ -360,10 +361,13 @@ parseline(int args, char *argv[]) case 'i': /* interval */ interval = 0; if (argv[i][j + 1] != '\0') /* operand follows, */ - interval = atoi(&argv[i][j + 1]); /* use it */ + interval = strtonum(&argv[i][j + 1], 0, INT_MAX, &errstr); /* use it */ else if (args > (i + 1)) /* another following, */ - interval = atoi(argv[++i]); /* use it */ - if (interval == 0) /* nothing valid, */ + interval = strtonum(argv[++i], 0, INT_MAX, &errstr); /* use it */ + if (errstr) { + fprintf(stderr, "-i: invalid interval specified: %s\n", errstr); + exit(1); + } else if (interval == 0) /* nothing valid, */ fprintf(stderr, "-i: no interval specified\n"); break; @@ -387,10 +391,13 @@ parseline(int args, char *argv[]) case 'S': SSize = 0; if (argv[i][j + 1] != '\0') /* operand follows, */ - SSize = atoi(&argv[i][j + 1]); /* use it */ + SSize = strtonum(&argv[i][j + 1], 0, INT_MAX, &errstr); /* use it */ else if (args > (i + 1)) /* another following, */ - SSize = atoi(argv[++i]); /* use it */ - if (SSize == 0) /* nothing valid, */ + SSize = strtonum(argv[++i], 0, INT_MAX, &errstr); /* use it */ + if (errstr) { + fprintf(stderr, "-S: invalid size specified %s", errstr); + exit(1); + } else if (SSize == 0) /* nothing valid, */ fprintf(stderr, "-S: no size specified\n"); break; diff --git a/usr.bin/column/column.c b/usr.bin/column/column.c index fc1345d..bad2b54 100644 --- a/usr.bin/column/column.c +++ b/usr.bin/column/column.c @@ -71,15 +71,18 @@ main(int argc, char **argv) FILE *fp; int ch, tflag, xflag; char *p; - const char *src; + const char *src, *errstr = NULL;; wchar_t *newsep; size_t seplen; setlocale(LC_ALL, ""); if (ioctl(1, TIOCGWINSZ, &win) == -1 || !win.ws_col) { - if ((p = getenv("COLUMNS"))) - termwidth = atoi(p); + if ((p = getenv("COLUMNS"))) { + termwidth = strtonum(p, 0, INT_MAX, &errstr); + if (errstr) + termwidth = 80; + } } else termwidth = win.ws_col; @@ -87,7 +90,9 @@ main(int argc, char **argv) while ((ch = getopt(argc, argv, "c:s:tx")) != -1) switch(ch) { case 'c': - termwidth = atoi(optarg); + termwidth = strtonum(optarg, 0, INT_MAX, &errstr); + if (errstr) + termwidth = 80; break; case 's': src = optarg;