Check stack overflow in recursive glob_helper [Bug #17162]

This commit is contained in:
Nobuyoshi Nakada 2020-12-10 22:00:11 +09:00
Родитель a5b4b806de
Коммит 083c5f08ec
3 изменённых файлов: 13 добавлений и 0 удалений

2
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) {

Просмотреть файл

@ -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);

Просмотреть файл

@ -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);