summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-12-06 14:30:12 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-12-06 17:28:20 +0900
commitae44e80668657a93dc316b9c7d3524ed311fb3dc (patch)
treefbc28884f8f65691f0d77f41de565694b37f0276 /src
parentb00d45b095e8586d07b0db51dde2794ab77b21ec (diff)
downloadmruby-ae44e80668657a93dc316b9c7d3524ed311fb3dc.tar.gz
mruby-ae44e80668657a93dc316b9c7d3524ed311fb3dc.zip
Limit `ecall()` depth to 32 (default).
Diffstat (limited to 'src')
-rw-r--r--src/vm.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/vm.c b/src/vm.c
index de2ac983c..f8c2d510f 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -53,6 +53,11 @@ void abort(void);
#define MRB_FUNCALL_DEPTH_MAX 512
#endif
+/* Maximum depth of ecall() recursion. */
+#ifndef MRB_ECALL_DEPTH_MAX
+#define MRB_ECALL_DEPTH_MAX 32
+#endif
+
/* Maximum stack depth. Should be set lower on memory constrained systems.
The value below allows about 60000 recursive calls in the simplest case. */
#ifndef MRB_STACK_MAX
@@ -319,7 +324,7 @@ ecall(mrb_state *mrb)
int nregs;
if (i<0) return;
- if (ci - c->cibase > MRB_FUNCALL_DEPTH_MAX) {
+ if (ci - c->cibase > MRB_ECALL_DEPTH_MAX) {
mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err));
}
p = c->ensure[i];