]> granicus.if.org Git - postgresql/commitdiff
Add missing error check in regexp parser.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 27 Feb 2013 15:40:26 +0000 (10:40 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 27 Feb 2013 15:40:26 +0000 (10:40 -0500)
parseqatom() failed to check for an error return (NULL result) from its
recursive call to parsebranch(), and in consequence could crash with a
null-pointer dereference after an error return.  This bug has been there
since day one, but wasn't noticed before, probably because most error cases
in parsebranch() didn't actually lead to returning NULL.  Add the missing
error check, and also tweak parsebranch() to exit in a less indirect
fashion after a call to parseqatom() fails.

Report by Tomasz Karlik, fix by me.

src/backend/regex/regcomp.c

index c3e7588c053555b7cb8601b7bd637bc428b12f10..1c4ac7c4000f96d97dd00812461401b35a05364e 100644 (file)
@@ -704,6 +704,7 @@ parsebranch(struct vars * v,
 
                /* NB, recursion in parseqatom() may swallow rest of branch */
                parseqatom(v, stopper, type, lp, right, t);
+               NOERRN();
        }
 
        if (!seencontent)
@@ -1138,6 +1139,7 @@ parseqatom(struct vars * v,
                EMPTYARC(atom->end, rp);
                t->right = subre(v, '=', 0, atom->end, rp);
        }
+       NOERR();
        assert(SEE('|') || SEE(stopper) || SEE(EOS));
        t->flags |= COMBINE(t->flags, t->right->flags);
        top->flags |= COMBINE(top->flags, t->flags);