svn commit: r286066 - head/usr.sbin/pw
Baptiste Daroussin
bapt at FreeBSD.org
Thu Jul 30 06:14:49 UTC 2015
Author: bapt
Date: Thu Jul 30 06:14:47 2015
New Revision: 286066
URL: https://svnweb.freebsd.org/changeset/base/286066
Log:
Improve strtounum
Fix many style bugs
Better variable naming
Use C99 'restrict' were apropriate
Fix potential errno race
Submitted by: bde
Modified:
head/usr.sbin/pw/pw.h
head/usr.sbin/pw/strtounum.c
Modified: head/usr.sbin/pw/pw.h
==============================================================================
--- head/usr.sbin/pw/pw.h Thu Jul 30 05:13:12 2015 (r286065)
+++ head/usr.sbin/pw/pw.h Thu Jul 30 06:14:47 2015 (r286066)
@@ -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);
Modified: head/usr.sbin/pw/strtounum.c
==============================================================================
--- head/usr.sbin/pw/strtounum.c Thu Jul 30 05:13:12 2015 (r286065)
+++ head/usr.sbin/pw/strtounum.c Thu Jul 30 06:14:47 2015 (r286066)
@@ -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);
}
More information about the svn-src-head
mailing list