diff --git a/xmlregexp.c b/xmlregexp.c index 092d544c..f434a0cf 100644 --- a/xmlregexp.c +++ b/xmlregexp.c @@ -3062,6 +3062,7 @@ xmlFARegExecSave(xmlRegExecCtxtPtr exec) { if (exec->rollbacks == NULL) { xmlRegexpErrMemory(NULL, "saving regexp"); exec->maxRollbacks = 0; + exec->status = XML_REGEXP_OUT_OF_MEMORY; return; } memset(exec->rollbacks, 0, @@ -3076,6 +3077,7 @@ xmlFARegExecSave(xmlRegExecCtxtPtr exec) { if (tmp == NULL) { xmlRegexpErrMemory(NULL, "saving regexp"); exec->maxRollbacks /= 2; + exec->status = XML_REGEXP_OUT_OF_MEMORY; return; } exec->rollbacks = tmp; @@ -3103,6 +3105,8 @@ xmlFARegExecSave(xmlRegExecCtxtPtr exec) { static void xmlFARegExecRollBack(xmlRegExecCtxtPtr exec) { + if (exec->status != XML_REGEXP_OK) + return; if (exec->nbRollbacks <= 0) { exec->status = XML_REGEXP_NOT_FOUND; return; @@ -3154,7 +3158,7 @@ xmlFARegExec(xmlRegexpPtr comp, const xmlChar *content) { exec->counts = (int *) xmlMalloc(comp->nbCounters * sizeof(int)); if (exec->counts == NULL) { xmlRegexpErrMemory(NULL, "running regexp"); - return(-1); + return(XML_REGEXP_OUT_OF_MEMORY); } memset(exec->counts, 0, comp->nbCounters * sizeof(int)); } else @@ -3253,6 +3257,8 @@ xmlFARegExec(xmlRegexpPtr comp, const xmlChar *content) { /* Save before incrementing */ if (exec->state->nbTrans > exec->transno + 1) { xmlFARegExecSave(exec); + if (exec->status != XML_REGEXP_OK) + goto error; } if (trans->counter >= 0) { exec->counts[trans->counter]++; @@ -3283,6 +3289,8 @@ xmlFARegExec(xmlRegexpPtr comp, const xmlChar *content) { exec->transno = -1; /* trick */ exec->state = to; xmlFARegExecSave(exec); + if (exec->status != XML_REGEXP_OK) + goto error; exec->transno = transno; exec->state = state; } @@ -3336,6 +3344,8 @@ xmlFARegExec(xmlRegexpPtr comp, const xmlChar *content) { ((trans->count >= 0) && (deter == 0) && (exec->state->nbTrans > exec->transno + 1))) { xmlFARegExecSave(exec); + if (exec->status != XML_REGEXP_OK) + goto error; } if (trans->counter >= 0) { xmlRegCounterPtr counter;