1999-12-19  Ulrich Drepper  <drepper@cygnus.com>

	* stdio-common/printf_fp.c (__printf_fp): Allocate buffer to
	generate mantissa output in using malloc if it is larger than
	20000 characters.
	Reported by Jim Meyering <meyering@ascend.com>.
This commit is contained in:
Ulrich Drepper 1999-12-19 08:29:56 +00:00
parent e9e9b245b9
commit b526f8ac5f
2 changed files with 24 additions and 2 deletions

View File

@ -1,3 +1,10 @@
1999-12-19 Ulrich Drepper <drepper@cygnus.com>
* stdio-common/printf_fp.c (__printf_fp): Allocate buffer to
generate mantissa output in using malloc if it is larger than
20000 characters.
Reported by Jim Meyering <meyering@ascend.com>.
1999-12-18 Ulrich Drepper <drepper@cygnus.com> 1999-12-18 Ulrich Drepper <drepper@cygnus.com>
* misc/sys/cdefs.h: Define __attribute_malloc__ according to * misc/sys/cdefs.h: Define __attribute_malloc__ according to

View File

@ -747,6 +747,7 @@ __printf_fp (FILE *fp,
{ {
int width = info->width; int width = info->width;
char *buffer, *startp, *cp; char *buffer, *startp, *cp;
int buffer_malloced;
int chars_needed; int chars_needed;
int expscale; int expscale;
int intdig_max, intdig_no = 0; int intdig_max, intdig_no = 0;
@ -816,8 +817,18 @@ __printf_fp (FILE *fp,
/* Allocate buffer for output. We need two more because while rounding /* Allocate buffer for output. We need two more because while rounding
it is possible that we need two more characters in front of all the it is possible that we need two more characters in front of all the
other output. */ other output. If the amount of memory we have to allocate is too
buffer = alloca (2 + chars_needed); large use `malloc' instead of `alloca'. */
buffer_malloced = chars_needed > 20000;
if (buffer_malloced)
{
buffer = (char *) malloc (2 + chars_needed);
if (buffer == NULL)
/* Signal an error to the caller. */
return -1;
}
else
buffer = (char *) alloca (2 + chars_needed);
cp = startp = buffer + 2; /* Let room for rounding. */ cp = startp = buffer + 2; /* Let room for rounding. */
/* Do the real work: put digits in allocated buffer. */ /* Do the real work: put digits in allocated buffer. */
@ -1025,6 +1036,10 @@ __printf_fp (FILE *fp,
if (info->left && width > 0) if (info->left && width > 0)
PADN (info->pad, width); PADN (info->pad, width);
/* Free the memory if necessary. */
if (buffer_malloced)
free (buffer);
} }
return done; return done;
} }