summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2011-07-30 04:14:27 +0200
committerBruno Haible <bruno@clisp.org>2011-07-30 04:15:11 +0200
commit0126b03f01a65ce543989a1d1f1d73b7d2c65a09 (patch)
tree91e4ed4910b9925e30da496a7ebd9677c6c11a37
parentcdf2e8d214e5895bc35be57264f26c582f523eb0 (diff)
downloadgettext-0126b03f01a65ce543989a1d1f1d73b7d2c65a09.tar.gz
Fix xgettext crash when extracting a message with plural that is excluded.
-rw-r--r--gettext-tools/src/ChangeLog12
-rw-r--r--gettext-tools/src/x-smalltalk.c9
-rw-r--r--gettext-tools/src/x-ycp.c13
-rw-r--r--gettext-tools/src/xgettext.c4
-rw-r--r--gettext-tools/src/xgettext.h5
5 files changed, 30 insertions, 13 deletions
diff --git a/gettext-tools/src/ChangeLog b/gettext-tools/src/ChangeLog
index 7ede00670..842dada43 100644
--- a/gettext-tools/src/ChangeLog
+++ b/gettext-tools/src/ChangeLog
@@ -1,3 +1,15 @@
+2011-07-29 Bruno Haible <bruno@clisp.org>
+
+ Fix xgettext crash when extracting a message with plural that is
+ excluded.
+ * xgettext.h (remember_a_message): Document the return value.
+ * xgettext.c (arglist_parser_done): Handle the case where
+ remember_a_message returned NULL.
+ * x-smalltalk.c (extract_smalltalk): Likewise.
+ * x-ycp.c (extract_parenthesized): Likewise.
+ Reported by Jean-Luc Coulon <jean-luc.coulon@wanadoo.fr> via
+ Santiago Vila <sanvila@unex.es>.
+
2011-06-13 Bruno Haible <bruno@clisp.org>
Avoid compilation error on Solaris 7 with cc.
diff --git a/gettext-tools/src/x-smalltalk.c b/gettext-tools/src/x-smalltalk.c
index dbd0aa57e..c3f9699d8 100644
--- a/gettext-tools/src/x-smalltalk.c
+++ b/gettext-tools/src/x-smalltalk.c
@@ -1,5 +1,5 @@
/* xgettext Smalltalk backend.
- Copyright (C) 2002-2003, 2005-2009 Free Software Foundation, Inc.
+ Copyright (C) 2002-2003, 2005-2009, 2011 Free Software Foundation, Inc.
This file was written by Bruno Haible <haible@clisp.cons.org>, 2002.
@@ -562,9 +562,10 @@ extract_smalltalk (FILE *f,
lex_pos_ty pos;
pos.file_name = logical_file_name;
pos.line_number = token.line_number;
- remember_a_message_plural (plural_mp, token.string,
- null_context, &pos,
- savable_comment);
+ if (plural_mp != NULL)
+ remember_a_message_plural (plural_mp, token.string,
+ null_context, &pos,
+ savable_comment);
state = 0;
break;
}
diff --git a/gettext-tools/src/x-ycp.c b/gettext-tools/src/x-ycp.c
index 4e3b590dd..ff8642bdb 100644
--- a/gettext-tools/src/x-ycp.c
+++ b/gettext-tools/src/x-ycp.c
@@ -1,5 +1,5 @@
/* xgettext YCP backend.
- Copyright (C) 2001-2003, 2005-2009 Free Software Foundation, Inc.
+ Copyright (C) 2001-2003, 2005-2009, 2011 Free Software Foundation, Inc.
This file was written by Bruno Haible <haible@clisp.cons.org>, 2001.
@@ -640,6 +640,7 @@ extract_parenthesized (message_list_ty *mlp,
bool in_i18n)
{
int state; /* 1 or 2 inside _( ... ), otherwise 0 */
+ int plural_state = 0; /* defined only when in states 1 and 2 */
message_ty *plural_mp = NULL; /* defined only when in states 1 and 2 */
/* Context iterator that will be used if the next token is a '('. */
flag_context_list_iterator_ty next_context_iter =
@@ -678,20 +679,22 @@ extract_parenthesized (message_list_ty *mlp,
pos.file_name = logical_file_name;
pos.line_number = token.line_number;
- if (plural_mp == NULL)
+ if (plural_state == 0)
{
/* Seen an msgid. */
plural_mp = remember_a_message (mlp, NULL, token.string,
inner_context, &pos,
NULL, token.comment);
+ plural_state = 1;
state = 2;
}
else
{
/* Seen an msgid_plural. */
- remember_a_message_plural (plural_mp, token.string,
- inner_context, &pos,
- token.comment);
+ if (plural_mp != NULL)
+ remember_a_message_plural (plural_mp, token.string,
+ inner_context, &pos,
+ token.comment);
state = 0;
}
drop_reference (token.comment);
diff --git a/gettext-tools/src/xgettext.c b/gettext-tools/src/xgettext.c
index faf816118..3388820a0 100644
--- a/gettext-tools/src/xgettext.c
+++ b/gettext-tools/src/xgettext.c
@@ -1,5 +1,5 @@
/* Extracts strings from C source file to Uniforum style .po file.
- Copyright (C) 1995-1998, 2000-2010 Free Software Foundation, Inc.
+ Copyright (C) 1995-1998, 2000-2011 Free Software Foundation, Inc.
Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, April 1995.
This program is free software: you can redistribute it and/or modify
@@ -2934,7 +2934,7 @@ arglist_parser_done (struct arglist_parser *ap, int argnum)
msgid_context,
&best_cp->msgid_pos,
NULL, best_cp->msgid_comment);
- if (best_cp->msgid_plural != NULL)
+ if (mp != NULL && best_cp->msgid_plural != NULL)
remember_a_message_plural (mp, best_cp->msgid_plural,
msgid_plural_context,
&best_cp->msgid_plural_pos,
diff --git a/gettext-tools/src/xgettext.h b/gettext-tools/src/xgettext.h
index 6b2c53577..16540fe9c 100644
--- a/gettext-tools/src/xgettext.h
+++ b/gettext-tools/src/xgettext.h
@@ -1,5 +1,5 @@
/* xgettext common functions.
- Copyright (C) 2001-2003, 2005-2006, 2008-2009 Free Software Foundation, Inc.
+ Copyright (C) 2001-2003, 2005-2006, 2008-2009, 2011 Free Software Foundation, Inc.
Written by Peter Miller <millerp@canb.auug.org.au>
and Bruno Haible <haible@clisp.cons.org>, 2001.
@@ -247,7 +247,8 @@ extern void savable_comment_reset (void);
or NULL.
COMMENT may be savable_comment, or it may be a saved copy of savable_comment
(then add_reference must be used when saving it, and drop_reference while
- dropping it). Clear savable_comment. */
+ dropping it). Clear savable_comment.
+ Return the new or found message, or NULL if the message is excluded. */
extern message_ty *remember_a_message (message_list_ty *mlp,
char *msgctxt,
char *msgid,