diff options
author | Vipul A M <vipulnsward@gmail.com> | 2014-12-29 18:31:34 +0530 |
---|---|---|
committer | Vipul A M <vipulnsward@gmail.com> | 2014-12-29 18:31:34 +0530 |
commit | 983674667a21ee2e4e6a43282507858634dce907 (patch) | |
tree | 9dc977bf61224ffcaf93a714971c877b72482c9d /activesupport | |
parent | b67b57d47368b4b834cfe8c58d9e26f5c819c154 (diff) | |
download | rails-983674667a21ee2e4e6a43282507858634dce907.tar.gz rails-983674667a21ee2e4e6a43282507858634dce907.tar.bz2 rails-983674667a21ee2e4e6a43282507858634dce907.zip |
When trying to access a character on a string buffer object via `:[]`, if the object being accessed currently returns `html_safe?` as true,
we used to set `@html_safe` variable as true on new object created. When doing something like
x = 'Hello'.html_safe
x[/a/, 1]
would throw an error on ruby 2.2, since when nothign gets matched nil is returned by the code and it tries to set `@html_safe` value to true,
which would error since starting 2.2 nil is frozen.
This change adds a safety net to avoid setting `@html_safe = true` on frozen objects.
Fixes #18235
Diffstat (limited to 'activesupport')
-rw-r--r-- | activesupport/lib/active_support/core_ext/string/output_safety.rb | 4 | ||||
-rw-r--r-- | activesupport/test/safe_buffer_test.rb | 9 |
2 files changed, 12 insertions, 1 deletions
diff --git a/activesupport/lib/active_support/core_ext/string/output_safety.rb b/activesupport/lib/active_support/core_ext/string/output_safety.rb index ba92afd5f4..24d0f9319f 100644 --- a/activesupport/lib/active_support/core_ext/string/output_safety.rb +++ b/activesupport/lib/active_support/core_ext/string/output_safety.rb @@ -150,7 +150,9 @@ module ActiveSupport #:nodoc: else if html_safe? new_safe_buffer = super - new_safe_buffer.instance_variable_set :@html_safe, true + unless new_safe_buffer.respond_to?(:frozen?) && new_safe_buffer.frozen? + new_safe_buffer.instance_variable_set :@html_safe, true + end new_safe_buffer else to_str[*args] diff --git a/activesupport/test/safe_buffer_test.rb b/activesupport/test/safe_buffer_test.rb index efa9d5e61f..fca4b45276 100644 --- a/activesupport/test/safe_buffer_test.rb +++ b/activesupport/test/safe_buffer_test.rb @@ -165,4 +165,13 @@ class SafeBufferTest < ActiveSupport::TestCase x = 'foo %{x} bar'.html_safe % { x: 'qux' } assert x.html_safe?, 'should be safe' end + + test 'Should not affect frozen objects when accessing characters' do + x = 'Hello'.html_safe + assert_nothing_raised do + x[/a/, 1] + end + end + + end |