From 8993fb6cf0677ce980ab56cbad326e4e6bc47811 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Sat, 28 Jun 2014 02:25:04 +0300 Subject: [PATCH] py: Add protection against printing too nested or recursive data structures. With a test which cannot be automatically validated so far. --- py/obj.c | 3 +++ tests/misc/recursive_data.py_ | 9 +++++++++ 2 files changed, 12 insertions(+) create mode 100644 tests/misc/recursive_data.py_ diff --git a/py/obj.c b/py/obj.c index a0f55d65db..7e39c5a5cc 100644 --- a/py/obj.c +++ b/py/obj.c @@ -35,6 +35,7 @@ #include "obj.h" #include "runtime0.h" #include "runtime.h" +#include "stackctrl.h" mp_obj_type_t *mp_obj_get_type(mp_const_obj_t o_in) { if (MP_OBJ_IS_SMALL_INT(o_in)) { @@ -59,6 +60,8 @@ void printf_wrapper(void *env, const char *fmt, ...) { } void mp_obj_print_helper(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in, mp_print_kind_t kind) { + // There can be data structures nested too deep, or just recursive + STACK_CHECK(); #if !NDEBUG if (o_in == NULL) { print(env, "(nil)"); diff --git a/tests/misc/recursive_data.py_ b/tests/misc/recursive_data.py_ new file mode 100644 index 0000000000..6a52a3c0e8 --- /dev/null +++ b/tests/misc/recursive_data.py_ @@ -0,0 +1,9 @@ +# This tests that printing recursive data structure doesn't lead to segfault. +# Unfortunately, print() so far doesn't support "file "kwarg, so variable-len +# output of this test cannot be redirected, and this test cannot be validated. +l = [1, 2, 3, None] +l[-1] = l +try: + print(l) +except RuntimeError: + print("RuntimeError")