diff --git a/src/backend/regex/rege_dfa.c b/src/backend/regex/rege_dfa.c index 5695e158a5..f62770ba37 100644 --- a/src/backend/regex/rege_dfa.c +++ b/src/backend/regex/rege_dfa.c @@ -530,6 +530,8 @@ freedfa(struct dfa *d) if (d->mallocarea != NULL) FREE(d->mallocarea); + + FREE(d); } /* diff --git a/src/backend/regex/regexec.c b/src/backend/regex/regexec.c index f7eaa76b02..cba5ecafe7 100644 --- a/src/backend/regex/regexec.c +++ b/src/backend/regex/regexec.c @@ -389,7 +389,11 @@ find(struct vars *v, /* first, a shot with the search RE */ s = newdfa(v, &v->g->search, cm, &v->dfa1); assert(!(ISERR() && s != NULL)); - NOERR(); + if (ISERR()) + { + freedfa(s); + return v->err; + } MDEBUG(("\nsearch at %ld\n", LOFF(v->start))); cold = NULL; close = shortest(v, s, v->search_start, v->search_start, v->stop, @@ -473,7 +477,11 @@ cfind(struct vars *v, int ret; s = newdfa(v, &v->g->search, cm, &v->dfa1); - NOERR(); + if (ISERR()) + { + freedfa(s); + return v->err; + } d = newdfa(v, cnfa, cm, &v->dfa2); if (ISERR()) {