diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2006-11-28 10:54:16 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2006-11-28 10:54:16 +0000 |
| commit | df38188367a9fe10cc4efc00d3236be05178ff4e (patch) | |
| tree | 62744bb61c464da31b5e2d2bb2a5ee7f3de2bbba | |
| parent | 7df69b887ad07c051b53a0217bc649c4bed20ed4 (diff) | |
| download | busybox-w32-df38188367a9fe10cc4efc00d3236be05178ff4e.tar.gz busybox-w32-df38188367a9fe10cc4efc00d3236be05178ff4e.tar.bz2 busybox-w32-df38188367a9fe10cc4efc00d3236be05178ff4e.zip | |
fix bug in new str -> num convertors
| -rw-r--r-- | libbb/bb_strtonum.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/libbb/bb_strtonum.c b/libbb/bb_strtonum.c index 7e28eeb86..6fbd1f87d 100644 --- a/libbb/bb_strtonum.c +++ b/libbb/bb_strtonum.c | |||
| @@ -49,6 +49,7 @@ static unsigned long long handle_errors(unsigned long long v, char **endp, char | |||
| 49 | 49 | ||
| 50 | unsigned long long bb_strtoull(const char *arg, char **endp, int base) | 50 | unsigned long long bb_strtoull(const char *arg, char **endp, int base) |
| 51 | { | 51 | { |
| 52 | unsigned long long v; | ||
| 52 | char *endptr; | 53 | char *endptr; |
| 53 | 54 | ||
| 54 | /* strtoul(" -4200000000") returns 94967296, errno 0 (!) */ | 55 | /* strtoul(" -4200000000") returns 94967296, errno 0 (!) */ |
| @@ -57,35 +58,42 @@ unsigned long long bb_strtoull(const char *arg, char **endp, int base) | |||
| 57 | 58 | ||
| 58 | /* not 100% correct for lib func, but convenient for the caller */ | 59 | /* not 100% correct for lib func, but convenient for the caller */ |
| 59 | errno = 0; | 60 | errno = 0; |
| 60 | return handle_errors(strtoull(arg, &endptr, base), endp, endptr); | 61 | v = strtoull(arg, &endptr, base); |
| 62 | return handle_errors(v, endp, endptr); | ||
| 61 | } | 63 | } |
| 62 | 64 | ||
| 63 | long long bb_strtoll(const char *arg, char **endp, int base) | 65 | long long bb_strtoll(const char *arg, char **endp, int base) |
| 64 | { | 66 | { |
| 67 | unsigned long long v; | ||
| 65 | char *endptr; | 68 | char *endptr; |
| 66 | 69 | ||
| 67 | if (arg[0] != '-' && !isalnum(arg[0])) return ret_ERANGE(); | 70 | if (arg[0] != '-' && !isalnum(arg[0])) return ret_ERANGE(); |
| 68 | errno = 0; | 71 | errno = 0; |
| 69 | return handle_errors(strtoll(arg, &endptr, base), endp, endptr); | 72 | v = strtoll(arg, &endptr, base); |
| 73 | return handle_errors(v, endp, endptr); | ||
| 70 | } | 74 | } |
| 71 | 75 | ||
| 72 | #if ULONG_MAX != ULLONG_MAX | 76 | #if ULONG_MAX != ULLONG_MAX |
| 73 | unsigned long bb_strtoul(const char *arg, char **endp, int base) | 77 | unsigned long bb_strtoul(const char *arg, char **endp, int base) |
| 74 | { | 78 | { |
| 79 | unsigned long v; | ||
| 75 | char *endptr; | 80 | char *endptr; |
| 76 | 81 | ||
| 77 | if (!isalnum(arg[0])) return ret_ERANGE(); | 82 | if (!isalnum(arg[0])) return ret_ERANGE(); |
| 78 | errno = 0; | 83 | errno = 0; |
| 79 | return handle_errors(strtoul(arg, &endptr, base), endp, endptr); | 84 | v = strtoul(arg, &endptr, base); |
| 85 | return handle_errors(v, endp, endptr); | ||
| 80 | } | 86 | } |
| 81 | 87 | ||
| 82 | long bb_strtol(const char *arg, char **endp, int base) | 88 | long bb_strtol(const char *arg, char **endp, int base) |
| 83 | { | 89 | { |
| 90 | long v; | ||
| 84 | char *endptr; | 91 | char *endptr; |
| 85 | 92 | ||
| 86 | if (arg[0] != '-' && !isalnum(arg[0])) return ret_ERANGE(); | 93 | if (arg[0] != '-' && !isalnum(arg[0])) return ret_ERANGE(); |
| 87 | errno = 0; | 94 | errno = 0; |
| 88 | return handle_errors(strtol(arg, &endptr, base), endp, endptr); | 95 | v = strtol(arg, &endptr, base); |
| 96 | return handle_errors(v, endp, endptr); | ||
| 89 | } | 97 | } |
| 90 | #endif | 98 | #endif |
| 91 | 99 | ||
