diff options
author | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2015-11-01 00:38:12 +0300 |
---|---|---|
committer | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2015-11-01 00:38:22 +0300 |
commit | aee704ebe19cb9baeecdda90b7f8f7551d59aa3b (patch) | |
tree | 99a7a89347faed4f02637a0df99f3b4c04d7bb93 | |
parent | 7cce2f664c9a93b0ed42e1bf51a601bddf2b7059 (diff) | |
download | micropython-aee704ebe19cb9baeecdda90b7f8f7551d59aa3b.tar.gz micropython-aee704ebe19cb9baeecdda90b7f8f7551d59aa3b.zip |
extmod/modure: Make sure that errors in regexps are caught early.
-rw-r--r-- | extmod/modure.c | 4 | ||||
-rw-r--r-- | tests/extmod/ure1.py | 5 |
2 files changed, 9 insertions, 0 deletions
diff --git a/extmod/modure.c b/extmod/modure.c index f54b060c8f..f25c1a8d90 100644 --- a/extmod/modure.c +++ b/extmod/modure.c @@ -185,6 +185,9 @@ STATIC const mp_obj_type_t re_type = { STATIC mp_obj_t mod_re_compile(uint n_args, const mp_obj_t *args) { const char *re_str = mp_obj_str_get_str(args[0]); int size = re1_5_sizecode(re_str); + if (size == -1) { + goto error; + } mp_obj_re_t *o = m_new_obj_var(mp_obj_re_t, char, size); o->base.type = &re_type; int flags = 0; @@ -193,6 +196,7 @@ STATIC mp_obj_t mod_re_compile(uint n_args, const mp_obj_t *args) { } int error = re1_5_compilecode(&o->re, re_str); if (error != 0) { +error: nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "Error in regex")); } if (flags & FLAG_DEBUG) { diff --git a/tests/extmod/ure1.py b/tests/extmod/ure1.py index 39e84d51ea..aeadf4e5c5 100644 --- a/tests/extmod/ure1.py +++ b/tests/extmod/ure1.py @@ -62,3 +62,8 @@ m = re.match('a*?', 'ab'); print(m.group(0)) m = re.match('^ab$', 'ab'); print(m.group(0)) m = re.match('a|b', 'b'); print(m.group(0)) m = re.match('a|b|c', 'c'); print(m.group(0)) + +try: + re.compile("*") +except: + print("Caught invalid regex") |