fix incorrect overflow errors on strtoul, etc.
[musl] / src / stdlib / strtoul.c
index 951d5e8..20d8bfb 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;
        }