kubo / ruby-oci8

Ruby-oci8 - Oracle interface for ruby
Other
169 stars 75 forks source link

Segmentation fault after 2.2.12 → 2.2.13 update (x86_64-linux) #263

Closed thayol closed 1 month ago

thayol commented 1 month ago

I am getting the following error on starting Rails using bundle exec rails server:

/home/thayol/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/ruby-oci8-2.2.13/lib/oci8lib_320.so: [BUG] Segmentation fault at 0x00007f3642a735f8
ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x86_64-linux]

This does not happen with ruby-oci8-2.2.12.

Versions:

kubo commented 1 month ago

Could post C level backtrace information which will be outputted after [BUG] Segmentation fault at ..? Could you post a minimum reproducible example?

thayol commented 1 month ago

Minimum reproducible example (mre):

rails new mre
cd mre
bundle exec rails server # works normally
bundle add ruby-oci8
bundle exec rails server # fails
sed -E -i 's/gem "ruby-oci8", ".*?"/gem "ruby-oci8", "= 2.2.12"/' Gemfile
bundle install
bundle exec rails server # works normally again
thayol commented 1 month ago

And the C level backtrace:

-- C level backtrace information -------------------------------------------
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_print_backtrace+0xd) [0x7fa7daede56d] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_dump.c:785
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_vm_bugreport) /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_dump.c:1080
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_bug_for_fatal_signal+0xf0) [0x7fa7dacd61c0] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/error.c:813
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(sigsegv+0x4b) [0x7fa7dae2df9b] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/signal.c:964
/lib64/libc.so.6(__restore_rt+0x0) [0x7fa7da97b9a0]
/home/thayol/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/ruby-oci8-2.2.13/lib/oci8lib_320.so(Init_oci8lib_320+0x412) [0x7fa7c7158df2] /home/thayol/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/ruby-oci8-2.2.13/ext/oci8/oci8lib.c:177
/home/thayol/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/ruby-oci8-2.2.13/lib/oci8lib_320.so(Init_oci8lib_320) (null):0
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(dln_load+0x124) [0x7fa7dac42d24] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/dln.c:472
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(RUBY_VM_INTERRUPTED_ANY+0x0) [0x7fa7daec0d17] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm.c:2679
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_vm_check_ints) /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_core.h:1993
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_pop_frame) /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:428
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_vm_pop_frame) /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:437
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_vm_call_cfunc) /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm.c:2681
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(require_internal+0xb92) [0x7fa7dad484d2] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/load.c:1209
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_require_string+0x3d) [0x7fa7dad48f4d] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/load.c:1294
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_call_cfunc_with_frame+0x117) [0x7fa7daeb3147] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:3268
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_call_alias+0x78) [0x7fa7daed7e28] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:3447
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_sendish+0xa0) [0x7fa7daec3101] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:5080
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_exec_core) /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/insns.def:820
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_vm_exec+0x5dc) [0x7fa7daec91ac] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm.c:2383
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(load_iseq_eval+0x3c) [0x7fa7dad48547] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/load.c:697
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(require_internal) /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/load.c:1203
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_require_string+0x3d) [0x7fa7dad48f4d] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/load.c:1294
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_call_cfunc_with_frame+0x117) [0x7fa7daeb3147] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:3268
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_call_alias+0x78) [0x7fa7daed7e28] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:3447
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_sendish+0xa0) [0x7fa7daec3101] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:5080
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_exec_core) /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/insns.def:820
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_vm_exec+0x5dc) [0x7fa7daec91ac] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm.c:2383
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(load_iseq_eval+0x3c) [0x7fa7dad48547] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/load.c:697
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(require_internal) /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/load.c:1203
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_require_string+0x3d) [0x7fa7dad48f4d] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/load.c:1294
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_call_cfunc_with_frame+0x117) [0x7fa7daeb3147] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:3268
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_sendish+0xa0) [0x7fa7daec3101] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:5080
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_exec_core) /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/insns.def:820
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_vm_exec+0x16a) [0x7fa7daec8d3a] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm.c:2374
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_yield+0x1b2) [0x7fa7daecd5d2] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm.c:1398
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(RB_FL_TEST_RAW+0x0) [0x7fa7dac4465c] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/array.c:2740
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(RB_FL_ANY_RAW) ./include/ruby/internal/fl_type.h:552
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_array_len) ./include/ruby/internal/core/rarray.h:321
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_ary_each) /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/array.c:2739
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_call_cfunc_with_frame+0x117) [0x7fa7daeb3147] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:3268
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_sendish+0x9f) [0x7fa7daec4cc7] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:5080
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_exec_core) /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/insns.def:801
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_vm_exec+0x16a) [0x7fa7daec8d3a] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm.c:2374
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_yield+0x1b2) [0x7fa7daecd5d2] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm.c:1398
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(RB_FL_TEST_RAW+0x0) [0x7fa7dac4465c] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/array.c:2740
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(RB_FL_ANY_RAW) ./include/ruby/internal/fl_type.h:552
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_array_len) ./include/ruby/internal/core/rarray.h:321
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_ary_each) /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/array.c:2739
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_call_cfunc_with_frame+0x117) [0x7fa7daeb3147] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:3268
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_sendish+0x9f) [0x7fa7daec4cc7] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:5080
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_exec_core) /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/insns.def:801
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_vm_exec+0x5dc) [0x7fa7daec91ac] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm.c:2383
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(load_iseq_eval+0x3c) [0x7fa7dad48547] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/load.c:697
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(require_internal) /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/load.c:1203
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_require_string+0x3d) [0x7fa7dad48f4d] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/load.c:1294
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_call_cfunc_with_frame+0x117) [0x7fa7daeb3147] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:3268
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_call_alias+0x78) [0x7fa7daed7e28] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:3447
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_sendish+0xa0) [0x7fa7daec3101] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:5080
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_exec_core) /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/insns.def:820
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_vm_exec+0x5dc) [0x7fa7daec91ac] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm.c:2383
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(load_iseq_eval+0x3c) [0x7fa7dad48547] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/load.c:697
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(require_internal) /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/load.c:1203
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_require_string+0x3d) [0x7fa7dad48f4d] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/load.c:1294
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_call_cfunc_with_frame+0x117) [0x7fa7daeb3147] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:3268
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_call_alias+0x78) [0x7fa7daed7e28] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:3447
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_sendish+0xa0) [0x7fa7daec3101] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm_insnhelper.c:5080
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(vm_exec_core) /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/insns.def:820
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_vm_exec+0x5dc) [0x7fa7daec91ac] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/vm.c:2383
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(rb_ec_exec_node+0xa5) [0x7fa7dacdb425] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/eval.c:289
/home/thayol/.asdf/installs/ruby/3.2.2/lib/libruby.so.3.2(ruby_run_node+0x8b) [0x7fa7dace1a8b] /tmp/ruby-build.20230830102005.264953.YNGUgP/ruby-3.2.2/eval.c:330
/home/thayol/.asdf/installs/ruby/3.2.2/bin/ruby(rb_main+0x21) [0x401102] ./main.c:38
/home/thayol/.asdf/installs/ruby/3.2.2/bin/ruby(main) ./main.c:57
/lib64/libc.so.6(__libc_start_call_main+0x7a) [0x7fa7da96514a]
/lib64/libc.so.6(__libc_start_main+0x8b) [0x7fa7da96520b]
[0x401145]
kubo commented 1 month ago

@thayol Thanks. I reproduced it with your example.

kubo commented 1 month ago

Thanks again. ruby-oci8 2.2.14 was released.

This issue was reproduced when nokogiri is required before oci8.

ruby -r nokogiri -roci8 -e ''

Ruby-oci8 tries to fix symbol conflict: Two shared libraries have symbols with a same name. It is done by modifying procedure linkage table entries.

Before 2.2.12, only ones in a writable memory region are checked. https://github.com/kubo/ruby-oci8/blob/ruby-oci8-2.2.12/ext/oci8/oci8lib.c#L176-L183

At 2.2.13, ones in a read-only memory region are also checked. However they cannot be modified so it causes SIGSEGV at this line. (Both libclntsh.so depended by oci8 and nokogiri.so have z_errmsg.)

After 2.2.14 when they are read-only, the memory protection is modified temporarily. https://github.com/kubo/ruby-oci8/blob/ruby-oci8-2.2.14/ext/oci8/oci8lib.c#L186-L195

thayol commented 1 month ago

Thanks! ruby-oci8 2.2.14 no longer blows up on boot 🎉