# HG changeset patch # User Bruno Haible # Date 1148471331 0 # Node ID 7f5add7487dc78db7555efca9edc1e497f2b835f # Parent 87a7e1a6aca2cb7ff6377a3233f740d33f2f831a Be resilient about NULL pointer arguments. diff --git a/lib/ChangeLog b/lib/ChangeLog --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,10 @@ +2006-05-24 Bruno Haible + + * printf-args.c (printf_fetchargs): Turn NULL pointers for + TYPE_STRING and TYPE_WIDE_STRING into a non-NULL replacement. + Reported by Thorsten Maerz via + Aaron Stone . + 2006-05-19 Paul Eggert * nanosleep.c [HAVE_SYS_SELECT_H]: Include . diff --git a/lib/printf-args.c b/lib/printf-args.c --- a/lib/printf-args.c +++ b/lib/printf-args.c @@ -1,5 +1,5 @@ /* Decomposed printf argument list. - Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. + Copyright (C) 1999, 2002-2003, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -84,10 +84,29 @@ #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: