mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Stop reading past the end of ivptr array
If you have code like this:
```ruby
class A
def initialize
@a = nil
@b = nil
@c = nil
@d = nil
@e = nil
end
end
x = A.new
y = x.clone
100.times { |z| x.instance_variable_set(:"@foo#{z}", nil) }
puts y.inspect
```
`x` and `y` will share `iv_index_tbl` hashes. However, the size of the
hash will grow larger than the number if entries in `ivptr` in `y`.
Before this commit, `rb_ivar_count` would use the size of the hash to
determine how far to read in to the array, but this means that it could
read past the end of the array and cause the program to segv
[ruby-core:78403]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56938 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
716610ae56
commit
e04167bc32
1 changed files with 1 additions and 1 deletions
|
|
@ -1619,7 +1619,7 @@ rb_ivar_count(VALUE obj)
|
|||
switch (BUILTIN_TYPE(obj)) {
|
||||
case T_OBJECT:
|
||||
if ((tbl = ROBJECT_IV_INDEX_TBL(obj)) != 0) {
|
||||
st_index_t i, count, num = tbl->num_entries;
|
||||
st_index_t i, count, num = ROBJECT_NUMIV(obj);
|
||||
const VALUE *const ivptr = ROBJECT_IVPTR(obj);
|
||||
for (i = count = 0; i < num; ++i) {
|
||||
if (ivptr[i] != Qundef) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue