Ensure the VM is alive before accessing objspace in C API (Feature #19627)

[Feature #19627]
This commit is contained in:
Ian Ker-Seymer 2023-05-04 02:48:34 -04:00 коммит произвёл GitHub
Родитель e135a21a85
Коммит 2f9f44f077
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
1 изменённых файлов: 9 добавлений и 3 удалений

12
gc.c
Просмотреть файл

@ -1007,6 +1007,11 @@ asan_unlock_freelist(struct heap_page *page)
/* Aliases */ /* Aliases */
#define rb_objspace (*rb_objspace_of(GET_VM())) #define rb_objspace (*rb_objspace_of(GET_VM()))
#define rb_objspace_of(vm) ((vm)->objspace) #define rb_objspace_of(vm) ((vm)->objspace)
#define unless_objspace(objspace) \
rb_objspace_t *objspace; \
rb_vm_t *unless_objspace_vm = GET_VM(); \
if (unless_objspace_vm) objspace = unless_objspace_vm->objspace; \
else /* return; or objspace will be warned uninitialized */
#define ruby_initial_gc_stress gc_params.gc_stress #define ruby_initial_gc_stress gc_params.gc_stress
@ -10914,7 +10919,7 @@ rb_gc_start(void)
void void
rb_gc(void) rb_gc(void)
{ {
rb_objspace_t *objspace = &rb_objspace; unless_objspace(objspace) { return; }
unsigned int reason = GPR_DEFAULT_REASON; unsigned int reason = GPR_DEFAULT_REASON;
garbage_collect(objspace, reason); garbage_collect(objspace, reason);
} }
@ -10922,7 +10927,7 @@ rb_gc(void)
int int
rb_during_gc(void) rb_during_gc(void)
{ {
rb_objspace_t *objspace = &rb_objspace; unless_objspace(objspace) { return FALSE; }
return during_gc; return during_gc;
} }
@ -12740,7 +12745,8 @@ gc_malloc_allocations(VALUE self)
void void
rb_gc_adjust_memory_usage(ssize_t diff) rb_gc_adjust_memory_usage(ssize_t diff)
{ {
rb_objspace_t *objspace = &rb_objspace; unless_objspace(objspace) { return; }
if (diff > 0) { if (diff > 0) {
objspace_malloc_increase(objspace, 0, diff, 0, MEMOP_TYPE_REALLOC); objspace_malloc_increase(objspace, 0, diff, 0, MEMOP_TYPE_REALLOC);
} }