d-unsed / ruru

Native Ruby extensions written in Rust
MIT License
832 stars 40 forks source link

Segfault on RString with null byte #41

Closed Zapotek closed 7 years ago

Zapotek commented 7 years ago

Rust:

class!( NullByte );
methods!(
    NullByte,
    itself,

    fn get() -> RString {
        RString::new( "\u{0}" )
    }
);

Class::new( "NullByte", None ).define( |itself| {
    itself.def_self( "get", get );
});

Ruby:

NullByte.get

Error:

thread '<unnamed>' panicked at 'called `Result::unwrap()` on an `Err` value: NulError(0, [0])', ../src/libcore/result.rs:799
stack backtrace:
   1:     0x7f75d426e61f - std::sys::backtrace::tracing::imp::write::h22f199c1dbb72ba2
   2:     0x7f75d427db4d - std::panicking::default_hook::{{closure}}::h9a389c462b6a22dd
   3:     0x7f75d427b0b2 - std::panicking::default_hook::h852b4223c1c00c59
   4:     0x7f75d427b6a8 - std::panicking::rust_panic_with_hook::hcd9d05f53fa0dafc
   5:     0x7f75d427b542 - std::panicking::begin_panic::hf6c488cee66e7f17
   6:     0x7f75d427b480 - std::panicking::begin_panic_fmt::hb0a7126ee57cdd27
   7:     0x7f75d427b401 - rust_begin_unwind
   8:     0x7f75d4293aaf - core::panicking::panic_fmt::h9af671b78898cdba
   9:     0x7f75d4231383 - core::result::unwrap_failed::h03cc84bf66ee82b5
  10:     0x7f75d423235e - ruru::class::string::RString::new::h2793ffe2d21bdbab
  11:     0x7f75d4231239 - get
  12:     0x7f75df5533b2 - vm_call_cfunc
                        at /home/zapotek/.rvm/src/ruby-2.3.1/vm_insnhelper.c:1638
                        at /home/zapotek/.rvm/src/ruby-2.3.1/vm_insnhelper.c:1733
  13:     0x7f75df562d2d - vm_call_method_each_type
                        at /home/zapotek/.rvm/src/ruby-2.3.1/vm_insnhelper.c:2022
  14:     0x7f75df5632a2 - vm_call_method
                        at /home/zapotek/.rvm/src/ruby-2.3.1/vm_insnhelper.c:2172
  15:     0x7f75df55c7d7 - vm_exec_core
                        at /home/zapotek/.rvm/src/ruby-2.3.1/insns.def:995
  16:     0x7f75df561285 - vm_exec
                        at /home/zapotek/.rvm/src/ruby-2.3.1/vm.c:1650
  17:     0x7f75df4082e8 - rb_load_internal0
                        at /home/zapotek/.rvm/src/ruby-2.3.1/load.c:619
  18:     0x7f75df409dff - rb_require_internal
                        at /home/zapotek/.rvm/src/ruby-2.3.1/load.c:998
  19:     0x7f75df40a128 - rb_require_safe
                        at /home/zapotek/.rvm/src/ruby-2.3.1/load.c:1043
  20:     0x7f75df5533b2 - vm_call_cfunc
                        at /home/zapotek/.rvm/src/ruby-2.3.1/vm_insnhelper.c:1638
                        at /home/zapotek/.rvm/src/ruby-2.3.1/vm_insnhelper.c:1733
  21:     0x7f75df562d2d - vm_call_method_each_type
                        at /home/zapotek/.rvm/src/ruby-2.3.1/vm_insnhelper.c:2022
  22:     0x7f75df5632a2 - vm_call_method
                        at /home/zapotek/.rvm/src/ruby-2.3.1/vm_insnhelper.c:2172
  23:     0x7f75df55c7d7 - vm_exec_core
                        at /home/zapotek/.rvm/src/ruby-2.3.1/insns.def:995
  24:     0x7f75df561285 - vm_exec
                        at /home/zapotek/.rvm/src/ruby-2.3.1/vm.c:1650
  25:     0x7f75df4082e8 - rb_load_internal0
                        at /home/zapotek/.rvm/src/ruby-2.3.1/load.c:619
  26:     0x7f75df409dff - rb_require_internal
                        at /home/zapotek/.rvm/src/ruby-2.3.1/load.c:998
  27:     0x7f75df40a128 - rb_require_safe
                        at /home/zapotek/.rvm/src/ruby-2.3.1/load.c:1043
  28:     0x7f75df5533b2 - vm_call_cfunc
                        at /home/zapotek/.rvm/src/ruby-2.3.1/vm_insnhelper.c:1638
                        at /home/zapotek/.rvm/src/ruby-2.3.1/vm_insnhelper.c:1733
  29:     0x7f75df562d2d - vm_call_method_each_type
                        at /home/zapotek/.rvm/src/ruby-2.3.1/vm_insnhelper.c:2022
  30:     0x7f75df5632a2 - vm_call_method
                        at /home/zapotek/.rvm/src/ruby-2.3.1/vm_insnhelper.c:2172
  31:     0x7f75df55c7d7 - vm_exec_core
                        at /home/zapotek/.rvm/src/ruby-2.3.1/insns.def:995
  32:     0x7f75df561285 - vm_exec
                        at /home/zapotek/.rvm/src/ruby-2.3.1/vm.c:1650
  33:     0x7f75df40251c - ruby_exec_internal
                        at /home/zapotek/.rvm/src/ruby-2.3.1/eval.c:245
  34:     0x7f75df40473c - ruby_exec_node
                        at /home/zapotek/.rvm/src/ruby-2.3.1/eval.c:310
  35:     0x7f75df40717d - ruby_run_node
                        at /home/zapotek/.rvm/src/ruby-2.3.1/eval.c:302
  36:           0x40088a - main
                        at /home/zapotek/.rvm/src/ruby-2.3.1/main.c:36
  37:     0x7f75defd482f - __libc_start_main
  38:           0x4008b8 - _start
  39:                0x0 - <unknown>
fatal runtime error: failed to initiate panic, error 5
Aborted (core dumped)

Both Ruby and Rust support null-bytes in strings, it'd be nice to allow them to cross boundaries.

d-unsed commented 7 years ago

Done in 0.9.0