diff options
author | bfredl <bjorn.linse@gmail.com> | 2025-01-07 11:16:53 +0100 |
---|---|---|
committer | bfredl <bjorn.linse@gmail.com> | 2025-01-09 11:22:00 +0100 |
commit | f8c8a245aa5bdfc2092f7e910a2d4ce798cd188e (patch) | |
tree | cf7a19a9182275e4c49b4f5850047146ad453124 | |
parent | 3f0adf90debb35b5a937480151a659d654106ff6 (diff) | |
download | rneovim-f8c8a245aa5bdfc2092f7e910a2d4ce798cd188e.tar.gz rneovim-f8c8a245aa5bdfc2092f7e910a2d4ce798cd188e.tar.bz2 rneovim-f8c8a245aa5bdfc2092f7e910a2d4ce798cd188e.zip |
fix(terminal): don't crash on unprintable chars
fixes #31897
-rw-r--r-- | src/nvim/vterm/screen.c | 2 | ||||
-rw-r--r-- | test/functional/terminal/buffer_spec.lua | 13 |
2 files changed, 14 insertions, 1 deletions
diff --git a/src/nvim/vterm/screen.c b/src/nvim/vterm/screen.c index f24e47e543..c91c6fb84f 100644 --- a/src/nvim/vterm/screen.c +++ b/src/nvim/vterm/screen.c @@ -909,7 +909,7 @@ int vterm_screen_get_cell(const VTermScreen *screen, VTermPos pos, VTermScreenCe return 0; } - cell->schar = intcell->schar; + cell->schar = (intcell->schar == (uint32_t)-1) ? 0 : intcell->schar; cell->attrs.bold = intcell->pen.bold; cell->attrs.underline = intcell->pen.underline; diff --git a/test/functional/terminal/buffer_spec.lua b/test/functional/terminal/buffer_spec.lua index b6de687af9..cc807ba555 100644 --- a/test/functional/terminal/buffer_spec.lua +++ b/test/functional/terminal/buffer_spec.lua @@ -435,6 +435,19 @@ describe(':terminal buffer', function() ]]) end) + it('handles unprintable chars', function() + local screen = Screen.new(50, 7) + feed 'i' + local chan = api.nvim_open_term(0, {}) + api.nvim_chan_send(chan, '\239\187\191') -- '\xef\xbb\xbf' + screen:expect([[ + {18:<feff>}^ | + |*5 + {5:-- TERMINAL --} | + ]]) + eq('\239\187\191', api.nvim_get_current_line()) + end) + it("handles bell respecting 'belloff' and 'visualbell'", function() local screen = Screen.new(50, 7) local chan = api.nvim_open_term(0, {}) |