fix(ts): escape lang when loading parsers (#16668)

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.
This commit is contained in:
Lewis Russell 2022-01-27 09:42:59 +00:00 committed by GitHub
parent 2320f705c4
commit f9080b24c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 1 deletions

View File

@ -14,7 +14,7 @@ function M.require_language(lang, path, silent)
return true return true
end end
if path == nil then if path == nil then
local fname = 'parser/' .. lang .. '.*' local fname = 'parser/' .. vim.fn.fnameescape(lang) .. '.*'
local paths = a.nvim_get_runtime_file(fname, false) local paths = a.nvim_get_runtime_file(fname, false)
if #paths == 0 then if #paths == 0 then
if silent then if silent then

View File

@ -666,6 +666,21 @@ int x = INT_MAX;
-- READ_STRING_OK(x, y) (char_u *)read_string((x), (size_t)(y)) -- READ_STRING_OK(x, y) (char_u *)read_string((x), (size_t)(y))
}, get_ranges()) }, get_ranges())
end) 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) end)
describe("when using the offset directive", function() describe("when using the offset directive", function()