summaryrefslogtreecommitdiffstats
path: root/gettext-runtime/libasprintf/printf-args.c
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2006-05-24 11:47:29 +0000
committerBruno Haible <bruno@clisp.org>2009-06-23 12:13:21 +0200
commite383f0c6399370e864c0cccc3fc2ded16ef1cb93 (patch)
treefd2338d4d17f716db75b08f8fbd65c6837a56973 /gettext-runtime/libasprintf/printf-args.c
parent8063adb7ae17e07d8b664bd9b1b7a656c0aedf57 (diff)
downloadexternal_gettext-e383f0c6399370e864c0cccc3fc2ded16ef1cb93.zip
external_gettext-e383f0c6399370e864c0cccc3fc2ded16ef1cb93.tar.gz
external_gettext-e383f0c6399370e864c0cccc3fc2ded16ef1cb93.tar.bz2
Be resilient about NULL pointers.
Diffstat (limited to 'gettext-runtime/libasprintf/printf-args.c')
-rw-r--r--gettext-runtime/libasprintf/printf-args.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/gettext-runtime/libasprintf/printf-args.c b/gettext-runtime/libasprintf/printf-args.c
index 5bb1ce1..47b73d2 100644
--- a/gettext-runtime/libasprintf/printf-args.c
+++ b/gettext-runtime/libasprintf/printf-args.c
@@ -1,5 +1,5 @@
/* Decomposed printf argument list.
- Copyright (C) 1999, 2002-2003, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2002-2003, 2005-2006 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU Library General Public License as published
@@ -91,10 +91,29 @@ printf_fetchargs (va_list args, arguments *a)
#endif
case TYPE_STRING:
ap->a.a_string = va_arg (args, const char *);
+ /* A null pointer is an invalid argument for "%s", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_string == NULL)
+ ap->a.a_string = "(NULL)";
break;
#ifdef HAVE_WCHAR_T
case TYPE_WIDE_STRING:
ap->a.a_wide_string = va_arg (args, const wchar_t *);
+ /* A null pointer is an invalid argument for "%ls", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_wide_string == NULL)
+ {
+ static const wchar_t wide_null_string[] =
+ {
+ (wchar_t)'(',
+ (wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L',
+ (wchar_t)')',
+ (wchar_t)0
+ };
+ ap->a.a_wide_string = wide_null_string;
+ }
break;
#endif
case TYPE_POINTER: