diff options
| author | Maxime Coste <mawww@kakoune.org> | 2018-03-11 11:40:26 +1100 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2018-03-11 11:44:10 +1100 |
| commit | e66073bc94cad6c13c2f6c35d5e3d794f6a00a2c (patch) | |
| tree | 32a55174b5cc140256a085e54fcff6b6a1948841 /src | |
| parent | 4584ecac776492cfff1b48a5c47099eb470b5c50 (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.cc | 8 |
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); |
