From 2c3a4ff60e91bf71911dd8c68f22871a7e11da55 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sat, 17 Mar 2018 10:30:50 -0700 Subject: listener: fix poor regex handling in balance check. * parser.c (is_balanced_line): Introduce the ST_RGXC state to which we switch when we encounter a regex character class. Also introduce ST_RGXE for regex subexpressions. In these states, do not recognize / as the regex terminator. --- parser.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/parser.c b/parser.c index 849de26d..cbd2f4fe 100644 --- a/parser.c +++ b/parser.c @@ -948,7 +948,7 @@ static int is_balanced_line(const char *line, void *ctx) { enum state { ST_START, ST_CMNT, ST_PAR, ST_BKT, ST_BRC, ST_HASH, - ST_LIT, ST_QLIT, ST_RGX, ST_CHR, ST_ESC, ST_AT, + ST_LIT, ST_QLIT, ST_RGX, ST_RGXC, ST_RGXE, ST_CHR, ST_ESC, ST_AT, ST_HASH_B, ST_BUF }; int count[32], sp = 0; @@ -1062,6 +1062,38 @@ static int is_balanced_line(const char *line, void *ctx) case '/': sp--; break; + case '[': + state[++sp] = ST_RGXC; + break; + case '(': + state[++sp] = ST_RGXE; + break; + case '\\': + state[++sp] = ST_ESC; + break; + } + break; + case ST_RGXC: + switch (ch) { + case ']': + sp--; + break; + case '\\': + state[++sp] = ST_ESC; + break; + } + break; + case ST_RGXE: + switch (ch) { + case ')': + sp--; + break; + case '[': + state[++sp] = ST_RGXC; + break; + case '(': + state[++sp] = ST_RGXE; + break; case '\\': state[++sp] = ST_ESC; break; -- cgit v1.2.3