Skip to content

Commit f10dd5a

Browse files
authored
Merge branch 'master' into rwstauner/dw_form_ref_addr
2 parents f813cf9 + 3a2434c commit f10dd5a

4 files changed

Lines changed: 36 additions & 4 deletions

File tree

NEWS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ releases.
119119
* 4.0.3 to [v4.0.4][RubyGems-v4.0.4], [v4.0.5][RubyGems-v4.0.5], [v4.0.6][RubyGems-v4.0.6], [v4.0.7][RubyGems-v4.0.7], [v4.0.8][RubyGems-v4.0.8], [v4.0.9][RubyGems-v4.0.9], [v4.0.10][RubyGems-v4.0.10], [v4.0.11][RubyGems-v4.0.11], [v4.0.12][RubyGems-v4.0.12], [v4.0.13][RubyGems-v4.0.13], [v4.0.14][RubyGems-v4.0.14], [v4.0.15][RubyGems-v4.0.15], [v4.0.16][RubyGems-v4.0.16]
120120
* bundler 4.1.0.dev
121121
* 4.0.3 to [v4.0.4][bundler-v4.0.4], [v4.0.5][bundler-v4.0.5], [v4.0.6][bundler-v4.0.6], [v4.0.7][bundler-v4.0.7], [v4.0.8][bundler-v4.0.8], [v4.0.9][bundler-v4.0.9], [v4.0.10][bundler-v4.0.10], [v4.0.11][bundler-v4.0.11], [v4.0.12][bundler-v4.0.12], [v4.0.13][bundler-v4.0.13], [v4.0.14][bundler-v4.0.14], [v4.0.15][bundler-v4.0.15], [v4.0.16][bundler-v4.0.16]
122-
* erb 6.0.4
122+
* erb 6.0.5
123123
* 6.0.1 to [v6.0.1.1][erb-v6.0.1.1], [v6.0.2][erb-v6.0.2], [v6.0.3][erb-v6.0.3], [v6.0.4][erb-v6.0.4]
124124
* error_highlight 0.7.2
125125
* ipaddr 1.2.9

lib/erb.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -778,6 +778,9 @@
778778
# [template processor]: https://en.wikipedia.org/wiki/Template_processor
779779
#
780780
class ERB
781+
IDENTITY_METHOD = BasicObject.instance_method(:equal?) # :nodoc:
782+
private_constant :IDENTITY_METHOD
783+
781784
# :markup: markdown
782785
#
783786
# :call-seq:
@@ -1007,7 +1010,7 @@ def run(b=new_toplevel)
10071010
# [local binding]: rdoc-ref:ERB@Local+Binding
10081011
#
10091012
def result(b=new_toplevel)
1010-
unless @_init.equal?(self.class.singleton_class)
1013+
unless initialized_by_new?
10111014
raise ArgumentError, "not initialized"
10121015
end
10131016
eval(@src, b, (@filename || '(erb)'), @lineno)
@@ -1061,6 +1064,11 @@ def new_toplevel(vars = nil)
10611064
end
10621065
private :new_toplevel
10631066

1067+
def initialized_by_new? # :nodoc:
1068+
IDENTITY_METHOD.bind_call(@_init, self.class.singleton_class)
1069+
end
1070+
private :initialized_by_new?
1071+
10641072
# :markup: markdown
10651073
#
10661074
# :call-seq:
@@ -1087,7 +1095,7 @@ def new_toplevel(vars = nil)
10871095
# ```
10881096
#
10891097
def def_method(mod, methodname, fname='(ERB)')
1090-
unless @_init.equal?(self.class.singleton_class)
1098+
unless initialized_by_new?
10911099
raise ArgumentError, "not initialized"
10921100
end
10931101
src = self.src.sub(/^(?!#|$)/) {"def #{methodname}\n"} << "\nend\n"

lib/erb/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# frozen_string_literal: true
22
class ERB
33
# The string \ERB version.
4-
VERSION = '6.0.4'
4+
VERSION = '6.0.5'
55
end

test/erb/test_erb.rb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,24 @@ def test_concurrent_default_binding
8585
end
8686

8787
class TestERBCore < Test::Unit::TestCase
88+
class AlwaysEqual
89+
def equal?(_other)
90+
true
91+
end
92+
end
93+
8894
def setup
8995
@erb = ERB
9096
end
9197

98+
def marshal_loaded_erb(init, src: "")
99+
erb = ERB.allocate
100+
erb.instance_variable_set(:@src, src)
101+
erb.instance_variable_set(:@lineno, 1)
102+
erb.instance_variable_set(:@_init, init)
103+
Marshal.load(Marshal.dump(erb))
104+
end
105+
92106
def test_version
93107
assert_equal(String, @erb.version.class)
94108
end
@@ -664,6 +678,11 @@ def test_prohibited_marshal_load
664678
assert_raise(ArgumentError) {erb.result}
665679
end
666680

681+
def test_prohibited_marshal_load_result_with_overridden_equal
682+
erb = marshal_loaded_erb(AlwaysEqual.new, src: "raise 'unreachable'")
683+
assert_raise(ArgumentError) {erb.result}
684+
end
685+
667686
def test_prohibited_marshal_load_def_method
668687
erb = ERB.allocate
669688
erb.instance_variable_set(:@src, "")
@@ -673,6 +692,11 @@ def test_prohibited_marshal_load_def_method
673692
assert_raise(ArgumentError) {erb.def_method(Class.new, 'render')}
674693
end
675694

695+
def test_prohibited_marshal_load_def_method_with_overridden_equal
696+
erb = marshal_loaded_erb(AlwaysEqual.new)
697+
assert_raise(ArgumentError) {erb.def_method(Class.new, 'render')}
698+
end
699+
676700
def test_prohibited_marshal_load_def_module
677701
erb = ERB.allocate
678702
erb.instance_variable_set(:@src, "")

0 commit comments

Comments
 (0)