aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZac Pullar-Strecker <zacps@users.noreply.github.com>2018-11-25 10:08:02 +1300
committerGitHub <noreply@github.com>2018-11-25 10:08:02 +1300
commit742a6b48a196cabf65354862548c07d057a28d55 (patch)
treefb9846aa3880eec27627b3ac91535d963390e947
parent0d47cd25b90deecc2dbf40c8361d2310049fdde7 (diff)
downloadalacritty-742a6b48a196cabf65354862548c07d057a28d55.tar.gz
alacritty-742a6b48a196cabf65354862548c07d057a28d55.zip
Fix for an underflow on some type conversions (#1715)
-rw-r--r--CHANGELOG.md4
-rw-r--r--src/term/mod.rs4
-rw-r--r--src/tty/windows.rs6
-rw-r--r--winpty/src/windows.rs4
4 files changed, 12 insertions, 6 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a9fbbfaf..6308d377 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,6 +20,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Extra padding is not evenly spread around the terminal by default anymore
+### Fixed
+
+- Fixed a bad type conversion which could cause underflow on a window resize
+
## Version 0.2.3
### Fixed
diff --git a/src/term/mod.rs b/src/term/mod.rs
index 5107dc2d..193d7188 100644
--- a/src/term/mod.rs
+++ b/src/term/mod.rs
@@ -865,8 +865,8 @@ impl SizeInfo {
let line = Line(y.saturating_sub(self.padding_y as usize) / (self.cell_height as usize));
Point {
- line: min(line, self.lines() - 1),
- col: min(col, self.cols() - 1)
+ line: min(line, Line(self.lines().saturating_sub(1))),
+ col: min(col, Column(self.cols().saturating_sub(1)))
}
}
}
diff --git a/src/tty/windows.rs b/src/tty/windows.rs
index 9a452955..44715b39 100644
--- a/src/tty/windows.rs
+++ b/src/tty/windows.rs
@@ -19,6 +19,7 @@ use std::os::windows::io::{FromRawHandle, IntoRawHandle};
use std::os::windows::fs::OpenOptionsExt;
use std::env;
use std::cell::UnsafeCell;
+use std::u16;
use dunce::canonicalize;
use mio;
@@ -276,8 +277,9 @@ impl<'a> EventedReadWrite for Pty<'a, NamedPipe, NamedPipe> {
impl<'a> OnResize for Winpty<'a> {
fn on_resize(&mut self, sizeinfo: &SizeInfo) {
- if sizeinfo.cols().0 > 0 && sizeinfo.lines().0 > 0 {
- self.set_size(sizeinfo.cols().0, sizeinfo.lines().0)
+ let (cols, lines) = (sizeinfo.cols().0, sizeinfo.lines().0);
+ if cols > 0 && cols <= u16::MAX as usize && lines > 0 && lines <= u16::MAX as usize {
+ self.set_size(cols as u16, lines as u16)
.unwrap_or_else(|_| info!("Unable to set winpty size, did it die?"));
}
}
diff --git a/winpty/src/windows.rs b/winpty/src/windows.rs
index 67370709..84762585 100644
--- a/winpty/src/windows.rs
+++ b/winpty/src/windows.rs
@@ -201,12 +201,12 @@ impl<'a, 'b> Winpty<'a> {
/// Change the size of the Windows console window.
///
/// cols & rows MUST be greater than 0
- pub fn set_size(&mut self, cols: usize, rows: usize) -> Result<(), Err> {
+ pub fn set_size(&mut self, cols: u16, rows: u16) -> Result<(), Err> {
assert!(cols > 0 && rows > 0);
let mut err = null_mut() as *mut winpty_error_t;
unsafe {
- winpty_set_size(self.0, cols as i32, rows as i32, &mut err);
+ winpty_set_size(self.0, i32::from(cols), i32::from(rows), &mut err);
}
if let Some(err) = check_err(err) {