mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 10:50:07 +00:00
Update.
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:
parent
e9e9b245b9
commit
b526f8ac5f
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user