Jens Petersen 3b29a5
From: Bruno Haible <bruno@clisp.org>
Jens Petersen 3b29a5
Subject: Fix xgettext crash when extracting a message with plural that is excluded.
Jens Petersen 3b29a5
Bug-Debian: http://bugs.debian.org/608181
Jens Petersen 3b29a5
X-Debian-version: 0.18.1.1-4
Jens Petersen 3b29a5
Jens Petersen 3b29a5
--- a/gettext-tools/src/xgettext.c
Jens Petersen 3b29a5
+++ b/gettext-tools/src/xgettext.c
Jens Petersen 3b29a5
@@ -1,5 +1,5 @@
Jens Petersen 3b29a5
 /* Extracts strings from C source file to Uniforum style .po file.
Jens Petersen 3b29a5
-   Copyright (C) 1995-1998, 2000-2010 Free Software Foundation, Inc.
Jens Petersen 3b29a5
+   Copyright (C) 1995-1998, 2000-2011 Free Software Foundation, Inc.
Jens Petersen 3b29a5
    Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, April 1995.
Jens Petersen 3b29a5
 
Jens Petersen 3b29a5
    This program is free software: you can redistribute it and/or modify
Jens Petersen 3b29a5
@@ -2933,7 +2933,7 @@
Jens Petersen 3b29a5
                                      msgid_context,
Jens Petersen 3b29a5
                                      &best_cp->msgid_pos,
Jens Petersen 3b29a5
                                      NULL, best_cp->msgid_comment);
Jens Petersen 3b29a5
-            if (best_cp->msgid_plural != NULL)
Jens Petersen 3b29a5
+            if (mp != NULL && best_cp->msgid_plural != NULL)
Jens Petersen 3b29a5
               remember_a_message_plural (mp, best_cp->msgid_plural,
Jens Petersen 3b29a5
                                          msgid_plural_context,
Jens Petersen 3b29a5
                                          &best_cp->msgid_plural_pos,
Jens Petersen 3b29a5
--- a/gettext-tools/src/xgettext.h
Jens Petersen 3b29a5
+++ b/gettext-tools/src/xgettext.h
Jens Petersen 3b29a5
@@ -1,5 +1,5 @@
Jens Petersen 3b29a5
 /* xgettext common functions.
Jens Petersen 3b29a5
-   Copyright (C) 2001-2003, 2005-2006, 2008-2009 Free Software Foundation, Inc.
Jens Petersen 3b29a5
+   Copyright (C) 2001-2003, 2005-2006, 2008-2009, 2011 Free Software Foundation, Inc.
Jens Petersen 3b29a5
    Written by Peter Miller <millerp@canb.auug.org.au>
Jens Petersen 3b29a5
    and Bruno Haible <haible@clisp.cons.org>, 2001.
Jens Petersen 3b29a5
 
Jens Petersen 3b29a5
@@ -247,7 +247,8 @@
Jens Petersen 3b29a5
    or NULL.
Jens Petersen 3b29a5
    COMMENT may be savable_comment, or it may be a saved copy of savable_comment
Jens Petersen 3b29a5
    (then add_reference must be used when saving it, and drop_reference while
Jens Petersen 3b29a5
-   dropping it).  Clear savable_comment.  */
Jens Petersen 3b29a5
+   dropping it).  Clear savable_comment.
Jens Petersen 3b29a5
+   Return the new or found message, or NULL if the message is excluded.  */
Jens Petersen 3b29a5
 extern message_ty *remember_a_message (message_list_ty *mlp,
Jens Petersen 3b29a5
                                        char *msgctxt,
Jens Petersen 3b29a5
                                        char *msgid,
Jens Petersen 3b29a5
--- a/gettext-tools/src/x-smalltalk.c
Jens Petersen 3b29a5
+++ b/gettext-tools/src/x-smalltalk.c
Jens Petersen 3b29a5
@@ -1,5 +1,5 @@
Jens Petersen 3b29a5
 /* xgettext Smalltalk backend.
Jens Petersen 3b29a5
-   Copyright (C) 2002-2003, 2005-2009 Free Software Foundation, Inc.
Jens Petersen 3b29a5
+   Copyright (C) 2002-2003, 2005-2009, 2011 Free Software Foundation, Inc.
Jens Petersen 3b29a5
 
Jens Petersen 3b29a5
    This file was written by Bruno Haible <haible@clisp.cons.org>, 2002.
Jens Petersen 3b29a5
 
Jens Petersen 3b29a5
@@ -562,9 +562,10 @@
Jens Petersen 3b29a5
                 lex_pos_ty pos;
Jens Petersen 3b29a5
                 pos.file_name = logical_file_name;
Jens Petersen 3b29a5
                 pos.line_number = token.line_number;
Jens Petersen 3b29a5
-                remember_a_message_plural (plural_mp, token.string,
Jens Petersen 3b29a5
-                                           null_context, &pos,
Jens Petersen 3b29a5
-                                           savable_comment);
Jens Petersen 3b29a5
+                if (plural_mp != NULL)
Jens Petersen 3b29a5
+                  remember_a_message_plural (plural_mp, token.string,
Jens Petersen 3b29a5
+                                             null_context, &pos,
Jens Petersen 3b29a5
+                                             savable_comment);
Jens Petersen 3b29a5
                 state = 0;
Jens Petersen 3b29a5
                 break;
Jens Petersen 3b29a5
               }
Jens Petersen 3b29a5
--- a/gettext-tools/src/x-ycp.c
Jens Petersen 3b29a5
+++ b/gettext-tools/src/x-ycp.c
Jens Petersen 3b29a5
@@ -1,5 +1,5 @@
Jens Petersen 3b29a5
 /* xgettext YCP backend.
Jens Petersen 3b29a5
-   Copyright (C) 2001-2003, 2005-2009 Free Software Foundation, Inc.
Jens Petersen 3b29a5
+   Copyright (C) 2001-2003, 2005-2009, 2011 Free Software Foundation, Inc.
Jens Petersen 3b29a5
 
Jens Petersen 3b29a5
    This file was written by Bruno Haible <haible@clisp.cons.org>, 2001.
Jens Petersen 3b29a5
 
Jens Petersen 3b29a5
@@ -640,6 +640,7 @@
Jens Petersen 3b29a5
                        bool in_i18n)
Jens Petersen 3b29a5
 {
Jens Petersen 3b29a5
   int state; /* 1 or 2 inside _( ... ), otherwise 0 */
Jens Petersen 3b29a5
+  int plural_state = 0; /* defined only when in states 1 and 2 */
Jens Petersen 3b29a5
   message_ty *plural_mp = NULL; /* defined only when in states 1 and 2 */
Jens Petersen 3b29a5
   /* Context iterator that will be used if the next token is a '('.  */
Jens Petersen 3b29a5
   flag_context_list_iterator_ty next_context_iter =
Jens Petersen 3b29a5
@@ -678,20 +679,22 @@
Jens Petersen 3b29a5
               pos.file_name = logical_file_name;
Jens Petersen 3b29a5
               pos.line_number = token.line_number;
Jens Petersen 3b29a5
 
Jens Petersen 3b29a5
-              if (plural_mp == NULL)
Jens Petersen 3b29a5
+              if (plural_state == 0)
Jens Petersen 3b29a5
                 {
Jens Petersen 3b29a5
                   /* Seen an msgid.  */
Jens Petersen 3b29a5
                   plural_mp = remember_a_message (mlp, NULL, token.string,
Jens Petersen 3b29a5
                                                   inner_context, &pos,
Jens Petersen 3b29a5
                                                   NULL, token.comment);
Jens Petersen 3b29a5
+                  plural_state = 1;
Jens Petersen 3b29a5
                   state = 2;
Jens Petersen 3b29a5
                 }
Jens Petersen 3b29a5
               else
Jens Petersen 3b29a5
                 {
Jens Petersen 3b29a5
                   /* Seen an msgid_plural.  */
Jens Petersen 3b29a5
-                  remember_a_message_plural (plural_mp, token.string,
Jens Petersen 3b29a5
-                                             inner_context, &pos,
Jens Petersen 3b29a5
-                                             token.comment);
Jens Petersen 3b29a5
+                  if (plural_mp != NULL)
Jens Petersen 3b29a5
+                    remember_a_message_plural (plural_mp, token.string,
Jens Petersen 3b29a5
+                                               inner_context, &pos,
Jens Petersen 3b29a5
+                                               token.comment);
Jens Petersen 3b29a5
                   state = 0;
Jens Petersen 3b29a5
                 }
Jens Petersen 3b29a5
               drop_reference (token.comment);