summaryrefslogtreecommitdiff
path: root/src/backend/regex/rege_dfa.c
diff options
context:
space:
mode:
authorTom Lane2021-02-22 01:29:11 +0000
committerTom Lane2021-02-22 01:29:11 +0000
commit190c79884aae540c92f017701726ed69265e2dab (patch)
tree668bca5d783745382052ecba7efd0003731e9025 /src/backend/regex/rege_dfa.c
parent6ee479abfc27a18c37fe77140d16d3ac31f4ac31 (diff)
Simplify memory management for regex DFAs a little.
Coverity complained that functions in regexec.c might leak DFA storage. It's wrong, but this logic is confusing enough that it's not so surprising Coverity couldn't make sense of it. Rewrite in hopes of making it more legible to humans as well as machines.
Diffstat (limited to 'src/backend/regex/rege_dfa.c')
-rw-r--r--src/backend/regex/rege_dfa.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/src/backend/regex/rege_dfa.c b/src/backend/regex/rege_dfa.c
index 957ceb8137d..1db52d1005c 100644
--- a/src/backend/regex/rege_dfa.c
+++ b/src/backend/regex/rege_dfa.c
@@ -499,7 +499,7 @@ newdfa(struct vars *v,
struct dfa *d;
size_t nss = cnfa->nstates * 2;
int wordsper = (cnfa->nstates + UBITS - 1) / UBITS;
- struct smalldfa *smallwas = sml;
+ bool ismalloced = false;
assert(cnfa != NULL && cnfa->nstates != 0);
@@ -514,6 +514,7 @@ newdfa(struct vars *v,
ERR(REG_ESPACE);
return NULL;
}
+ ismalloced = true;
}
d = &sml->dfa;
d->ssets = sml->ssets;
@@ -521,8 +522,8 @@ newdfa(struct vars *v,
d->work = &d->statesarea[nss];
d->outsarea = sml->outsarea;
d->incarea = sml->incarea;
- d->cptsmalloced = 0;
- d->mallocarea = (smallwas == NULL) ? (char *) sml : NULL;
+ d->ismalloced = ismalloced;
+ d->arraysmalloced = false; /* not separately allocated, anyway */
}
else
{
@@ -540,8 +541,9 @@ newdfa(struct vars *v,
sizeof(struct sset *));
d->incarea = (struct arcp *) MALLOC(nss * cnfa->ncolors *
sizeof(struct arcp));
- d->cptsmalloced = 1;
- d->mallocarea = (char *) d;
+ d->ismalloced = true;
+ d->arraysmalloced = true;
+ /* now freedfa() will behave sanely */
if (d->ssets == NULL || d->statesarea == NULL ||
d->outsarea == NULL || d->incarea == NULL)
{
@@ -573,7 +575,7 @@ newdfa(struct vars *v,
static void
freedfa(struct dfa *d)
{
- if (d->cptsmalloced)
+ if (d->arraysmalloced)
{
if (d->ssets != NULL)
FREE(d->ssets);
@@ -585,8 +587,8 @@ freedfa(struct dfa *d)
FREE(d->incarea);
}
- if (d->mallocarea != NULL)
- FREE(d->mallocarea);
+ if (d->ismalloced)
+ FREE(d);
}
/*