fix incorrect overflow errors on strtoul, etc.
authorRich Felker <dalias@aerifal.cx>
Tue, 6 Sep 2011 02:23:06 +0000 (22:23 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 6 Sep 2011 02:23:06 +0000 (22:23 -0400)
src/stdlib/strtoul.c
src/stdlib/strtoull.c
src/stdlib/wcstoul.c
src/stdlib/wcstoull.c

index 951d5e8c7a29a12a3adfb7450142985f0eff6755..20d8bfb28f0ab2f45506d0ae7d09cd0773e9d7fe 100644 (file)
@@ -5,8 +5,11 @@
 
 unsigned long strtoul(const char *s, char **p, int base)
 {
-       uintmax_t x = strtoumax(s, p, base);
-       if (x > ULONG_MAX) {
+       intmax_t x;
+       if (sizeof(intmax_t) == sizeof(long))
+               return strtoumax(s, p, base);
+       x = strtoimax(s, p, base);
+       if (-x > ULONG_MAX || x > ULONG_MAX) {
                errno = ERANGE;
                return ULONG_MAX;
        }
index 20aa7bdeca007db15083572dbd3620dabdff1858..5d1c4ee518553ee00fa7644e5fb596e8dab27770 100644 (file)
@@ -5,8 +5,11 @@
 
 unsigned long long strtoull(const char *s, char **p, int base)
 {
-       uintmax_t x = strtoumax(s, p, base);
-       if (x > ULLONG_MAX) {
+       intmax_t x;
+       if (sizeof(intmax_t) == sizeof(long long))
+               return strtoumax(s, p, base);
+       x = strtoimax(s, p, base);
+       if (-x > ULLONG_MAX || x > ULLONG_MAX) {
                errno = ERANGE;
                return ULLONG_MAX;
        }
index e39faafe10b35f5cefa695faae381bb9b3079392..9cbec1a86ec2c261bf463a89d846b4c5e6b654f8 100644 (file)
@@ -6,8 +6,11 @@
 
 unsigned long wcstoul(const wchar_t *s, wchar_t **p, int base)
 {
-       uintmax_t x = wcstoumax(s, p, base);
-       if (x > ULONG_MAX) {
+       intmax_t x;
+       if (sizeof(intmax_t) == sizeof(long))
+               return wcstoumax(s, p, base);
+       x = wcstoimax(s, p, base);
+       if (-x > ULONG_MAX || x > ULONG_MAX) {
                errno = ERANGE;
                return ULONG_MAX;
        }
index e324dfb22edd7a5ac3c0c40305211952808b6c01..48c557db59d77889e8095098c7478cd7a0d37fd0 100644 (file)
@@ -6,8 +6,11 @@
 
 unsigned long long wcstoull(const wchar_t *s, wchar_t **p, int base)
 {
-       uintmax_t x = wcstoumax(s, p, base);
-       if (x > ULLONG_MAX) {
+       intmax_t x;
+       if (sizeof(intmax_t) == sizeof(long long))
+               return wcstoumax(s, p, base);
+       x = wcstoimax(s, p, base);
+       if (-x > ULLONG_MAX || x > ULLONG_MAX) {
                errno = ERANGE;
                return ULLONG_MAX;
        }