aboutsummaryrefslogtreecommitdiff
path: root/jimregexp.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2020-05-04 20:43:46 +1000
committerSteve Bennett <steveb@workware.net.au>2020-05-04 21:57:37 +1000
commitac35b8a6ec417f75b5ec86ca64ea1614a8170a38 (patch)
tree2f5b8ff0a91946a84b1b8f6ec8da82f539d5cf31 /jimregexp.c
parentae1a518e6edc96cb54f6d6401fd6a59656abe8a9 (diff)
downloadjimtcl-ac35b8a6ec417f75b5ec86ca64ea1614a8170a38.zip
jimtcl-ac35b8a6ec417f75b5ec86ca64ea1614a8170a38.tar.gz
jimtcl-ac35b8a6ec417f75b5ec86ca64ea1614a8170a38.tar.bz2
regexp: Improved error message
Detect and produce an error for missing closing bracket ] Consider a trailing backslash as an invalid escape Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jimregexp.c')
-rw-r--r--jimregexp.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/jimregexp.c b/jimregexp.c
index 3f2711b..e04d3a4 100644
--- a/jimregexp.c
+++ b/jimregexp.c
@@ -719,7 +719,7 @@ static int regatom(regex_t *preg, int *flagp)
pattern++;
}
- while (*pattern && *pattern != ']') {
+ while (*pattern != ']') {
/* Is this a range? a-z */
int start;
int end;
@@ -731,6 +731,11 @@ static int regatom(regex_t *preg, int *flagp)
};
int cc;
+ if (!*pattern) {
+ preg->err = REG_ERR_UNMATCHED_BRACKET;
+ return 0;
+ }
+
pattern += reg_utf8_tounicode_case(pattern, &start, nocase);
if (start == '\\') {
/* First check for class shorthand escapes */
@@ -754,6 +759,10 @@ static int regatom(regex_t *preg, int *flagp)
preg->err = REG_ERR_NULL_CHAR;
return 0;
}
+ if (start == '\\' && *pattern == 0) {
+ preg->err = REG_ERR_INVALID_ESCAPE;
+ return 0;
+ }
}
if (pattern[0] == '-' && pattern[1] && pattern[1] != ']') {
/* skip '-' */
@@ -765,6 +774,10 @@ static int regatom(regex_t *preg, int *flagp)
preg->err = REG_ERR_NULL_CHAR;
return 0;
}
+ if (start == '\\' && *pattern == 0) {
+ preg->err = REG_ERR_INVALID_ESCAPE;
+ return 0;
+ }
}
reg_addrange(preg, start, end);
@@ -869,7 +882,7 @@ cc_switch:
ch = *preg->regparse++;
switch (ch) {
case '\0':
- preg->err = REG_ERR_TRAILING_BACKSLASH;
+ preg->err = REG_ERR_INVALID_ESCAPE;
return 0;
case 'A':
ret = regnode(preg, BOLX);
@@ -1875,9 +1888,10 @@ size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_s
"nested count",
"internal error",
"count follows nothing",
- "trailing backslash",
+ "invalid escape \\ sequence",
"corrupted program",
"contains null char",
+ "brackets [] not balanced",
};
const char *err;