diff options
author | Bruno Haible <bruno@clisp.org> | 2006-05-24 11:47:29 +0000 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2009-06-23 12:13:21 +0200 |
commit | e383f0c6399370e864c0cccc3fc2ded16ef1cb93 (patch) | |
tree | fd2338d4d17f716db75b08f8fbd65c6837a56973 /gettext-runtime/libasprintf/printf-args.c | |
parent | 8063adb7ae17e07d8b664bd9b1b7a656c0aedf57 (diff) | |
download | external_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.c | 21 |
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: |