Ancurio / mkxp

Free Software implementation of the Ruby Game Scripting System (RGSS)
GNU General Public License v2.0
516 stars 133 forks source link

Segfault with mruby binding #196

Closed pulsejet closed 6 years ago

pulsejet commented 6 years ago

I'm trying to fix up the (really old) mruby bindings with the latest mruby release (a day ago). So far, I've managed to get everything to compile with the changes at https://github.com/pulsejet/mkxp/commit/bf76b90a7f1e1011373a9d530584583cee096d28, but now I'm getting a segfault.

I managed to trace this to loading user defined type objects using the provided marshal class. More specifically, apparently, mrb_get_args returns an invalid pointer into data, which further causes the segfault. printf(data) causes a segfault here. https://github.com/Ancurio/mkxp/blob/b5e5a26d8b0b1a8ea1b502cba3b432e7fac088a4/binding-mruby/binding-util.h#L357 Moreover, the data being passed to the call in Marshal is fine (line 463). printf(RSTRING_PTR(data)) doesn't cause a segfault here. https://github.com/Ancurio/mkxp/blob/b5e5a26d8b0b1a8ea1b502cba3b432e7fac088a4/binding-mruby/mrb-ext/marshal.cpp#L463 Did I break something?

Here is my backtrace:

#0  0x00005555555f5132 in readInt32 (dataP=0x7fffdaef7368) at /home/patil/dev/mkxp/src/serial-util.h:39
#1  0x00005555555f5808 in Table::deserialize (data=0x7fff00000000 <error: Cannot access memory at address 0x7fff00000000>, len=54)
    at /home/patil/dev/mkxp/src/table.cpp:127
#2  0x00005555555c3f16 in objectLoad<Table> (mrb=0x7fffbe546d80, self=..., type=...) at /home/patil/dev/mkxp/binding-mruby/binding-util.h:359
#3  0x00005555555c3a63 in TableLoad (mrb=0x7fffbe546d80, self=...) at /home/patil/dev/mkxp/binding-mruby/table-binding.cpp:143
#4  0x000055555573b63a in mrb_funcall_with_block (mrb=0x7fffbe546d80, self=..., mid=917, argc=1, argv=0x7fffdaef76c0, blk=...)
    at /home/patil/dev/mruby/src/vm.c:498
#5  0x000055555573b770 in mrb_funcall_argv (mrb=0x7fffbe546d80, self=..., mid=917, argc=1, argv=0x7fffdaef76c0)
    at /home/patil/dev/mruby/src/vm.c:515
#6  0x000055555573ad7e in mrb_funcall (mrb=0x7fffbe546d80, self=..., name=0x5555557e2e13 "_load", argc=1)
    at /home/patil/dev/mruby/src/vm.c:395
#7  0x00005555555c7f72 in read_userdef (ctx=0x7fffdaef7b50) at /home/patil/dev/mkxp/binding-mruby/mrb-ext/marshal.cpp:464
#8  0x00005555555c81f7 in read_value (ctx=0x7fffdaef7b50) at /home/patil/dev/mkxp/binding-mruby/mrb-ext/marshal.cpp:541
#9  0x00005555555c7dcc in read_object (ctx=0x7fffdaef7b50) at /home/patil/dev/mkxp/binding-mruby/mrb-ext/marshal.cpp:439
#10 0x00005555555c81af in read_value (ctx=0x7fffdaef7b50) at /home/patil/dev/mkxp/binding-mruby/mrb-ext/marshal.cpp:529
#11 0x00005555555c7751 in read_array (ctx=0x7fffdaef7b50) at /home/patil/dev/mkxp/binding-mruby/mrb-ext/marshal.cpp:287
#12 0x00005555555c813d in read_value (ctx=0x7fffdaef7b50) at /home/patil/dev/mkxp/binding-mruby/mrb-ext/marshal.cpp:513
#13 0x00005555555c9735 in marshalLoadInt (mrb=0x7fffbe546d80, ops=0x7fffdaef7c80)
    at /home/patil/dev/mkxp/binding-mruby/mrb-ext/marshal.cpp:1027
#14 0x00005555555d19d4 in kernelLoadData (mrb=0x7fffbe546d80) at /home/patil/dev/mkxp/binding-mruby/mrb-ext/kernel.cpp:179
#15 0x000055555573f05e in mrb_vm_exec (mrb=0x7fffbe546d80, proc=0x7fffbe86d6b0, pc=0x7fffbe9482c0) at /home/patil/dev/mruby/src/vm.c:1469
#16 0x000055555573ca85 in mrb_vm_run (mrb=0x7fffbe546d80, proc=0x7fffbe86aef0, self=..., stack_keep=2) at /home/patil/dev/mruby/src/vm.c:947
#17 0x0000555555746b26 in mrb_top_run (mrb=0x7fffbe546d80, proc=0x7fffbe86aef0, self=..., stack_keep=2)
    at /home/patil/dev/mruby/src/vm.c:3002
#18 0x000055555576d566 in mrb_load_exec (mrb=0x7fffbe546d80, p=0x7fffbe9749e0, c=0x7fffbe6ded10)
    at /home/patil/dev/mruby/mrbgems/mruby-compiler/core/parse.y:5835
#19 0x000055555576d66e in mrb_load_nstring_cxt (mrb=0x7fffbe546d80, 
    s=0x7fffbe7ea3f0 "#", '=' <repeats 78 times>, "\r\n# ** Main\r\n#", '-' <repeats 78 times>, "\r\n#  After defining each clas"..., 
    len=809, c=0x7fffbe6ded10) at /home/patil/dev/mruby/mrbgems/mruby-compiler/core/parse.y:5857
#20 0x00005555555b0340 in runRMXPScripts (mrb=0x7fffbe546d80, ctx=0x7fffbe6ded10) at /home/patil/dev/mkxp/binding-mruby/binding-mruby.cpp:356
#21 0x00005555555b06ff in mrbBindingExecute () at /home/patil/dev/mkxp/binding-mruby/binding-mruby.cpp:394
#22 0x000055555557b0b7 in rgssThreadFun (userdata=0x7fffffffdb50) at /home/patil/dev/mkxp/src/main.cpp:146
#23 0x00007ffff7b0cccc in ?? () from /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0
#24 0x00007ffff7b80d79 in ?? () from /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0
#25 0x00007ffff6f996db in start_thread (arg=0x7fffdaef9700) at pthread_create.c:463
---Type <return> to continue, or q <return> to quit---
#26 0x00007ffff615488f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
pulsejet commented 6 years ago

Gets fixed with https://github.com/pulsejet/mkxp/commit/dffd705d960f75ab07c5c6aecfa817fd135cc425