From e66073bc94cad6c13c2f6c35d5e3d794f6a00a2c Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Sun, 11 Mar 2018 11:40:26 +1100 Subject: Detect infinit recursion in reference highlighting Reference highlighters allow for potential mutual recursion between highlighters. This is usually fine, but if the recursion happens on the same buffer range, it means we will recurse infinitely. Fixes #1920 --- src/highlighters.cc | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src') diff --git a/src/highlighters.cc b/src/highlighters.cc index 41953aa4..864c7449 100644 --- a/src/highlighters.cc +++ b/src/highlighters.cc @@ -1581,6 +1581,14 @@ struct ReferenceHighlighter : Highlighter private: void do_highlight(HighlightContext context, DisplayBuffer& display_buffer, BufferRange range) override { + static Vector> running_refs; + const std::pair desc{m_name, range}; + if (contains(running_refs, desc)) + return write_to_debug_buffer(format("highlighting recursion detected with ref to {}", m_name)); + + running_refs.push_back(desc); + auto pop_desc = on_scope_end([] { running_refs.pop_back(); }); + try { DefinedHighlighters::instance().get_child(m_name).highlight(context, display_buffer, range); -- cgit v1.2.3