Skip to content

Commit

Permalink
fix(ts): escape lang when loading parsers (#16668)
Browse files Browse the repository at this point in the history
When trying to load a language parser, escape the value of
the language.

With language injection, the language might be picked up from the
buffer. If this value is erroneous it can cause `nvim_get_runtime_file`
to hard error.

E.g., the markdown expression `~~~{` will extract '{' as a language and
then try to get the parser using `parser/{*` as the pattern.
  • Loading branch information
lewis6991 authored Jan 27, 2022
1 parent 2320f70 commit f9080b2
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 1 deletion.
2 changes: 1 addition & 1 deletion runtime/lua/vim/treesitter/language.lua
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ function M.require_language(lang, path, silent)
return true
end
if path == nil then
local fname = 'parser/' .. lang .. '.*'
local fname = 'parser/' .. vim.fn.fnameescape(lang) .. '.*'
local paths = a.nvim_get_runtime_file(fname, false)
if #paths == 0 then
if silent then
Expand Down
15 changes: 15 additions & 0 deletions test/functional/treesitter/parser_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -666,6 +666,21 @@ int x = INT_MAX;
-- READ_STRING_OK(x, y) (char_u *)read_string((x), (size_t)(y))
}, get_ranges())
end)

it("should not inject bad languages", function()
if helpers.pending_win32(pending) then return end
exec_lua([=[
vim.treesitter.add_directive("inject-bad!", function(match, _, _, pred, metadata)
metadata.language = "{"
metadata.combined = true
metadata.content = pred[2]
end)
parser = vim.treesitter.get_parser(0, "c", {
injections = {
c = "(preproc_function_def value: ((preproc_arg) @_a (#inject-bad! @_a)))"}})
]=])
end)
end)

describe("when using the offset directive", function()
Expand Down

0 comments on commit f9080b2

Please sign in to comment.