diff options
author | bapt <bapt@FreeBSD.org> | 2015-07-30 06:14:47 +0000 |
---|---|---|
committer | bapt <bapt@FreeBSD.org> | 2015-07-30 06:14:47 +0000 |
commit | 1567d1bb44ec481ada84e859e0ede39667094680 (patch) | |
tree | a7d66b1ab9e656ab0cd07e097d8b07a4b11f0316 /usr.sbin/pw | |
parent | 84ed76c8118e483121b0f2ce0924a7f50c9bee92 (diff) | |
download | FreeBSD-src-1567d1bb44ec481ada84e859e0ede39667094680.zip FreeBSD-src-1567d1bb44ec481ada84e859e0ede39667094680.tar.gz |
Improve strtounum
Fix many style bugs
Better variable naming
Use C99 'restrict' were apropriate
Fix potential errno race
Submitted by: bde
Diffstat (limited to 'usr.sbin/pw')
-rw-r--r-- | usr.sbin/pw/pw.h | 4 | ||||
-rw-r--r-- | usr.sbin/pw/strtounum.c | 41 |
2 files changed, 21 insertions, 24 deletions
diff --git a/usr.sbin/pw/pw.h b/usr.sbin/pw/pw.h index 3ab3c74..a22572e 100644 --- a/usr.sbin/pw/pw.h +++ b/usr.sbin/pw/pw.h @@ -103,5 +103,5 @@ char *pw_pwcrypt(char *password); extern const char *Modes[]; extern const char *Which[]; -uintmax_t strtounum(const char *numstr, uintmax_t minval, uintmax_t maxval, - const char **errmsg); +uintmax_t strtounum(const char * __restrict, uintmax_t, uintmax_t, + const char ** __restrict); diff --git a/usr.sbin/pw/strtounum.c b/usr.sbin/pw/strtounum.c index b394486..8d83470 100644 --- a/usr.sbin/pw/strtounum.c +++ b/usr.sbin/pw/strtounum.c @@ -34,41 +34,38 @@ __FBSDID("$FreeBSD$"); #include "pw.h" -#define INVALID "invalid" -#define TOOSMALL "too small" -#define TOOLARGE "too large" - uintmax_t -strtounum(const char *numstr, uintmax_t minval, uintmax_t maxval, - const char **errstrp) +strtounum(const char * __restrict np, uintmax_t minval, uintmax_t maxval, + const char ** __restrict errpp) { - uintmax_t ret = 0; - char *ep; + char *endp; + uintmax_t ret; if (minval > maxval) { errno = EINVAL; - if (errstrp != NULL) - *errstrp = INVALID; + if (errpp != NULL) + *errpp = "invalid"; return (0); } - - ret = strtoumax(numstr, &ep, 10); - if (errno == EINVAL || numstr == ep || *ep != '\0') { + errno = 0; + ret = strtoumax(np, &endp, 10); + if (endp == np || *endp != '\0') { errno = EINVAL; - if (errstrp != NULL) - *errstrp = INVALID; + if (errpp != NULL) + *errpp = "invalid"; return (0); - } else if ((ret == 0 && errno == ERANGE) || ret < minval) { + } + if (ret < minval) { errno = ERANGE; - if (errstrp != NULL) - *errstrp = TOOSMALL; + if (errpp != NULL) + *errpp = "too small"; return (0); - } else if ((ret == UINTMAX_MAX && errno == ERANGE) || ret > maxval) { + } + if (errno == ERANGE || ret > maxval) { errno = ERANGE; - if (errstrp != NULL) - *errstrp = TOOLARGE; + if (errpp != NULL) + *errpp = "too large"; return (0); } - return (ret); } |