1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-07 06:43:00 +03:00

Fix extension of array in extended printf format handling

This commit is contained in:
Ulrich Drepper
2011-12-17 21:27:25 -05:00
parent f0b264f174
commit a4647e727a
3 changed files with 13 additions and 9 deletions

View File

@@ -1640,9 +1640,9 @@ do_positional:
/* Array with information about the needed arguments. This has to
be dynamically extensible. */
size_t nspecs = 0;
size_t nspecs_max = 32; /* A more or less arbitrary start value. */
struct printf_spec *specs
= alloca (nspecs_max * sizeof (struct printf_spec));
/* A more or less arbitrary start value. */
size_t nspecs_size = 32 * sizeof (struct printf_spec);
struct printf_spec *specs = alloca (nspecs_size);
/* The number of arguments the format string requests. This will
determine the size of the array needed to store the argument
@@ -1679,15 +1679,14 @@ do_positional:
for (f = lead_str_end; *f != L_('\0'); f = specs[nspecs++].next_fmt)
{
if (nspecs >= nspecs_max)
if (nspecs * sizeof (*specs) >= nspecs_size)
{
/* Extend the array of format specifiers. */
struct printf_spec *old = specs;
specs = extend_alloca (specs, nspecs_max,
2 * nspecs_max * sizeof (*specs));
specs = extend_alloca (specs, nspecs_size, 2 * nspecs_size);
/* Copy the old array's elements to the new space. */
memmove (specs, old, nspecs * sizeof (struct printf_spec));
memmove (specs, old, nspecs * sizeof (*specs));
}
/* Parse the format specifier. */