From: Ulrich Drepper Date: Sun, 19 Dec 1999 08:26:20 +0000 (+0000) Subject: (__printf_fp): Allocate buffer to generate mantissa output in using X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=228bb33151a571c0f9353eac0f0c3422f4bdb45a;p=thirdparty%2Fglibc.git (__printf_fp): Allocate buffer to generate mantissa output in using malloc if it is larger than 20000 characters. --- diff --git a/stdio-common/printf_fp.c b/stdio-common/printf_fp.c index c75289a3a94..4ecf6bf3b3f 100644 --- a/stdio-common/printf_fp.c +++ b/stdio-common/printf_fp.c @@ -724,6 +724,7 @@ __printf_fp (FILE *fp, { int width = info->width; char *buffer, *startp, *cp; + int buffer_malloced; int chars_needed; int expscale; int intdig_max, intdig_no = 0; @@ -790,8 +791,18 @@ __printf_fp (FILE *fp, /* 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 - other output. */ - buffer = alloca (2 + chars_needed); + other output. If the amount of memory we have to allocate is too + 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 = alloca (2 + chars_needed); cp = startp = buffer + 2; /* Let room for rounding. */ /* Do the real work: put digits in allocated buffer. */ @@ -999,6 +1010,10 @@ __printf_fp (FILE *fp, if (info->left && width > 0) PADN (info->pad, width); + + /* Free the memory if necessary. */ + if (buffer_malloced) + free (buffer); } return done; }