From: iv@altlinux.org
To: ruby-core@ruby-lang.org
Subject: [ruby-core:95106] [Ruby master Bug#16184] Entry persists in catch table even though its labels were removed, which may cause [BUG]
Date: Thu, 26 Sep 2019 13:22:45 +0000 (UTC) [thread overview]
Message-ID: <redmine.journal-81740.20190926132244.9e5039627b68ecef@ruby-lang.org> (raw)
In-Reply-To: redmine.issue-16184.20190926131823@ruby-lang.org
Issue #16184 has been updated by iv-m (Ivan Melnikov).
File ruby-2.5.5-alt-fix-crash-on-mipsel.patch added
Of course, while having some strange cache table entries would be pretty ok if they were not used (like it usually happens on x86_64). To make sure they are never used compiler should initialize the `position` field of the labels. I'm attaching a patch that does just that -- at least this makes segfaults irreproducible.
----------------------------------------
Bug #16184: Entry persists in catch table even though its labels were removed, which may cause [BUG]
https://bugs.ruby-lang.org/issues/16184#change-81740
* Author: iv-m (Ivan Melnikov)
* Status: Open
* Priority: Normal
* Assignee:
* Target version:
* ruby -v: ruby 2.5.5p157 (2019-03-15) [mipsel-linux]
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN
----------------------------------------
When `remove_unreachable_chunk` removes the code from within a rescue block, the catch table entry corresponding the block is not removed. Here is a simple reproducer (tested with ruby 2.5.5):
``` ruby
puts "BEGIN"
if false
begin
require "some_mad_stuff"
rescue LoadError
puts "no mad stuff loaded"
end
end
puts "END"
```
Here is the corresponding disasm:
```
== disasm: #<ISeq:<main>@test2.rb:1 (1,0)-(12,10)>======================
== catch table
| catch type: rescue st: 11022376 ed: 11022516 sp: -002 cont: 0000
== disasm: #<ISeq:rescue in <main>@test2.rb:7 (7,2)-(9,2)>==============
local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
[ 1] "\#$!"
0000 getlocal_OP__WC__0 "\#$!" ( 7)
0002 getinlinecache 9, <is:0>
0005 getconstant :LoadError
0007 setinlinecache <is:0>
0009 checkmatch 3
0011 branchunless 20
0013 putself ( 8)[Li]
0014 putstring "no mad stuff loaded"
0016 opt_send_without_block <callinfo!mid:puts, argc:1, FCALL|ARGS_SIMPLE>, <callcache>
0019 leave ( 7)
0020 getlocal_OP__WC__0 "\#$!"
0022 throw 0
| catch type: retry st: 11022516 ed: 0000 sp: -001 cont: 11022376
|------------------------------------------------------------------------
0000 putself ( 2)[Li]
0001 putstring "BEGIN"
0003 opt_send_without_block <callinfo!mid:puts, argc:1, FCALL|ARGS_SIMPLE>, <callcache>
0006 pop
0007 putself ( 12)[Li]
0008 putstring "END"
0010 opt_send_without_block <callinfo!mid:puts, argc:1, FCALL|ARGS_SIMPLE>, <callcache>
0013 leave
```
The interesting line here is:
```
catch type: rescue st: 11022376 ed: 11022516 sp: -002 cont: 0000
```
As the instruction corresponding the `begin..rescue` block were optimized away, the `sp` filed of the continue label was still -1 (or -2) and `position`s of start, end and continue labels are never initialized. When any exception happens in the remaining code (requires a bit more complex reproducer, happens in real life), this may cause an interpreter to segfault.
I've discovered this issue when building net-scp gem, which has this `if false; require` pattern in its Rakefile: https://github.com/net-ssh/net-scp/blob/v2.0.0/Rakefile . Interpreter reproducibly segfaults when trying to run it on my MIPS32 LE machine.
---Files--------------------------------
ruby-2.5.5-alt-fix-crash-on-mipsel.patch (372 Bytes)
--
https://bugs.ruby-lang.org/
next prev parent reply other threads:[~2019-09-26 13:22 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <redmine.issue-16184.20190926131823@ruby-lang.org>
2019-09-26 13:18 ` [ruby-core:95105] [Ruby master Bug#16184] Entry persists in catch table even though its labels were removed, which may cause [BUG] iv
2019-09-26 13:22 ` iv [this message]
2019-09-26 15:50 ` [ruby-core:95113] " XrXr
2019-09-27 9:01 ` [ruby-core:95128] " nobu
2019-09-27 9:30 ` [ruby-core:95129] " iv
2019-09-27 9:33 ` [ruby-core:95130] " iv
2019-09-27 10:05 ` [ruby-core:95131] " iv
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.ruby-lang.org/en/community/mailing-lists/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=redmine.journal-81740.20190926132244.9e5039627b68ecef@ruby-lang.org \
--to=ruby-core@ruby-lang.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).