aboutsummaryrefslogtreecommitdiff
path: root/py/repl.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2018-05-10 23:05:43 +1000
committerDamien George <damien.p.george@gmail.com>2018-05-10 23:05:43 +1000
commit7241d90272f4dfe4100723393cc2f348f5d32c0a (patch)
treea89a9aa6ded28dfaf34d0f9c3b0732f85f1f8407 /py/repl.c
parent529860643bc321267376272356886ef39c4c6bd1 (diff)
py/repl: Use mp_load_method_protected to prevent leaking of exceptions.
This patch fixes the possibility of a crash of the REPL when tab-completing an object which raises an exception when its attributes are accessed. See issue #3729.
Diffstat (limited to 'py/repl.c')
-rw-r--r--py/repl.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/py/repl.c b/py/repl.c
index 56b1db011..a5a3ee007 100644
--- a/py/repl.c
+++ b/py/repl.c
@@ -158,7 +158,7 @@ size_t mp_repl_autocomplete(const char *str, size_t len, const mp_print_t *print
// lookup will fail
return 0;
}
- mp_load_method_maybe(obj, q, dest);
+ mp_load_method_protected(obj, q, dest, true);
obj = dest[0]; // attribute, method, or MP_OBJ_NULL if nothing found
if (obj == MP_OBJ_NULL) {
@@ -180,7 +180,7 @@ size_t mp_repl_autocomplete(const char *str, size_t len, const mp_print_t *print
size_t d_len;
const char *d_str = (const char*)qstr_data(q, &d_len);
if (s_len <= d_len && strncmp(s_start, d_str, s_len) == 0) {
- mp_load_method_maybe(obj, q, dest);
+ mp_load_method_protected(obj, q, dest, true);
if (dest[0] != MP_OBJ_NULL) {
if (match_str == NULL) {
match_str = d_str;
@@ -234,7 +234,7 @@ size_t mp_repl_autocomplete(const char *str, size_t len, const mp_print_t *print
size_t d_len;
const char *d_str = (const char*)qstr_data(q, &d_len);
if (s_len <= d_len && strncmp(s_start, d_str, s_len) == 0) {
- mp_load_method_maybe(obj, q, dest);
+ mp_load_method_protected(obj, q, dest, true);
if (dest[0] != MP_OBJ_NULL) {
int gap = (line_len + WORD_SLOT_LEN - 1) / WORD_SLOT_LEN * WORD_SLOT_LEN - line_len;
if (gap < 2) {