Skip to content

Commit 9de4972

Browse files
authored
Merge pull request rails#52978 from intrip/fix-infinite-loop-for-dependency-with-non-trailing-interpolation
Fix infinite loop computing ERB dependencies with non-trailing interpolations
2 parents 6360b73 + 773d640 commit 9de4972

File tree

2 files changed

+30
-15
lines changed

2 files changed

+30
-15
lines changed

actionview/lib/action_view/dependency_tracker/erb_tracker.rb

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -122,23 +122,26 @@ def add_static_dependency(dependencies, dependency, quote_type)
122122
wildcard_dependency = +""
123123

124124
while !scanner.eos?
125-
next unless scanner.scan_until(/\#{/)
126-
127-
unmatched_brackets = 1
128-
wildcard_dependency << scanner.pre_match
129-
130-
while unmatched_brackets > 0 && !scanner.eos?
131-
scanner.scan_until(/[{}]/)
132-
133-
case scanner.matched
134-
when "{"
135-
unmatched_brackets += 1
136-
when "}"
137-
unmatched_brackets -= 1
125+
if scanner.scan_until(/\#{/)
126+
unmatched_brackets = 1
127+
wildcard_dependency << scanner.pre_match
128+
129+
while unmatched_brackets > 0 && !scanner.eos?
130+
scanner.scan_until(/[{}]/)
131+
132+
case scanner.matched
133+
when "{"
134+
unmatched_brackets += 1
135+
when "}"
136+
unmatched_brackets -= 1
137+
end
138138
end
139-
end
140139

141-
wildcard_dependency << "*"
140+
wildcard_dependency << "*"
141+
else
142+
wildcard_dependency << scanner.rest
143+
scanner.terminate
144+
end
142145
end
143146

144147
dependencies << wildcard_dependency

actionview/test/template/dependency_tracker_test.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,18 @@ def test_dependencies_with_interpolation_are_resolved_with_view_paths
235235

236236
assert_equal ["events/_completed", "events/_event", "events/index"], tracker.dependencies
237237
end
238+
239+
def test_dependencies_with_interpolation_non_trailing
240+
view_paths = ActionView::PathSet.new([File.expand_path("../fixtures/digestor", __dir__)])
241+
242+
template = FakeTemplate.new(%q{
243+
<%= render "#{type}/comments" %>
244+
}, :erb)
245+
246+
tracker = make_tracker("interpolation/_string", template, view_paths)
247+
248+
assert_equal [ "*/comments" ], tracker.dependencies
249+
end
238250
end
239251

240252
class ERBTrackerTest < ActiveSupport::TestCase

0 commit comments

Comments
 (0)