Be resilient about NULL pointer arguments.
authorBruno Haible <bruno@clisp.org>
Wed, 24 May 2006 11:48:51 +0000 (11:48 +0000)
committerBruno Haible <bruno@clisp.org>
Wed, 24 May 2006 11:48:51 +0000 (11:48 +0000)
lib/ChangeLog
lib/printf-args.c

index ee82a46..a582801 100644 (file)
@@ -1,3 +1,10 @@
+2006-05-24  Bruno Haible  <bruno@clisp.org>
+
+       * printf-args.c (printf_fetchargs): Turn NULL pointers for
+       TYPE_STRING and TYPE_WIDE_STRING into a non-NULL replacement.
+       Reported by Thorsten Maerz <torte@netztorte.de> via
+       Aaron Stone <aaron@serendipity.cx>.
+
 2006-05-19  Paul Eggert  <eggert@cs.ucla.edu>
 
        * nanosleep.c [HAVE_SYS_SELECT_H]: Include <sys/select.h>.
index 0ed1acb..615858c 100644 (file)
@@ -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: