diff options
Diffstat (limited to 'src/backend/regex')
-rw-r--r-- | src/backend/regex/regc_lex.c | 6 | ||||
-rw-r--r-- | src/backend/regex/regcomp.c | 14 | ||||
-rw-r--r-- | src/backend/regex/regexec.c | 6 |
3 files changed, 16 insertions, 10 deletions
diff --git a/src/backend/regex/regc_lex.c b/src/backend/regex/regc_lex.c index 6f2c0cb3eb4..f6ed9f09ea4 100644 --- a/src/backend/regex/regc_lex.c +++ b/src/backend/regex/regc_lex.c @@ -860,6 +860,12 @@ lexescape(struct vars * v) c = lexdigits(v, 8, 1, 3); if (ISERR()) FAILW(REG_EESCAPE); + if (c > 0xff) + { + /* out of range, so we handled one digit too much */ + v->now--; + c >>= 3; + } RETV(PLAIN, c); break; default: diff --git a/src/backend/regex/regcomp.c b/src/backend/regex/regcomp.c index 44a472fa69e..6b95975f2be 100644 --- a/src/backend/regex/regcomp.c +++ b/src/backend/regex/regcomp.c @@ -960,13 +960,13 @@ parseqatom(struct vars * v, { case '*': m = 0; - n = INFINITY; + n = DUPINF; qprefer = (v->nextvalue) ? LONGER : SHORTER; NEXT(); break; case '+': m = 1; - n = INFINITY; + n = DUPINF; qprefer = (v->nextvalue) ? LONGER : SHORTER; NEXT(); break; @@ -984,7 +984,7 @@ parseqatom(struct vars * v, if (SEE(DIGIT)) n = scannum(v); else - n = INFINITY; + n = DUPINF; if (m > n) { ERR(REG_BADBR); @@ -1146,8 +1146,8 @@ parseqatom(struct vars * v, * really care where its submatches are. */ dupnfa(v->nfa, atom->begin, atom->end, s, atom->begin); - assert(m >= 1 && m != INFINITY && n >= 1); - repeat(v, s, atom->begin, m - 1, (n == INFINITY) ? n : n - 1); + assert(m >= 1 && m != DUPINF && n >= 1); + repeat(v, s, atom->begin, m - 1, (n == DUPINF) ? n : n - 1); f = COMBINE(qprefer, atom->flags); t = subre(v, '.', f, s, atom->end); /* prefix and atom */ NOERR(); @@ -1268,7 +1268,7 @@ repeat(struct vars * v, #define SOME 2 #define INF 3 #define PAIR(x, y) ((x)*4 + (y)) -#define REDUCE(x) ( ((x) == INFINITY) ? INF : (((x) > 1) ? SOME : (x)) ) +#define REDUCE(x) ( ((x) == DUPINF) ? INF : (((x) > 1) ? SOME : (x)) ) const int rm = REDUCE(m); const int rn = REDUCE(n); struct state *s; @@ -2026,7 +2026,7 @@ stdump(struct subre * t, if (t->min != 1 || t->max != 1) { fprintf(f, " {%d,", t->min); - if (t->max != INFINITY) + if (t->max != DUPINF) fprintf(f, "%d", t->max); fprintf(f, "}"); } diff --git a/src/backend/regex/regexec.c b/src/backend/regex/regexec.c index 5e78f8149c8..efd1e9ba022 100644 --- a/src/backend/regex/regexec.c +++ b/src/backend/regex/regexec.c @@ -865,7 +865,7 @@ cbrdissect(struct vars * v, if (tlen % brlen != 0) return REG_NOMATCH; numreps = tlen / brlen; - if (numreps < min || (numreps > max && max != INFINITY)) + if (numreps < min || (numreps > max && max != DUPINF)) return REG_NOMATCH; /* okay, compare the actual string contents */ @@ -964,7 +964,7 @@ citerdissect(struct vars * v, * sub-match endpoints in endpts[1..max_matches]. */ max_matches = end - begin; - if (max_matches > t->max && t->max != INFINITY) + if (max_matches > t->max && t->max != DUPINF) max_matches = t->max; if (max_matches < min_matches) max_matches = min_matches; @@ -1149,7 +1149,7 @@ creviterdissect(struct vars * v, * sub-match endpoints in endpts[1..max_matches]. */ max_matches = end - begin; - if (max_matches > t->max && t->max != INFINITY) + if (max_matches > t->max && t->max != DUPINF) max_matches = t->max; if (max_matches < min_matches) max_matches = min_matches; |