summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortmm1 <tmm1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-12-09 10:06:49 +0000
committertmm1 <tmm1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-12-09 10:06:49 +0000
commita1119230621d3ab26e93466a6838be42aaa83307 (patch)
tree3bc13f67b313268a7d7a1e15c108eb40e995e3c3
parent5dc77048a3854a74113c62f2d942f3a45d9ad9bf (diff)
hash.c: fix segv in Hash#replace
* hash.c (rb_hash_replace): fix segv on `{}.replace({})` introduced in r44060 [Bug #9230] [ruby-core:58991] * test/ruby/test_hash.rb: regression test for above git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44096 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog6
-rw-r--r--hash.c2
-rw-r--r--test/ruby/test_hash.rb10
3 files changed, 17 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 7801aae..87dc95d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Mon Dec 9 18:50:43 2013 Aman Gupta <ruby@tmm1.net>
+
+ * hash.c (rb_hash_replace): fix segv on `{}.replace({})` introduced
+ in r44060 [Bug #9230] [ruby-core:58991]
+ * test/ruby/test_hash.rb: regression test for above
+
Mon Dec 9 18:10:10 2013 Koichi Sasada <ko1@atdot.net>
* vm.c (vm_stat): renamed from ruby_vm_stat.
diff --git a/hash.c b/hash.c
index 53d70f9..a694477 100644
--- a/hash.c
+++ b/hash.c
@@ -1414,7 +1414,7 @@ rb_hash_replace(VALUE hash, VALUE hash2)
table2 = RHASH(hash2)->ntbl;
rb_hash_clear(hash);
- hash_tbl(hash)->type = table2->type;
+ if (table2) hash_tbl(hash)->type = table2->type;
rb_hash_foreach(hash2, replace_i, hash);
return hash;
diff --git a/test/ruby/test_hash.rb b/test/ruby/test_hash.rb
index 0593785..afb0ca4 100644
--- a/test/ruby/test_hash.rb
+++ b/test/ruby/test_hash.rb
@@ -592,6 +592,16 @@ class TestHash < Test::Unit::TestCase
assert_nil(h[2])
end
+ def test_replace_bug9230
+ h = @cls[]
+ h.replace(@cls[])
+ assert_empty h
+
+ h = @cls[]
+ h.replace(@cls[].compare_by_identity)
+ assert_predicate(h, :compare_by_identity?)
+ end
+
def test_shift
h = @h.dup