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

@ -1,3 +1,8 @@
2011-12-17 Ulrich Drepper <drepper@gmail.com>
[BZ #13446]
* stdio-common/vfprintf.c (vfprintf): Fix extension of specs array.
2011-11-22 Adhemerval Zanella <azanella@linux.vnet.ibm.com> 2011-11-22 Adhemerval Zanella <azanella@linux.vnet.ibm.com>
* sysdeps/powerpc/Makefile: Added locale-defines.sym generation. * sysdeps/powerpc/Makefile: Added locale-defines.sym generation.

4
NEWS
View File

@ -12,8 +12,8 @@ Version 2.15
6779, 6783, 9696, 10103, 10709, 11589, 12403, 12847, 12868, 12852, 12874, 6779, 6783, 9696, 10103, 10709, 11589, 12403, 12847, 12868, 12852, 12874,
12885, 12892, 12907, 12922, 12935, 13007, 13021, 13067, 13068, 13090, 12885, 12892, 12907, 12922, 12935, 13007, 13021, 13067, 13068, 13090,
13092, 13114, 13118, 13123, 13134, 13138, 13147, 13150, 13179, 13192, 13092, 13114, 13118, 13123, 13134, 13138, 13147, 13150, 13179, 13192,
13268, 13276, 13291, 13335, 13337, 13344, 13358, 13367, 13472, 13484, 13268, 13276, 13291, 13335, 13337, 13344, 13358, 13367, 13446, 13472,
13506 13484, 13506
* New program pldd to list loaded object of a process * New program pldd to list loaded object of a process
Implemented by Ulrich Drepper. Implemented by Ulrich Drepper.

View File

@ -1640,9 +1640,9 @@ do_positional:
/* Array with information about the needed arguments. This has to /* Array with information about the needed arguments. This has to
be dynamically extensible. */ be dynamically extensible. */
size_t nspecs = 0; size_t nspecs = 0;
size_t nspecs_max = 32; /* A more or less arbitrary start value. */ /* A more or less arbitrary start value. */
struct printf_spec *specs size_t nspecs_size = 32 * sizeof (struct printf_spec);
= alloca (nspecs_max * sizeof (struct printf_spec)); struct printf_spec *specs = alloca (nspecs_size);
/* The number of arguments the format string requests. This will /* The number of arguments the format string requests. This will
determine the size of the array needed to store the argument 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) 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. */ /* Extend the array of format specifiers. */
struct printf_spec *old = specs; struct printf_spec *old = specs;
specs = extend_alloca (specs, nspecs_max, specs = extend_alloca (specs, nspecs_size, 2 * nspecs_size);
2 * nspecs_max * sizeof (*specs));
/* Copy the old array's elements to the new space. */ /* 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. */ /* Parse the format specifier. */