Browse Source

lift printf field width limit

uClibc mishandles printf field width limits larger than 40959, as a
result of misguided overflow-protection code.  This causes spurious test
failures with GNU coreutils, which depends on "%65536s" and "%20000000f"
working according to spec.

Signed-off-by: Michael Deutschmann <michael@talamasca.ocis.net>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Michael Deutschmann 15 years ago
parent
commit
266aaaf46e
1 changed files with 4 additions and 4 deletions
  1. 4 4
      libc/stdio/_vfprintf.c

+ 4 - 4
libc/stdio/_vfprintf.c

@@ -161,9 +161,6 @@
 /* Now controlled by uClibc_stdio.h. */
 /* #define __UCLIBC_HAS_GLIBC_CUSTOM_PRINTF__ */
 
-/* TODO -- move these to a configuration section? */
-#define MAX_FIELD_WIDTH		4095
-
 #ifdef __UCLIBC_MJN3_ONLY__
 #ifdef L_register_printf_function
 /* emit only once */
@@ -893,8 +890,11 @@ int attribute_hidden _ppfs_parsespec(ppfs_t *ppfs)
 	}
 	i = 0;
 	while (isdigit(*fmt)) {
-		if (i < MAX_FIELD_WIDTH) { /* Avoid overflow. */
+		if (i < INT_MAX / 10
+		    || (i == INT_MAX / 10 && (*fmt - '0') <= INT_MAX % 10)) {
 			i = (i * 10) + (*fmt - '0');
+		} else {
+			i = INT_MAX; /* best we can do... */
 		}
 		++fmt;
 	}