diff options
| -rw-r--r-- | libc/stdio/_scanf.c | 51 | 
1 files changed, 19 insertions, 32 deletions
| diff --git a/libc/stdio/_scanf.c b/libc/stdio/_scanf.c index e0af4863b..6ecb3cb1e 100644 --- a/libc/stdio/_scanf.c +++ b/libc/stdio/_scanf.c @@ -1352,21 +1352,7 @@ int VFSCANF (FILE *__restrict fp, const Wchar *__restrict format, va_list arg)  				(psfs.conv_num >= CONV_c)  #endif /* __UCLIBC_HAS_WCHAR__ */  			{ -				/* We might have to handle the allocation ourselves */ -				int len; -				unsigned char **ptr; -  				b = (psfs.store ? ((unsigned char *) psfs.cur_ptr) : buf); -				/* With 'm', we actually got a pointer to a pointer */ -				ptr = (void *)b; - -				i = 0; -				if (psfs.flags & FLAG_MALLOC) { -					len = 0; -					b = NULL; -				} else -					len = -1; -  				fail = 1;  				if (psfs.conv_num == CONV_c) { @@ -1374,25 +1360,31 @@ int VFSCANF (FILE *__restrict fp, const Wchar *__restrict format, va_list arg)  						sc.width = 1;  					} -					if (psfs.flags & FLAG_MALLOC) -						b = malloc(sc.width); -  					while (__scan_getc(&sc) >= 0) {  						zero_conversions = 0; -						b[i] = sc.cc; -						i += psfs.store; +						*b = sc.cc; +						b += psfs.store;  					}  					__scan_ungetc(&sc);  					if (sc.width > 0) {	/* Failed to read all required. */  						goto DONE;  					} -					if (psfs.flags & FLAG_MALLOC) -						*ptr = b;  					psfs.cnt += psfs.store;  					goto NEXT_FMT;  				}  				if (psfs.conv_num == CONV_s) { +					/* We might have to handle the allocation ourselves */ +					int len; +					/* With 'm', we actually got a pointer to a pointer */ +					unsigned char **ptr = (void *)b; + +					i = 0; +					if (psfs.flags & FLAG_MALLOC) { +						len = 0; +						b = NULL; +					} else +						len = -1;  					/* Yes, believe it or not, a %s conversion can store nuls. */  					while ((__scan_getc(&sc) >= 0) && !isspace(sc.cc)) { @@ -1408,6 +1400,10 @@ int VFSCANF (FILE *__restrict fp, const Wchar *__restrict format, va_list arg)  						fail = 0;  					} +					if (psfs.flags & FLAG_MALLOC) +						*ptr = b; +					/* The code below takes care of terminating NUL */ +					b += i;  				} else {  #ifdef __UCLIBC_HAS_WCHAR__  					assert((psfs.conv_num == CONV_LEFTBRACKET) || \ @@ -1463,14 +1459,8 @@ int VFSCANF (FILE *__restrict fp, const Wchar *__restrict format, va_list arg)  						if (!scanset[sc.cc]) {  							break;  						} -						if (i == len) { -							/* Pick a size that won't trigger a lot of -							 * mallocs early on ... */ -							len += 256; -							b = realloc(b, len + 1); -						} -						b[i] = sc.cc; -						i += psfs.store; +						*b = sc.cc; +						b += psfs.store;  						fail = 0;  					}  				} @@ -1480,9 +1470,6 @@ int VFSCANF (FILE *__restrict fp, const Wchar *__restrict format, va_list arg)  				if (fail) {	/* nothing stored! */  					goto DONE;  				} -				if (psfs.flags & FLAG_MALLOC) -					*ptr = b; -				b += i;  				*b = 0;		/* Nul-terminate string. */  				psfs.cnt += psfs.store;  				goto NEXT_FMT; | 
