diff options
author | Goffredo Baroncelli <kreijack@gmail.com> | 2012-10-29 18:53:18 +0100 |
---|---|---|
committer | David Sterba <dsterba@suse.cz> | 2013-01-17 18:27:54 +0100 |
commit | 631886760203135f6cedb861466604e428217c71 (patch) | |
tree | 924770a56abc7020001ced75fbffed7bc44679af /utils.c | |
parent | 8f76aee6bc7cd0155ca6a251f6656a5560298f54 (diff) |
parse_size(): replace atoll() with strtoull()
Replace the function atoll with strtoull(); Check that the suffix for the
parse_size() input is of only one character.
Signed-off-by: Goffredo Baroncelli <kreijack@inwind.it>
Diffstat (limited to 'utils.c')
-rw-r--r-- | utils.c | 25 |
1 files changed, 19 insertions, 6 deletions
@@ -31,6 +31,7 @@ #include <fcntl.h> #include <unistd.h> #include <mntent.h> +#include <ctype.h> #include <linux/loop.h> #include <linux/major.h> #include <linux/kdev_t.h> @@ -1222,12 +1223,18 @@ scan_again: u64 parse_size(char *s) { - int len = strlen(s); + int i; char c; u64 mult = 1; - if (!isdigit(s[len - 1])) { - c = tolower(s[len - 1]); + for (i=0 ; s[i] && isdigit(s[i]) ; i++) ; + if (!i) { + fprintf(stderr, "ERROR: size value is empty\n"); + exit(50); + } + + if (s[i]) { + c = tolower(s[i]); switch (c) { case 'g': mult *= 1024; @@ -1238,11 +1245,17 @@ u64 parse_size(char *s) case 'b': break; default: - fprintf(stderr, "Unknown size descriptor %c\n", c); + fprintf(stderr, "ERROR: Unknown size descriptor " + "'%c'\n", c); exit(1); } - s[len - 1] = '\0'; } - return atoll(s) * mult; + if (s[i] && s[i+1]) { + fprintf(stderr, "ERROR: Illegal suffix contains " + "character '%c' in wrong position\n", + s[i+1]); + exit(51); + } + return strtoull(s, NULL, 10) * mult; } |