summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2018-03-11 11:40:26 +1100
committerMaxime Coste <mawww@kakoune.org>2018-03-11 11:44:10 +1100
commite66073bc94cad6c13c2f6c35d5e3d794f6a00a2c (patch)
tree32a55174b5cc140256a085e54fcff6b6a1948841 /src
parent4584ecac776492cfff1b48a5c47099eb470b5c50 (diff)
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
Diffstat (limited to 'src')
-rw-r--r--src/highlighters.cc8
1 files changed, 8 insertions, 0 deletions
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<std::pair<StringView, BufferRange>> running_refs;
+ const std::pair<StringView, BufferRange> 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);