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