Mercurial > gnulib
diff lib/regcomp.c @ 18096:bc194644f292
Diagnose ERE '()|\1'
Problem reported by Hanno Böck in: http://bugs.gnu.org/21513
* lib/regcomp.c (parse_reg_exp): While parsing alternatives, keep
track of the set of previously-completed subexpressions available
before the first alternative, and restore this set just before
parsing each subsequent alternative. This lets us diagnose the
invalid back-reference in the ERE '()|\1'.
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Sat, 19 Sep 2015 13:53:34 -0700 |
parents | 00853c226336 |
children | 31b2239ca59c |
line wrap: on
line diff
--- a/lib/regcomp.c Sat Sep 19 13:44:49 2015 -0700 +++ b/lib/regcomp.c Sat Sep 19 13:53:34 2015 -0700 @@ -2191,6 +2191,7 @@ { re_dfa_t *dfa = preg->buffer; bin_tree_t *tree, *branch = NULL; + bitset_word_t initial_bkref_map = dfa->completed_bkref_map; tree = parse_branch (regexp, preg, token, syntax, nest, err); if (BE (*err != REG_NOERROR && tree == NULL, 0)) return NULL; @@ -2201,6 +2202,8 @@ if (token->type != OP_ALT && token->type != END_OF_RE && (nest == 0 || token->type != OP_CLOSE_SUBEXP)) { + bitset_word_t accumulated_bkref_map = dfa->completed_bkref_map; + dfa->completed_bkref_map = initial_bkref_map; branch = parse_branch (regexp, preg, token, syntax, nest, err); if (BE (*err != REG_NOERROR && branch == NULL, 0)) { @@ -2208,6 +2211,7 @@ postorder (tree, free_tree, NULL); return NULL; } + dfa->completed_bkref_map |= accumulated_bkref_map; } else branch = NULL;