diff options
author | pluknet <pluknet@FreeBSD.org> | 2013-08-30 11:21:52 +0000 |
---|---|---|
committer | pluknet <pluknet@FreeBSD.org> | 2013-08-30 11:21:52 +0000 |
commit | 0030cdac07df412f040b7616431b47c1265e0e69 (patch) | |
tree | ec178df2fdc1c0e4ec69d9cb359f4a92f48929de /lib | |
parent | 415d59b5d8e4982f162fcff84c3f0514a99b8ada (diff) | |
download | FreeBSD-src-0030cdac07df412f040b7616431b47c1265e0e69.zip FreeBSD-src-0030cdac07df412f040b7616431b47c1265e0e69.tar.gz |
The round of expand_number() cleanups.
o Fix range error checking to detect overflow when uint64_t < uintmax_t.
o Remove a non-functional check for no valid digits as pointed out by Bruce.
o Remove a rather pointless comment describing what the function does.
o Clean up a bunch of style bugs.
Brucified by: bde
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libutil/expand_number.c | 39 |
1 files changed, 10 insertions, 29 deletions
diff --git a/lib/libutil/expand_number.c b/lib/libutil/expand_number.c index 401e2d9..24bcc39 100644 --- a/lib/libutil/expand_number.c +++ b/lib/libutil/expand_number.c @@ -35,42 +35,24 @@ __FBSDID("$FreeBSD$"); #include <libutil.h> #include <stdint.h> -/* - * Convert an expression of the following forms to a uint64_t. - * 1) A positive decimal number. - * 2) A positive decimal number followed by a 'b' or 'B' (mult by 1). - * 3) A positive decimal number followed by a 'k' or 'K' (mult by 1 << 10). - * 4) A positive decimal number followed by a 'm' or 'M' (mult by 1 << 20). - * 5) A positive decimal number followed by a 'g' or 'G' (mult by 1 << 30). - * 6) A positive decimal number followed by a 't' or 'T' (mult by 1 << 40). - * 7) A positive decimal number followed by a 'p' or 'P' (mult by 1 << 50). - * 8) A positive decimal number followed by a 'e' or 'E' (mult by 1 << 60). - */ int expand_number(const char *buf, uint64_t *num) { + char *endptr; + uintmax_t umaxval; uint64_t number; - int saved_errno; unsigned shift; - char *endptr; + int serrno; - saved_errno = errno; + serrno = errno; errno = 0; - - number = strtoumax(buf, &endptr, 0); - - if (number == UINTMAX_MAX && errno == ERANGE) { - return (-1); - } - - if (errno == 0) - errno = saved_errno; - - if (endptr == buf) { - /* No valid digits. */ - errno = EINVAL; + umaxval = strtoumax(buf, &endptr, 0); + if (umaxval > UINT64_MAX) + errno = ERANGE; + if (errno != 0) return (-1); - } + errno = serrno; + number = umaxval; switch (tolower((unsigned char)*endptr)) { case 'e': @@ -106,7 +88,6 @@ expand_number(const char *buf, uint64_t *num) errno = ERANGE; return (-1); } - *num = number << shift; return (0); } |