mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00:00 
			
		
		
		
	fix(api): handle NUL in nvim_err_write() and nvim_out_write() (#25354)
This commit is contained in:
		@@ -1709,6 +1709,8 @@ static void write_msg(String message, bool to_err, bool writeln)
 | 
			
		||||
    msg_didout = true; \
 | 
			
		||||
    kv_drop(line_buf, kv_size(line_buf)); \
 | 
			
		||||
    kv_resize(line_buf, LINE_BUFFER_MIN_SIZE); \
 | 
			
		||||
  } else if (c == NUL) { \
 | 
			
		||||
    kv_push(line_buf, NL); \
 | 
			
		||||
  } else { \
 | 
			
		||||
    kv_push(line_buf, c); \
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -2053,6 +2053,19 @@ describe('API', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  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()
 | 
			
		||||
      exec([[
 | 
			
		||||
        set more
 | 
			
		||||
@@ -2073,14 +2086,7 @@ describe('API', function()
 | 
			
		||||
      eq('\naaa\n' .. ('a'):rep(5002) .. '\naaa', meths.get_var('out'))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('blank line in message works', 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},
 | 
			
		||||
      })
 | 
			
		||||
    it('blank line in message', function()
 | 
			
		||||
      feed([[:call nvim_out_write("\na\n")<CR>]])
 | 
			
		||||
      screen:expect{grid=[[
 | 
			
		||||
                                                |
 | 
			
		||||
@@ -2105,6 +2111,20 @@ describe('API', function()
 | 
			
		||||
        {1:Press ENTER or type command to continue}^ |
 | 
			
		||||
      ]]}
 | 
			
		||||
    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)
 | 
			
		||||
 | 
			
		||||
  describe('nvim_err_write', function()
 | 
			
		||||
@@ -2193,6 +2213,20 @@ describe('API', function()
 | 
			
		||||
      ]])
 | 
			
		||||
      feed('<cr>')  -- exit the press ENTER screen
 | 
			
		||||
    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)
 | 
			
		||||
 | 
			
		||||
  describe('nvim_err_writeln', function()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user