diff --git a/src/nvim/message.c b/src/nvim/message.c index 642513b4e2..21f477fb91 100644 --- a/src/nvim/message.c +++ b/src/nvim/message.c @@ -2011,6 +2011,11 @@ void msg_prt_line(const char *s, bool list) } else { hl_id = 0; int c = (uint8_t)(*s++); + if (c >= 0x80) { // Illegal byte + col += utf_char2cells(c); + msg_putchar(c); + continue; + } sc_extra = NUL; sc_final = NUL; if (list) { diff --git a/test/functional/ex_cmds/print_commands_spec.lua b/test/functional/ex_cmds/print_commands_spec.lua index 8c164fd41b..2ce7eb48ea 100644 --- a/test/functional/ex_cmds/print_commands_spec.lua +++ b/test/functional/ex_cmds/print_commands_spec.lua @@ -1,7 +1,9 @@ local t = require('test.testutil') local n = require('test.functional.testnvim')() +local Screen = require('test.functional.ui.screen') local clear, eq, command, fn = n.clear, t.eq, n.command, n.fn +local assert_alive = n.assert_alive describe(':z^', function() before_each(clear) @@ -11,3 +13,20 @@ describe(':z^', function() eq(1, fn.line('.')) end) end) + +describe(':print', function() + before_each(clear) + + it('does not crash when printing 0xFF byte #34044', function() + local screen = Screen.new() + -- Needs raw 0xFF byte, not 0xFF char + command('call setline(1, "foo\\xFFbar")') + command('%print') + screen:expect([[ + ^foo{18:}bar | + {1:~ }|*12 + fooÿbar | + ]]) + assert_alive() + end) +end)