Project

General

Profile

Bug #14782

binding.eval("proc") with &:to_s dumps core

Added by mame (Yusuke Endoh) 3 months ago. Updated 3 months ago.

Status:
Closed
Priority:
Normal
Target version:
ruby -v:
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
[ruby-core:87223]

Description

The following program dumps core.

def foo
  binding.eval("proc")
end
foo(&:to_s)

VM_ENV_PROCVAL seems to be a Symbol when &:to_s is given. I'm unsure if this is intended, but anyway, Kernel#proc with no block does not support the case.

I created a patch to make Kernel#proc support the situation. ko1 (Koichi Sasada), could you review this?

diff --git a/proc.c b/proc.c
index b81d14ed46..d54ccd58cb 100644
--- a/proc.c
+++ b/proc.c
@@ -709,7 +709,7 @@ proc_new(VALUE klass, int8_t is_lambda)
        const VALUE *lep = rb_vm_ep_local_ep(cfp->ep);

        if (VM_ENV_ESCAPED_P(lep)) {
-       procval = VM_ENV_PROCVAL(lep);
+       block_handler = VM_ENV_PROCVAL(lep);
        goto return_existing_proc;
        }

@@ -726,11 +726,11 @@ proc_new(VALUE klass, int8_t is_lambda)
     }

     /* block is in cf */
+  return_existing_proc:
     switch (vm_block_handler_type(block_handler)) {
       case block_handler_type_proc:
    procval = VM_BH_TO_PROC(block_handler);

-      return_existing_proc:
    if (RBASIC_CLASS(procval) == klass) {
        return procval;
    }

The complete dump log;

$ ruby -e '
def foo
  binding.eval("proc")
end
foo(&:to_s)
'
-e:3: [BUG] Segmentation fault at 0x00000000000cb114
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]

-- Control frame information -----------------------------------------------
c:0006 p:---- s:0022 e:000021 CFUNC  :proc
c:0005 p:0004 s:0018 e:000017 EVAL   -e:3 [FINISH]
c:0004 p:---- s:0015 e:000014 CFUNC  :eval
c:0003 p:0009 s:0010 E:000300 METHOD -e:3
c:0002 p:0017 s:0006 e:000005 EVAL   -e:5 [FINISH]
c:0001 p:0000 s:0003 E:000d30 (none) [FINISH]

