summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dir.c2
-rw-r--r--internal/vm.h1
-rw-r--r--vm_eval.c10
3 files changed, 13 insertions, 0 deletions
diff --git a/dir.c b/dir.c
index 48c9eaefa0..fc2c811509 100644
--- a/dir.c
+++ b/dir.c
@@ -2274,6 +2274,8 @@ glob_helper(
int escape = !(flags & FNM_NOESCAPE);
size_t pathlen = baselen + namelen;
+ rb_check_stack_overflow();
+
for (cur = beg; cur < end; ++cur) {
struct glob_pattern *p = *cur;
if (p->type == RECURSIVE) {
diff --git a/internal/vm.h b/internal/vm.h
index a0e067d40c..80f2c792a3 100644
--- a/internal/vm.h
+++ b/internal/vm.h
@@ -80,6 +80,7 @@ VALUE rb_yield_force_blockarg(VALUE values);
VALUE rb_lambda_call(VALUE obj, ID mid, int argc, const VALUE *argv,
rb_block_call_func_t bl_proc, int min_argc, int max_argc,
VALUE data2);
+void rb_check_stack_overflow(void);
/* vm_insnhelper.c */
VALUE rb_equal_opt(VALUE obj1, VALUE obj2);
diff --git a/vm_eval.c b/vm_eval.c
index f9e7356c30..8eb1d5c84c 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -302,6 +302,16 @@ stack_check(rb_execution_context_t *ec)
#ifndef MJIT_HEADER
+void
+rb_check_stack_overflow(void)
+{
+#ifndef RB_THREAD_LOCAL_SPECIFIER
+ if (!ruby_current_ec_key) return;
+#endif
+ rb_execution_context_t *ec = GET_EC();
+ if (ec) stack_check(ec);
+}
+
static inline const rb_callable_method_entry_t *rb_search_method_entry(VALUE recv, ID mid);
static inline enum method_missing_reason rb_method_call_status(rb_execution_context_t *ec, const rb_callable_method_entry_t *me, call_type scope, VALUE self);