From: Bruno Haible Date: Wed, 24 May 2006 11:48:51 +0000 (+0000) Subject: Be resilient about NULL pointer arguments. X-Git-Tag: cvs-readonly~2386 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=b680ccf8f914177c9f4fab65bead5c6b034c5d99;p=gnulib.git Be resilient about NULL pointer arguments. --- diff --git a/lib/ChangeLog b/lib/ChangeLog index ee82a465d..a582801a3 100644 --- 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 index 0ed1acbb8..615858c4e 100644 --- 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 @@ 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: