From 892e125f1c92f4f77e75ba56ccb80989de63c391 Mon Sep 17 00:00:00 2001 From: Joe Simmons-Talbott Date: Tue, 15 Aug 2023 14:28:25 +0000 Subject: fxprintf: Get rid of alloca Use a scratch_buffer rather than alloca/malloc to avoid potential stack overflow. Reviewed-by: Adhemerval Zanella --- stdio-common/fxprintf.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'stdio-common') diff --git a/stdio-common/fxprintf.c b/stdio-common/fxprintf.c index f0ac9654ab..88501ab61f 100644 --- a/stdio-common/fxprintf.c +++ b/stdio-common/fxprintf.c @@ -15,6 +15,7 @@ License along with the GNU C Library; if not, see . */ +#include #include #include #include @@ -34,20 +35,18 @@ locked_vfxprintf (FILE *fp, const char *fmt, va_list ap, wchar_t *wfmt; mbstate_t mbstate; int res; - int used_malloc = 0; size_t len = strlen (fmt) + 1; + struct scratch_buffer buf; + scratch_buffer_init (&buf); if (__glibc_unlikely (len > SIZE_MAX / sizeof (wchar_t))) { __set_errno (EOVERFLOW); return -1; } - if (__libc_use_alloca (len * sizeof (wchar_t))) - wfmt = alloca (len * sizeof (wchar_t)); - else if ((wfmt = malloc (len * sizeof (wchar_t))) == NULL) + if (!scratch_buffer_set_array_size (&buf, sizeof (wchar_t), len)) return -1; - else - used_malloc = 1; + wfmt = buf.data; memset (&mbstate, 0, sizeof mbstate); res = __mbsrtowcs (wfmt, &fmt, len, &mbstate); @@ -55,8 +54,7 @@ locked_vfxprintf (FILE *fp, const char *fmt, va_list ap, if (res != -1) res = __vfwprintf_internal (fp, wfmt, ap, mode_flags); - if (used_malloc) - free (wfmt); + scratch_buffer_free (&buf); return res; } -- cgit 1.4.1