diff options
author | Christian Duerr <contact@christianduerr.com> | 2021-05-28 11:00:37 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-28 11:00:37 +0000 |
commit | 3e867a056018c507d79396cb5c5b4b8309c609c2 (patch) | |
tree | 55464f2ff6791c348808750b89a73445343d7645 /alacritty_terminal/src/term/mod.rs | |
parent | 3c61e075fef7b02ae0d043e4a4e664b8bc7221e9 (diff) | |
download | r-alacritty-3e867a056018c507d79396cb5c5b4b8309c609c2.tar.gz r-alacritty-3e867a056018c507d79396cb5c5b4b8309c609c2.tar.bz2 r-alacritty-3e867a056018c507d79396cb5c5b4b8309c609c2.zip |
Fix crashes with cut-off fullwidth characters
There's a few places in Alacritty where it was assumed that after a
WIDE_CHAR cell, there'd always be a WIDE_CHAR_SPACER. However since
resizes in the alternate screen buffer do not reflow any content, it's
possible to have a WIDE_CHAR without any WIDE_CHAR_SPACER right behind
it.
This patch changes these instances to be more defensive about accepting
potentially unreasonable input data caused by alt screen resizes.
Fixes #5185.
Fixes #5170.
Diffstat (limited to 'alacritty_terminal/src/term/mod.rs')
-rw-r--r-- | alacritty_terminal/src/term/mod.rs | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/alacritty_terminal/src/term/mod.rs b/alacritty_terminal/src/term/mod.rs index 2fb4da34..256f2f29 100644 --- a/alacritty_terminal/src/term/mod.rs +++ b/alacritty_terminal/src/term/mod.rs @@ -699,7 +699,9 @@ impl<T> Term<T> { point.column = Column(1); point.line += 1; }, - Direction::Right if flags.contains(Flags::WIDE_CHAR) => point.column += 1, + Direction::Right if flags.contains(Flags::WIDE_CHAR) => { + point.column = min(point.column + 1, self.last_column()); + }, Direction::Left if flags.intersects(Flags::WIDE_CHAR | Flags::WIDE_CHAR_SPACER) => { if flags.contains(Flags::WIDE_CHAR_SPACER) { point.column -= 1; @@ -774,7 +776,7 @@ impl<T> Term<T> { // Remove wide char and spacer. let wide = cursor_cell.flags.contains(Flags::WIDE_CHAR); let point = self.grid.cursor.point; - if wide { + if wide && point.column + 1 < self.columns() { self.grid[point.line][point.column + 1].flags.remove(Flags::WIDE_CHAR_SPACER); } else { self.grid[point.line][point.column - 1].clear_wide(); |