diff options
| author | Chris Webb <chris@arachsys.com> | 2023-08-15 16:22:39 +0100 |
|---|---|---|
| committer | Chris Webb <chris@arachsys.com> | 2023-08-15 16:22:39 +0100 |
| commit | 491d4d47aefb28e92b9e0ab1459751aba083b834 (patch) | |
| tree | b89e9f7991a23cdd9be7767285f49e457b64213a /src | |
| parent | 6942a4c0c9428a9e2ddb65de3969d2dcb5c5eb2f (diff) | |
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().
Diffstat (limited to 'src')
| -rw-r--r-- | src/highlighters.cc | 8 |
1 files changed, 7 insertions, 1 deletions
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<RegionHighlighter>(std::move(delegate)); } |
