diff options
author | Ulrich Drepper <drepper@redhat.com> | 2007-05-21 18:23:50 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2007-05-21 18:23:50 +0000 |
commit | af269dd9541f881695ac27ad951c094b8dbd4738 (patch) | |
tree | bdf376bd4c205c886ba088ba94b80f80ac391ada /stdio-common/vfprintf.c | |
parent | 1f4843fbffccebc60f85b1e1a48711d4fb9ab210 (diff) | |
download | glibc-af269dd9541f881695ac27ad951c094b8dbd4738.tar.gz glibc-af269dd9541f881695ac27ad951c094b8dbd4738.tar.xz glibc-af269dd9541f881695ac27ad951c094b8dbd4738.zip |
[BZ #4514]
* stdio-common/vfprintf.c (vfprintf): Don't shadow workstart variable, reinitialize workend at the start of each do_positional format spec loop, free workstart before do_positional loops. (printf_unknown): Fix size of work_buffer. * stdio-common/tst-sprintf.c (main): Add 3 new testcases.
Diffstat (limited to 'stdio-common/vfprintf.c')
-rw-r--r-- | stdio-common/vfprintf.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c index 20638ad1fd..25edde7511 100644 --- a/stdio-common/vfprintf.c +++ b/stdio-common/vfprintf.c @@ -1627,6 +1627,8 @@ do_positional: /* Just a counter. */ size_t cnt; + free (workstart); + workstart = NULL; if (grouping == (const char *) -1) { @@ -1801,7 +1803,9 @@ do_positional: int use_outdigits = specs[nspecs_done].info.i18n; char pad = specs[nspecs_done].info.pad; CHAR_T spec = specs[nspecs_done].info.spec; - CHAR_T *workstart = NULL; + + workstart = NULL; + workend = &work_buffer[sizeof (work_buffer) / sizeof (CHAR_T)]; /* Fill in last information. */ if (specs[nspecs_done].width_arg != -1) @@ -1897,8 +1901,7 @@ do_positional: break; } - if (__builtin_expect (workstart != NULL, 0)) - free (workstart); + free (workstart); workstart = NULL; /* Write the following constant string. */ @@ -1926,7 +1929,7 @@ printf_unknown (FILE *s, const struct printf_info *info, { int done = 0; - CHAR_T work_buffer[MAX (info->width, info->spec) + 32]; + CHAR_T work_buffer[MAX (sizeof (info->width), sizeof (info->prec)) * 3]; CHAR_T *const workend = &work_buffer[sizeof (work_buffer) / sizeof (CHAR_T)]; register CHAR_T *w; |