From 0804034c07ad5883bc653d054e549a87d429a8b7 Mon Sep 17 00:00:00 2001 From: Tyler Miller Date: Tue, 1 Aug 2023 08:28:28 -0700 Subject: fix(loader): cache path ambiguity #24491 Problem: cache paths are derived by replacing each reserved/filesystem- path-sensitive char with a `%` char in the original path. With this method, two different files at two different paths (each containing `%` chars) can erroneously resolve to the very same cache path in certain edge-cases. Solution: derive cache paths by url-encoding the original (path) instead using `vim.uri_encode()` with `"rfc2396"`. Increment `Loader.VERSION` to denote this change. --- test/functional/lua/loader_spec.lua | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'test/functional/lua/loader_spec.lua') diff --git a/test/functional/lua/loader_spec.lua b/test/functional/lua/loader_spec.lua index e2958d1592..34c36b04ef 100644 --- a/test/functional/lua/loader_spec.lua +++ b/test/functional/lua/loader_spec.lua @@ -33,4 +33,24 @@ describe('vim.loader', function() return _G.TEST ]], tmp)) end) + + it('handles % signs in modpath (#24491)', function() + exec_lua[[ + vim.loader.enable() + ]] + + local tmp1, tmp2 = (function (t) + assert(os.remove(t)) + assert(helpers.mkdir(t)) + assert(helpers.mkdir(t .. '/%')) + return t .. '/%/x', t .. '/%%x' + end)(helpers.tmpname()) + + helpers.write_file(tmp1, 'return 1', true) + helpers.write_file(tmp2, 'return 2', true) + vim.uv.fs_utime(tmp1, 0, 0) + vim.uv.fs_utime(tmp2, 0, 0) + eq(1, exec_lua('return loadfile(...)()', tmp1)) + eq(2, exec_lua('return loadfile(...)()', tmp2)) + end) end) -- cgit