summaryrefslogtreecommitdiffstats
path: root/usr.sbin/pw
diff options
context:
space:
mode:
authorbapt <bapt@FreeBSD.org>2015-07-30 06:14:47 +0000
committerbapt <bapt@FreeBSD.org>2015-07-30 06:14:47 +0000
commit1567d1bb44ec481ada84e859e0ede39667094680 (patch)
treea7d66b1ab9e656ab0cd07e097d8b07a4b11f0316 /usr.sbin/pw
parent84ed76c8118e483121b0f2ce0924a7f50c9bee92 (diff)
downloadFreeBSD-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.h4
-rw-r--r--usr.sbin/pw/strtounum.c41
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);
}
OpenPOWER on IntegriCloud