about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--posix/regexec.c16
2 files changed, 17 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index ca7aa84934..f852b850a2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2002-12-16  Jakub Jelinek  <jakub@redhat.com>
+            Paolo Bonzini  <bonzini@gnu.org>
+
+	* posix/regexec.c (group_nodes_into_DFAstates): Never produce
+	dests_ch items that are empty.
+
 2003-12-14  Paolo Bonzini  <bonzini@gnu.org>
 
 	* posix/regexec.c (check_arrival): Remove duplicate test.
diff --git a/posix/regexec.c b/posix/regexec.c
index 731b49dd57..0c2f7bf3ff 100644
--- a/posix/regexec.c
+++ b/posix/regexec.c
@@ -3402,30 +3402,36 @@ group_nodes_into_DFAstates (preg, state, dests_node, dests_ch)
 
 	  if (constraint & NEXT_WORD_CONSTRAINT)
 	    {
+	      unsigned int any_set = 0;
 #ifdef RE_ENABLE_I18N
 	      if (dfa->mb_cur_max > 1)
 		for (j = 0; j < BITSET_UINTS; ++j)
-		  accepts[j] &= (dfa->word_char[j] | ~dfa->sb_char[j]);
+		  any_set |= (accepts[j] &= (dfa->word_char[j] | ~dfa->sb_char[j]));
 	      else
 #endif
 		for (j = 0; j < BITSET_UINTS; ++j)
-		  accepts[j] &= dfa->word_char[j];
+		  any_set |= (accepts[j] &= dfa->word_char[j]);
+	      if (!any_set)
+		continue;
 	    }
 	  if (constraint & NEXT_NOTWORD_CONSTRAINT)
 	    {
+	      unsigned int any_set = 0;
 #ifdef RE_ENABLE_I18N
 	      if (dfa->mb_cur_max > 1)
 		for (j = 0; j < BITSET_UINTS; ++j)
-		  accepts[j] &= ~(dfa->word_char[j] & dfa->sb_char[j]);
+		  any_set |= (accepts[j] &= ~(dfa->word_char[j] & dfa->sb_char[j]));
 	      else
 #endif
 		for (j = 0; j < BITSET_UINTS; ++j)
-		  accepts[j] &= ~dfa->word_char[j];
+		  any_set |= (accepts[j] &= ~dfa->word_char[j]);
+	      if (!any_set)
+		continue;
 	    }
 	}
 
       /* Then divide `accepts' into DFA states, or create a new
-	 state.  */
+	 state.  Above, we make sure that accepts is not empty.  */
       for (j = 0; j < ndests; ++j)
 	{
 	  bitset intersec; /* Intersection sets, see below.  */