avoid reading uninitialized variable

autoload_reset() can read this state.result.  Because autoload_reset
is a function passed to rb_ensure, there is a chance when an
execption raises before actually filling this memory region.

test/ruby/test_defined.rb:test_autoload_noload is one of such case.

Found using memory sanitizer.

==54014==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x557a683f3e5a in autoload_reset variable.c:2372:9
    #1 0x557a6707a93b in rb_ensure eval.c:1084:5
    #2 0x557a683efbf5 in rb_autoload_load variable.c:2475:14
    #3 0x557a685fc460 in vm_get_ev_const vm_insnhelper.c:938:4
    #4 0x557a68448e0a in vm_exec_core insns.def:267:11
This commit is contained in:
Urabe, Shyouhei 2019-04-24 15:30:25 +09:00
Родитель 3ba485c0bf
Коммит f02760fc0a
1 изменённых файлов: 1 добавлений и 0 удалений

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

@ -2472,6 +2472,7 @@ rb_autoload_load(VALUE mod, ID id)
}
/* autoload_data_i can be deleted by another thread while require */
state.result = Qfalse;
result = rb_ensure(autoload_require, (VALUE)&state,
autoload_reset, (VALUE)&state);