-- Ruby level backtrace information ----------------------------------------
-e:5:in `<main>'
-e:3:in `foo'
-e:3:in `eval'
-e:3:in `foo'
-e:3:in `proc'

-- Machine register context ------------------------------------------------
 RIP: 0x00005569cb3facc5 RBP: 0x00005569cc113d80 RSP: 0x00007ffdac9f4ad0
 RAX: 0x00005569cc3a2950 RBX: 0x00000000000cb10c RCX: 0x00007f6365c1e0a8
 RDX: 0x00005569cc3a2950 RDI: 0x00007f6365c1e098 RSI: 0x00005569cc13a2c8
  R8: 0x0000000000000000  R9: 0x0000000000000000 R10: 0x00000000000000f9
 R11: 0x0000000000000001 R12: 0x00007f6365d1def0 R13: 0x00005569cc0d9308
 R14: 0x00005569cc49f790 R15: 0x00005569cc13a2c8 EFL: 0x0000000000010202

-- C level backtrace information -------------------------------------------
/home/mame/local/bin/ruby(rb_vm_bugreport+0x7d3) [0x5569cb57bcd3] vm_dump.c:703
/home/mame/local/bin/ruby(rb_bug_context+0xd1) [0x5569cb56f3e1] error.c:580
/home/mame/local/bin/ruby(sigsegv+0x42) [0x5569cb458262] signal.c:928
/lib/x86_64-linux-gnu/libpthread.so.0(0x7f636593f890) [0x7f636593f890]
/home/mame/local/bin/ruby(rb_block_proc+0x105) [0x5569cb3facc5] vm_core.h:1192
/home/mame/local/bin/ruby(vm_call_cfunc+0xe1) [0x5569cb4ca6f1] vm_insnhelper.c:1918
/home/mame/local/bin/ruby(vm_call_method+0xd3) [0x5569cb4da1e3] vm_insnhelper.c:2381
/home/mame/local/bin/ruby(vm_exec_core+0x3136) [0x5569cb4d3e16] insns.def:915
/home/mame/local/bin/ruby(vm_exec+0x7d) [0x5569cb4d85ed] vm.c:1778
/home/mame/local/bin/ruby(eval_string_with_cref+0x137) [0x5569cb4dad77] vm_eval.c:1349
/home/mame/local/bin/ruby(rb_f_eval+0xde) [0x5569cb4db2ce] vm_eval.c:1370
/home/mame/local/bin/ruby(bind_eval+0x9a) [0x5569cb3f68fa] proc.c:384
/home/mame/local/bin/ruby(vm_call_cfunc+0xe1) [0x5569cb4ca6f1] vm_insnhelper.c:1918
/home/mame/local/bin/ruby(vm_call_method+0xd3) [0x5569cb4da1e3] vm_insnhelper.c:2381
/home/mame/local/bin/ruby(vm_exec_core+0x3136) [0x5569cb4d3e16] insns.def:915
/home/mame/local/bin/ruby(vm_exec+0x7d) [0x5569cb4d85ed] vm.c:1778
/home/mame/local/bin/ruby(ruby_exec_internal+0xc1) [0x5569cb355a91] eval.c:246
/home/mame/local/bin/ruby(ruby_run_node+0x2f) [0x5569cb35a26f] eval.c:310
/home/mame/local/bin/ruby(main+0x4b) [0x5569cb3557bb] ./include/ruby/intern.h:295

-- Other runtime information -----------------------------------------------

* Loaded script: -e

* Loaded features:

    0 enumerator.so
    1 thread.rb
    2 rational.so
    3 complex.so
    4 /home/mame/local/lib/ruby/2.5.0/x86_64-linux/enc/encdb.so
    5 /home/mame/local/lib/ruby/2.5.0/x86_64-linux/enc/trans/transdb.so
    6 /home/mame/local/lib/ruby/2.5.0/x86_64-linux/rbconfig.rb
    7 /home/mame/local/lib/ruby/2.5.0/rubygems/compatibility.rb
    8 /home/mame/local/lib/ruby/2.5.0/rubygems/defaults.rb
    9 /home/mame/local/lib/ruby/2.5.0/rubygems/deprecate.rb
   10 /home/mame/local/lib/ruby/2.5.0/rubygems/errors.rb
   11 /home/mame/local/lib/ruby/2.5.0/rubygems/version.rb
   12 /home/mame/local/lib/ruby/2.5.0/rubygems/requirement.rb
   13 /home/mame/local/lib/ruby/2.5.0/rubygems/platform.rb
   14 /home/mame/local/lib/ruby/2.5.0/rubygems/basic_specification.rb
   15 /home/mame/local/lib/ruby/2.5.0/rubygems/stub_specification.rb
   16 /home/mame/local/lib/ruby/2.5.0/rubygems/util/list.rb
   17 /home/mame/local/lib/ruby/2.5.0/x86_64-linux/stringio.so
   18 /home/mame/local/lib/ruby/2.5.0/uri/rfc2396_parser.rb
   19 /home/mame/local/lib/ruby/2.5.0/uri/rfc3986_parser.rb
   20 /home/mame/local/lib/ruby/2.5.0/uri/common.rb
   21 /home/mame/local/lib/ruby/2.5.0/uri/generic.rb
   22 /home/mame/local/lib/ruby/2.5.0/uri/ftp.rb
   23 /home/mame/local/lib/ruby/2.5.0/uri/http.rb
   24 /home/mame/local/lib/ruby/2.5.0/uri/https.rb
   25 /home/mame/local/lib/ruby/2.5.0/uri/ldap.rb
   26 /home/mame/local/lib/ruby/2.5.0/uri/ldaps.rb
   27 /home/mame/local/lib/ruby/2.5.0/uri/mailto.rb
   28 /home/mame/local/lib/ruby/2.5.0/uri.rb
   29 /home/mame/local/lib/ruby/2.5.0/rubygems/specification.rb
   30 /home/mame/local/lib/ruby/2.5.0/rubygems/exceptions.rb
   31 /home/mame/local/lib/ruby/2.5.0/rubygems/dependency.rb
   32 /home/mame/local/lib/ruby/2.5.0/rubygems/core_ext/kernel_gem.rb
   33 /home/mame/local/lib/ruby/2.5.0/monitor.rb
   34 /home/mame/local/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb
   35 /home/mame/local/lib/ruby/2.5.0/rubygems.rb
   36 /home/mame/local/lib/ruby/2.5.0/rubygems/path_support.rb
   37 /home/mame/local/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/version.rb
   38 /home/mame/local/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/core_ext/name_error.rb
   39 /home/mame/local/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/levenshtein.rb
   40 /home/mame/local/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/jaro_winkler.rb
   41 /home/mame/local/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/spell_checker.rb
   42 /home/mame/local/lib/ruby/2.5.0/delegate.rb
   43 /home/mame/local/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/spell_checkers/name_error_checkers/class_name_checker.rb
   44 /home/mame/local/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/spell_checkers/name_error_checkers/variable_name_checker.rb
   45 /home/mame/local/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/spell_checkers/name_error_checkers.rb
   46 /home/mame/local/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/spell_checkers/method_name_checker.rb
   47 /home/mame/local/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/spell_checkers/key_error_checker.rb
   48 /home/mame/local/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/spell_checkers/null_checker.rb
   49 /home/mame/local/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean/formatters/plain_formatter.rb
   50 /home/mame/local/lib/ruby/gems/2.5.0/gems/did_you_mean-1.2.0/lib/did_you_mean.rb

* Process memory map:

5569cb332000-5569cb65b000 r-xp 00000000 08:06 37880534                   /home/mame/local/bin/ruby
5569cb85b000-5569cb860000 r--p 00329000 08:06 37880534                   /home/mame/local/bin/ruby
5569cb860000-5569cb861000 rw-p 0032e000 08:06 37880534                   /home/mame/local/bin/ruby
5569cb861000-5569cb871000 rw-p 00000000 00:00 0 
5569cc0d8000-5569cc4ed000 rw-p 00000000 00:00 0                          [heap]
7f6363028000-7f6363218000 r--s 00000000 08:06 46400127                   /lib/x86_64-linux-gnu/libc-2.27.so
7f6363218000-7f63642b8000 r--s 00000000 08:06 37880534                   /home/mame/local/bin/ruby
7f63642b8000-7f63642cf000 r-xp 00000000 08:06 46399538                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7f63642cf000-7f63644ce000 ---p 00017000 08:06 46399538                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7f63644ce000-7f63644cf000 r--p 00016000 08:06 46399538                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7f63644cf000-7f63644d0000 rw-p 00017000 08:06 46399538                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7f63644d0000-7f63644d9000 r-xp 00000000 08:06 37922256                   /home/mame/local/lib/ruby/2.5.0/x86_64-linux/stringio.so
7f63644d9000-7f63646d8000 ---p 00009000 08:06 37922256                   /home/mame/local/lib/ruby/2.5.0/x86_64-linux/stringio.so
7f63646d8000-7f63646d9000 r--p 00008000 08:06 37922256                   /home/mame/local/lib/ruby/2.5.0/x86_64-linux/stringio.so
7f63646d9000-7f63646da000 rw-p 00009000 08:06 37922256                   /home/mame/local/lib/ruby/2.5.0/x86_64-linux/stringio.so
7f63646da000-7f63646dc000 r-xp 00000000 08:06 37922237                   /home/mame/local/lib/ruby/2.5.0/x86_64-linux/enc/trans/transdb.so
7f63646dc000-7f63648dc000 ---p 00002000 08:06 37922237                   /home/mame/local/lib/ruby/2.5.0/x86_64-linux/enc/trans/transdb.so
7f63648dc000-7f63648dd000 r--p 00002000 08:06 37922237                   /home/mame/local/lib/ruby/2.5.0/x86_64-linux/enc/trans/transdb.so
7f63648dd000-7f63648de000 rw-p 00003000 08:06 37922237                   /home/mame/local/lib/ruby/2.5.0/x86_64-linux/enc/trans/transdb.so
7f63648de000-7f63648e0000 r-xp 00000000 08:06 37921703                   /home/mame/local/lib/ruby/2.5.0/x86_64-linux/enc/encdb.so
7f63648e0000-7f6364adf000 ---p 00002000 08:06 37921703                   /home/mame/local/lib/ruby/2.5.0/x86_64-linux/enc/encdb.so
7f6364adf000-7f6364ae0000 r--p 00001000 08:06 37921703                   /home/mame/local/lib/ruby/2.5.0/x86_64-linux/enc/encdb.so
7f6364ae0000-7f6364ae1000 rw-p 00002000 08:06 37921703                   /home/mame/local/lib/ruby/2.5.0/x86_64-linux/enc/encdb.so
7f6364ae1000-7f6364cc8000 r-xp 00000000 08:06 46400127                   /lib/x86_64-linux-gnu/libc-2.27.so
7f6364cc8000-7f6364ec8000 ---p 001e7000 08:06 46400127                   /lib/x86_64-linux-gnu/libc-2.27.so
7f6364ec8000-7f6364ecc000 r--p 001e7000 08:06 46400127                   /lib/x86_64-linux-gnu/libc-2.27.so
7f6364ecc000-7f6364ece000 rw-p 001eb000 08:06 46400127                   /lib/x86_64-linux-gnu/libc-2.27.so
7f6364ece000-7f6364ed2000 rw-p 00000000 00:00 0 
7f6364ed2000-7f636506f000 r-xp 00000000 08:06 46400275                   /lib/x86_64-linux-gnu/libm-2.27.so
7f636506f000-7f636526e000 ---p 0019d000 08:06 46400275                   /lib/x86_64-linux-gnu/libm-2.27.so
7f636526e000-7f636526f000 r--p 0019c000 08:06 46400275                   /lib/x86_64-linux-gnu/libm-2.27.so
7f636526f000-7f6365270000 rw-p 0019d000 08:06 46400275                   /lib/x86_64-linux-gnu/libm-2.27.so
7f6365270000-7f6365279000 r-xp 00000000 08:06 46400226                   /lib/x86_64-linux-gnu/libcrypt-2.27.so
7f6365279000-7f6365478000 ---p 00009000 08:06 46400226                   /lib/x86_64-linux-gnu/libcrypt-2.27.so
7f6365478000-7f6365479000 r--p 00008000 08:06 46400226                   /lib/x86_64-linux-gnu/libcrypt-2.27.so
7f6365479000-7f636547a000 rw-p 00009000 08:06 46400226                   /lib/x86_64-linux-gnu/libcrypt-2.27.so
7f636547a000-7f63654a8000 rw-p 00000000 00:00 0 
7f63654a8000-7f63654ab000 r-xp 00000000 08:06 46400231                   /lib/x86_64-linux-gnu/libdl-2.27.so
7f63654ab000-7f63656aa000 ---p 00003000 08:06 46400231                   /lib/x86_64-linux-gnu/libdl-2.27.so
7f63656aa000-7f63656ab000 r--p 00002000 08:06 46400231                   /lib/x86_64-linux-gnu/libdl-2.27.so
7f63656ab000-7f63656ac000 rw-p 00003000 08:06 46400231                   /lib/x86_64-linux-gnu/libdl-2.27.so
7f63656ac000-7f636572b000 r-xp 00000000 08:06 27265975                   /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.2
7f636572b000-7f636592b000 ---p 0007f000 08:06 27265975                   /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.2
7f636592b000-7f636592c000 r--p 0007f000 08:06 27265975                   /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.2
7f636592c000-7f636592d000 rw-p 00080000 08:06 27265975                   /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.2
7f636592d000-7f6365947000 r-xp 00000000 08:06 46400298                   /lib/x86_64-linux-gnu/libpthread-2.27.so
7f6365947000-7f6365b46000 ---p 0001a000 08:06 46400298                   /lib/x86_64-linux-gnu/libpthread-2.27.so
7f6365b46000-7f6365b47000 r--p 00019000 08:06 46400298                   /lib/x86_64-linux-gnu/libpthread-2.27.so
7f6365b47000-7f6365b48000 rw-p 0001a000 08:06 46400298                   /lib/x86_64-linux-gnu/libpthread-2.27.so
7f6365b48000-7f6365b4c000 rw-p 00000000 00:00 0 
7f6365b4c000-7f6365b73000 r-xp 00000000 08:06 46400081                   /lib/x86_64-linux-gnu/ld-2.27.so
7f6365c1e000-7f6365d26000 rw-p 00000000 00:00 0 
7f6365d4a000-7f6365d6e000 r--s 00000000 08:06 46400298                   /lib/x86_64-linux-gnu/libpthread-2.27.so
7f6365d6e000-7f6365d6f000 ---p 00000000 00:00 0 
7f6365d6f000-7f6365d73000 rw-p 00000000 00:00 0 
7f6365d73000-7f6365d74000 r--p 00027000 08:06 46400081                   /lib/x86_64-linux-gnu/ld-2.27.so
7f6365d74000-7f6365d75000 rw-p 00028000 08:06 46400081                   /lib/x86_64-linux-gnu/ld-2.27.so
7f6365d75000-7f6365d76000 rw-p 00000000 00:00 0 
7ffdac1f9000-7ffdac9f8000 rw-p 00000000 00:00 0                          [stack]
7ffdac9f9000-7ffdac9fc000 r--p 00000000 00:00 0                          [vvar]
7ffdac9fc000-7ffdac9fe000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]


[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html

Aborted (core dumped)

Associated revisions

Revision e6ad53be
Added by ko1 (Koichi Sasada) 3 months ago

remove VM_ENV_DATA_INDEX_ENV_PROC.

  • vm_core.h (VM_ENV_DATA_INDEX_ENV_PROC): ep[VM_ENV_DATA_INDEX_ENV_PROC] is
    allocated to mark a Proc which is created from iseq block.
    However, lep[0] keeps Proc object itself as a block handler (Proc).
    So we don't need to keep it.

  • vm_core.h (VM_ENV_PROCVAL): ditto.

  • vm.c (vm_make_env_each): do not need to keep blockprocval as special value.

  • vm.c (vm_block_handler_escape): simply return Proc value.

  • proc.c (proc_new): we don't need to check Env because a Proc type block
    handler is a Proc object itself.
    [Bug #14782]

  • test/ruby/test_proc.rb: add a test for [Bug #14782]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63494 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 63494
Added by ko1 (Koichi Sasada) 3 months ago

remove VM_ENV_DATA_INDEX_ENV_PROC.

  • vm_core.h (VM_ENV_DATA_INDEX_ENV_PROC): ep[VM_ENV_DATA_INDEX_ENV_PROC] is
    allocated to mark a Proc which is created from iseq block.
    However, lep[0] keeps Proc object itself as a block handler (Proc).
    So we don't need to keep it.

  • vm_core.h (VM_ENV_PROCVAL): ditto.

  • vm.c (vm_make_env_each): do not need to keep blockprocval as special value.

  • vm.c (vm_block_handler_escape): simply return Proc value.

  • proc.c (proc_new): we don't need to check Env because a Proc type block
    handler is a Proc object itself.
    [Bug #14782]

  • test/ruby/test_proc.rb: add a test for [Bug #14782]

History

#1 Updated by ko1 (Koichi Sasada) 3 months ago

  • Status changed from Assigned to Closed

Applied in changeset trunk|r63494.


remove VM_ENV_DATA_INDEX_ENV_PROC.

  • vm_core.h (VM_ENV_DATA_INDEX_ENV_PROC): ep[VM_ENV_DATA_INDEX_ENV_PROC] is
    allocated to mark a Proc which is created from iseq block.
    However, lep[0] keeps Proc object itself as a block handler (Proc).
    So we don't need to keep it.

  • vm_core.h (VM_ENV_PROCVAL): ditto.

  • vm.c (vm_make_env_each): do not need to keep blockprocval as special value.

  • vm.c (vm_block_handler_escape): simply return Proc value.

  • proc.c (proc_new): we don't need to check Env because a Proc type block
    handler is a Proc object itself.
    [Bug #14782]

  • test/ruby/test_proc.rb: add a test for [Bug #14782]

Also available in: Atom PDF