Browse Source

fix incorrect overflow errors on strtoul, etc.

Rich Felker 13 years ago
parent
commit
96cea94ad2
4 changed files with 20 additions and 8 deletions
  1. 5 2
      src/stdlib/strtoul.c
  2. 5 2
      src/stdlib/strtoull.c
  3. 5 2
      src/stdlib/wcstoul.c
  4. 5 2
      src/stdlib/wcstoull.c

+ 5 - 2
src/stdlib/strtoul.c

@@ -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;
 	}

+ 5 - 2
src/stdlib/strtoull.c

@@ -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;
 	}

+ 5 - 2
src/stdlib/wcstoul.c

@@ -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;
 	}

+ 5 - 2
src/stdlib/wcstoull.c

@@ -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;
 	}