diff options
author | Daniel Veillard <veillard@redhat.com> | 2016-05-09 09:28:38 +0800 |
---|---|---|
committer | Daniel Veillard <veillard@redhat.com> | 2016-05-09 09:28:38 +0800 |
commit | 34b350048d1ee97c4f42dd6729a77b3f36753b3a (patch) | |
tree | 48b1bbcce394584899c7196615519a28e458ae3f | |
parent | 6eb0894a96d4d8122e5129e02f78a2b449cc2580 (diff) | |
download | libxml2-34b350048d1ee97c4f42dd6729a77b3f36753b3a.tar.gz |
Fix an error with regexp on nullable counted char transition
This is the first of the two issues raised by Pete Cordell
in https://mail.gnome.org/archives/xml/2016-April/msg00030.html
-rw-r--r-- | xmlregexp.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/xmlregexp.c b/xmlregexp.c index 4e65f6b9..727fef4d 100644 --- a/xmlregexp.c +++ b/xmlregexp.c @@ -1544,6 +1544,7 @@ static int xmlFAGenerateTransitions(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, xmlRegStatePtr to, xmlRegAtomPtr atom) { xmlRegStatePtr end; + int nullable = 0; if (atom == NULL) { ERROR("genrate transition: atom == NULL"); @@ -1730,6 +1731,13 @@ xmlFAGenerateTransitions(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, if (xmlRegAtomPush(ctxt, atom) < 0) { return(-1); } + if ((atom->quant == XML_REGEXP_QUANT_RANGE) && + (atom->min == 0) && (atom->max > 0)) { + nullable = 1; + atom->min = 1; + if (atom->max == 1) + atom->quant = XML_REGEXP_QUANT_OPT; + } xmlRegStateAddTrans(ctxt, from, atom, to, -1, -1); ctxt->state = end; switch (atom->quant) { @@ -1747,11 +1755,8 @@ xmlFAGenerateTransitions(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, xmlRegStateAddTrans(ctxt, to, atom, to, -1, -1); break; case XML_REGEXP_QUANT_RANGE: -#if DV_test - if (atom->min == 0) { + if (nullable) xmlFAGenerateEpsilonTransition(ctxt, from, to); - } -#endif break; default: break; |