Fixed crash when argument array is modified

This commit is contained in:
Nobuyoshi Nakada 2020-03-25 01:23:03 +09:00
Родитель 1b3339528c
Коммит c7d668801b
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4BC7D6DF58D8DF60
2 изменённых файлов: 13 добавлений и 1 удалений

2
dir.c
Просмотреть файл

@ -3096,7 +3096,7 @@ dir_s_glob(int argc, VALUE *argv, VALUE obj)
ary = rb_push_glob(str, base, flags);
}
else {
VALUE v = ary;
VALUE v = rb_ary_replace(rb_ary_tmp_new(0), ary);
ary = dir_globs(RARRAY_LEN(v), RARRAY_CONST_PTR(v), base, flags);
RB_GC_GUARD(v);
}

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

@ -517,4 +517,16 @@ class TestDir < Test::Unit::TestCase
assert_equal([*"a".."z"], list)
end;
end if defined?(Process::RLIMIT_NOFILE)
def test_glob_array_with_destructive_element
args = Array.new(100, "")
pat = Struct.new(:ary).new(args)
args.push(pat, *Array.new(100) {"."*40})
def pat.to_path
ary.clear
GC.start
""
end
assert_empty(Dir.glob(args))
end
end