From 491d4d47aefb28e92b9e0ab1459751aba083b834 Mon Sep 17 00:00:00 2001 From: Chris Webb Date: Tue, 15 Aug 2023 16:22:39 +0100 Subject: [PATCH] Fix segfault when adding an invalid default-region highlighter RegionsHighlighter::create_region() validates the highlighter type argument but RegionsHighlighter::create_default_region() assumes it is correct, segfaulting from dereferencing a null pointer if the given type isn't in the highlighter registry HashMap. @PJungkamp reported this in https://github.com/mawww/kakoune/issues/4959 with a simple recipe to reproduce: :add-highlighter shared/test regions :add-highlighter shared/test/ default-region invalid highlighter :add-highlighter window/test ref test Validate the type argument in RegionsHighlighter::create_default_region() in the same way as RegionsHighlighter::create_region(). --- src/highlighters.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/highlighters.cc b/src/highlighters.cc index 65f801cb..6f6d6e30 100644 --- a/src/highlighters.cc +++ b/src/highlighters.cc @@ -2044,7 +2044,13 @@ public: static const ParameterDesc param_desc{ {}, ParameterDesc::Flags::SwitchesOnlyAtStart, 1 }; ParametersParser parser{params, param_desc}; - auto delegate = HighlighterRegistry::instance()[parser[0]].factory(parser.positionals_from(1), nullptr); + const auto& type = parser[0]; + auto& registry = HighlighterRegistry::instance(); + auto it = registry.find(type); + if (it == registry.end()) + throw runtime_error(format("no such highlighter type: '{}'", type)); + + auto delegate = it->value.factory(parser.positionals_from(1), nullptr); return std::make_unique(std::move(delegate)); }