summaryrefslogtreecommitdiff
path: root/src/backend/regex
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2015-08-12 00:48:11 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2015-08-12 00:48:39 -0400
commita54875602a057f8ee0cf5e880bfe2056b5dd11f0 (patch)
treec5c1c51babe3f89a911f03fdd5fd62a7ef98f671 /src/backend/regex
parent75d02d787804f643af09abcc87ade5c0b990b2b6 (diff)
Fix some possible low-memory failures in regexp compilation.
newnfa() failed to set the regex error state when malloc() fails. Several places in regcomp.c failed to check for an error after calling subre(). Each of these mistakes could lead to null-pointer-dereference crashes in memory-starved backends. Report and patch by Andreas Seltenreich. Back-patch to all branches.
Diffstat (limited to 'src/backend/regex')
-rw-r--r--src/backend/regex/regc_nfa.c3
-rw-r--r--src/backend/regex/regcomp.c3
2 files changed, 6 insertions, 0 deletions
diff --git a/src/backend/regex/regc_nfa.c b/src/backend/regex/regc_nfa.c
index 3487734a64e..27998d688a8 100644
--- a/src/backend/regex/regc_nfa.c
+++ b/src/backend/regex/regc_nfa.c
@@ -52,7 +52,10 @@ newnfa(struct vars * v,
nfa = (struct nfa *) MALLOC(sizeof(struct nfa));
if (nfa == NULL)
+ {
+ ERR(REG_ESPACE);
return NULL;
+ }
nfa->states = NULL;
nfa->slast = NULL;
diff --git a/src/backend/regex/regcomp.c b/src/backend/regex/regcomp.c
index 742539a90b9..38f48d5ddb8 100644
--- a/src/backend/regex/regcomp.c
+++ b/src/backend/regex/regcomp.c
@@ -942,6 +942,7 @@ parseqatom(struct vars * v,
NOERR();
assert(v->nextvalue > 0);
atom = subre(v, 'b', BACKR, lp, rp);
+ NOERR();
subno = v->nextvalue;
atom->subno = subno;
EMPTYARC(lp, rp); /* temporarily, so there's something */
@@ -1076,6 +1077,7 @@ parseqatom(struct vars * v,
/* break remaining subRE into x{...} and what follows */
t = subre(v, '.', COMBINE(qprefer, atom->flags), lp, rp);
+ NOERR();
t->left = atom;
atomp = &t->left;
@@ -1084,6 +1086,7 @@ parseqatom(struct vars * v,
/* split top into prefix and remaining */
assert(top->op == '=' && top->left == NULL && top->right == NULL);
top->left = subre(v, '=', top->flags, top->begin, lp);
+ NOERR();
top->op = '.';
top->right = t;