From: Paul Eggert Date: Sat, 6 Feb 2021 00:35:46 +0000 (-0800) Subject: regex: avoid duplicate in espilon closure X-Git-Tag: v1.0~3093 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=f5596242f91109b393919653d091bbeecc4b0a55;p=gnulib.git regex: avoid duplicate in espilon closure * lib/regcomp.c (calc_eclosure_iter): Insert NODE into epsilon closure first rather than last. Otherwise, the epsilon closure might contain a duplicate of NODE. --- diff --git a/ChangeLog b/ChangeLog index f4583e0afe..74304474bd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2021-02-05 Paul Eggert + regex: avoid duplicate in espilon closure + * lib/regcomp.c (calc_eclosure_iter): Insert NODE into epsilon + closure first rather than last. Otherwise, the epsilon closure + might contain a duplicate of NODE. + regex-tests: fix typo * tests/test-regex.c (main): Fix typo that would have caused an old test case to report incorrect values on failure. diff --git a/lib/regcomp.c b/lib/regcomp.c index d93698ae78..887e5b5068 100644 --- a/lib/regcomp.c +++ b/lib/regcomp.c @@ -1695,12 +1695,14 @@ calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, Idx node, bool root) reg_errcode_t err; Idx i; re_node_set eclosure; - bool ok; bool incomplete = false; err = re_node_set_alloc (&eclosure, dfa->edests[node].nelem + 1); if (__glibc_unlikely (err != REG_NOERROR)) return err; + /* An epsilon closure includes itself. */ + eclosure.elems[eclosure.nelem++] = node; + /* This indicates that we are calculating this node now. We reference this value to avoid infinite loop. */ dfa->eclosures[node].nelem = -1; @@ -1753,10 +1755,6 @@ calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, Idx node, bool root) } } - /* An epsilon closure includes itself. */ - ok = re_node_set_insert (&eclosure, node); - if (__glibc_unlikely (! ok)) - return REG_ESPACE; if (incomplete && !root) dfa->eclosures[node].nelem = 0; else