]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
Be resilient about NULL pointers.
authorBruno Haible <bruno@clisp.org>
Wed, 24 May 2006 11:47:29 +0000 (11:47 +0000)
committerBruno Haible <bruno@clisp.org>
Tue, 23 Jun 2009 10:13:21 +0000 (12:13 +0200)
gettext-runtime/intl/ChangeLog
gettext-runtime/intl/printf-args.c
gettext-runtime/libasprintf/ChangeLog
gettext-runtime/libasprintf/printf-args.c

index 2a4d7137464a543af622f3422400cbaa0b0eaf07..0831a27794916cb454566bf466dd967c7236a582 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-15  Ulrich Drepper  <drepper@redhat.com>
 
        * dcigettext.c (category_to_name): Adjust for _nl_category_names
index 5bb1ce1b01675feb75779b5117140777a25972b0..47b73d2c1dee4d8676d26a7b2063cbb39bb14330 100644 (file)
@@ -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:
index e78eb80d2e68bbbf4bc1046895695f6b68422270..cf0fb9eef2ea5dccefd4c39794170fb7f7c80968 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-02  Charles Wilson  <cygwin@cwilson.fastmail.fm>
 
        * configure.ac (LTNOUNDEF): Set to -no-undefined also on mingw and
index 5bb1ce1b01675feb75779b5117140777a25972b0..47b73d2c1dee4d8676d26a7b2063cbb39bb14330 100644 (file)
@@ -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: