diff --git a/src/backend/regex/regprefix.c b/src/backend/regex/regprefix.c index dc96f9ff0a8..a9eb31419dc 100644 --- a/src/backend/regex/regprefix.c +++ b/src/backend/regex/regprefix.c @@ -162,14 +162,12 @@ findprefix(struct cnfa * cnfa, thiscolor = COLORLESS; for (ca = cnfa->states[st]; ca->co != COLORLESS; ca++) { - /* We ignore lookahead constraints */ - if (ca->co >= cnfa->ncolors) - continue; - /* We can also ignore BOS/BOL arcs */ + /* We can ignore BOS/BOL arcs */ if (ca->co == cnfa->bos[0] || ca->co == cnfa->bos[1]) continue; - /* ... but EOS/EOL arcs terminate the search */ - if (ca->co == cnfa->eos[0] || ca->co == cnfa->eos[1]) + /* ... but EOS/EOL arcs terminate the search, as do LACONs */ + if (ca->co == cnfa->eos[0] || ca->co == cnfa->eos[1] || + ca->co >= cnfa->ncolors) { thiscolor = COLORLESS; break; diff --git a/src/test/regress/expected/regex.out b/src/test/regress/expected/regex.out index 320f5e88c37..be151858a38 100644 --- a/src/test/regress/expected/regex.out +++ b/src/test/regress/expected/regex.out @@ -153,6 +153,14 @@ explain (costs off) select * from pg_proc where proname ~ '^(abc)?d'; Filter: (proname ~ '^(abc)?d'::text) (2 rows) +explain (costs off) select * from pg_proc where proname ~ '^abcd(x|(?=\w\w)q)'; + QUERY PLAN +------------------------------------------------------------------------ + Index Scan using pg_proc_proname_args_nsp_index on pg_proc + Index Cond: ((proname >= 'abcd'::name) AND (proname < 'abce'::name)) + Filter: (proname ~ '^abcd(x|(?=\w\w)q)'::text) +(3 rows) + -- Test for infinite loop in pullback() (CVE-2007-4772) select 'a' ~ '($|^)*'; ?column? diff --git a/src/test/regress/sql/regex.sql b/src/test/regress/sql/regex.sql index 5412f6e1c58..c59fa35f24d 100644 --- a/src/test/regress/sql/regex.sql +++ b/src/test/regress/sql/regex.sql @@ -34,6 +34,7 @@ explain (costs off) select * from pg_proc where proname ~ '^abc+d'; explain (costs off) select * from pg_proc where proname ~ '^(abc)(def)'; explain (costs off) select * from pg_proc where proname ~ '^(abc)$'; explain (costs off) select * from pg_proc where proname ~ '^(abc)?d'; +explain (costs off) select * from pg_proc where proname ~ '^abcd(x|(?=\w\w)q)'; -- Test for infinite loop in pullback() (CVE-2007-4772) select 'a' ~ '($|^)*';