diff options
author | Ulrich Drepper <drepper@gmail.com> | 2010-12-24 19:28:32 -0500 |
---|---|---|
committer | Ulrich Drepper <drepper@gmail.com> | 2010-12-24 19:28:32 -0500 |
commit | 07eb4b716ea5041bceb47b38ac8ab989a10b3afd (patch) | |
tree | 3abd0557573c328fd80b23ca87aa68d7b1e7bfd0 | |
parent | 14b697f75a5f039a0e3155c62399ee217c0f17dc (diff) | |
download | glibc-07eb4b716ea5041bceb47b38ac8ab989a10b3afd.tar.gz glibc-07eb4b716ea5041bceb47b38ac8ab989a10b3afd.tar.xz glibc-07eb4b716ea5041bceb47b38ac8ab989a10b3afd.zip |
Always allow overwriting printf modifiers etc.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | stdio-common/vfprintf.c | 20 |
2 files changed, 18 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog index 9f8305624c..958c76ae22 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2010-12-24 Ulrich Drepper <drepper@gmail.com> + + * stdio-common/vfprintf.c (vfprintf): If printf handlers are installed + always use the slow path. + 2010-12-15 Ryan S. Arnold <rsa@us.ibm.com> * elf/Makefile: (check-execstack): Replace $(native-compile) with a diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c index 6e0e85cd7c..fc370e8cbc 100644 --- a/stdio-common/vfprintf.c +++ b/stdio-common/vfprintf.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991-2008, 2009 Free Software Foundation, Inc. +/* Copyright (C) 1991-2008, 2009, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -329,7 +329,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) REF (form_floathex), /* for 'A', 'a' */ \ REF (mod_ptrdiff_t), /* for 't' */ \ REF (mod_intmax_t), /* for 'j' */ \ - REF (flag_i18n), /* for 'I' */ \ + REF (flag_i18n), /* for 'I' */ \ }; \ /* Step 1: after processing width. */ \ static JUMP_TABLE_TYPE step1_jumps[30] = \ @@ -540,7 +540,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) if (is_long_num) \ signed_number = va_arg (ap, long int); \ else if (is_char) \ - signed_number = (signed char) va_arg (ap, unsigned int); \ + signed_number = (signed char) va_arg (ap, unsigned int); \ else if (!is_short) \ signed_number = va_arg (ap, int); \ else \ @@ -636,7 +636,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) if (is_long_num) \ number.word = va_arg (ap, unsigned long int); \ else if (is_char) \ - number.word = (unsigned char) va_arg (ap, unsigned int); \ + number.word = (unsigned char) va_arg (ap, unsigned int); \ else if (!is_short) \ number.word = va_arg (ap, unsigned int); \ else \ @@ -830,7 +830,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) \ LABEL (form_floathex): \ { \ - /* Floating point number printed as hexadecimal number. */ \ + /* Floating point number printed as hexadecimal number. */ \ const void *ptr; \ int function_done; \ \ @@ -987,7 +987,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) --width; \ if (!left) \ PAD (L' '); \ - if (fspec == NULL) \ + if (fspec == NULL) \ outchar (va_arg (ap, wchar_t)); \ else \ outchar (args_value[fspec->data_arg].pa_wchar); \ @@ -1241,7 +1241,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) \ if (len == (size_t) -1) \ { \ - /* Illegal wide-character string. */ \ + /* Illegal wide-character string. */ \ done = -1; \ goto all_done; \ } \ @@ -1318,6 +1318,12 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) if (*f == L_('\0')) goto all_done; + /* Use the slow path in case any printf handler is registered. */ + if (__builtin_expect (__printf_function_table != NULL + || __printf_modifier_table != NULL + || __printf_va_arg_table != NULL, 0)) + goto do_positional; + /* Process whole format string. */ do { |