fix(api): handle NUL in nvim_err_write() and nvim_out_write()

This commit is contained in:
zeertzjq 2023-09-25 10:34:45 +08:00
parent 9e7c4fe579
commit 49254ddebe
2 changed files with 44 additions and 8 deletions

View File

@ -1709,6 +1709,8 @@ static void write_msg(String message, bool to_err, bool writeln)
msg_didout = true; \ msg_didout = true; \
kv_drop(line_buf, kv_size(line_buf)); \ kv_drop(line_buf, kv_size(line_buf)); \
kv_resize(line_buf, LINE_BUFFER_MIN_SIZE); \ kv_resize(line_buf, LINE_BUFFER_MIN_SIZE); \
} else if (c == NUL) { \
kv_push(line_buf, NL); \
} else { \ } else { \
kv_push(line_buf, c); \ kv_push(line_buf, c); \
} }

View File

@ -2053,6 +2053,19 @@ describe('API', function()
end) end)
describe('nvim_out_write', function() describe('nvim_out_write', function()
local screen
before_each(function()
screen = Screen.new(40, 8)
screen:attach()
screen:set_default_attr_ids({
[0] = {bold = true, foreground = Screen.colors.Blue},
[1] = {bold = true, foreground = Screen.colors.SeaGreen},
[2] = {bold = true, reverse = true},
[3] = {foreground = Screen.colors.Blue},
})
end)
it('prints long messages correctly #20534', function() it('prints long messages correctly #20534', function()
exec([[ exec([[
set more set more
@ -2073,14 +2086,7 @@ describe('API', function()
eq('\naaa\n' .. ('a'):rep(5002) .. '\naaa', meths.get_var('out')) eq('\naaa\n' .. ('a'):rep(5002) .. '\naaa', meths.get_var('out'))
end) end)
it('blank line in message works', function() it('blank line in message', function()
local screen = Screen.new(40, 8)
screen:attach()
screen:set_default_attr_ids({
[0] = {bold = true, foreground = Screen.colors.Blue},
[1] = {bold = true, foreground = Screen.colors.SeaGreen},
[2] = {bold = true, reverse = true},
})
feed([[:call nvim_out_write("\na\n")<CR>]]) feed([[:call nvim_out_write("\na\n")<CR>]])
screen:expect{grid=[[ screen:expect{grid=[[
| |
@ -2105,6 +2111,20 @@ describe('API', function()
{1:Press ENTER or type command to continue}^ | {1:Press ENTER or type command to continue}^ |
]]} ]]}
end) end)
it('NUL bytes in message', function()
feed([[:lua vim.api.nvim_out_write('aaa\0bbb\0\0ccc\nddd\0\0\0eee\n')<CR>]])
screen:expect{grid=[[
|
{0:~ }|
{0:~ }|
{0:~ }|
{2: }|
aaa{3:^@}bbb{3:^@^@}ccc |
ddd{3:^@^@^@}eee |
{1:Press ENTER or type command to continue}^ |
]]}
end)
end) end)
describe('nvim_err_write', function() describe('nvim_err_write', function()
@ -2193,6 +2213,20 @@ describe('API', function()
]]) ]])
feed('<cr>') -- exit the press ENTER screen feed('<cr>') -- exit the press ENTER screen
end) end)
it('NUL bytes in message', function()
nvim_async('err_write', 'aaa\0bbb\0\0ccc\nddd\0\0\0eee\n')
screen:expect{grid=[[
|
{0:~ }|
{0:~ }|
{0:~ }|
{3: }|
{1:aaa^@bbb^@^@ccc} |
{1:ddd^@^@^@eee} |
{2:Press ENTER or type command to continue}^ |
]]}
end)
end) end)
describe('nvim_err_writeln', function() describe('nvim_err_writeln', function()