diff --git a/runtime/ops/tty.rs b/runtime/ops/tty.rs index 4b19fea9a9..5b49e3a248 100644 --- a/runtime/ops/tty.rs +++ b/runtime/ops/tty.rs @@ -351,10 +351,20 @@ fn console_size_from_fd( { return Err(Error::last_os_error()); } - Ok(ConsoleSize { - cols: bufinfo.srWindow.Right as u32 - bufinfo.srWindow.Left as u32 + 1, - rows: bufinfo.srWindow.Bottom as u32 - bufinfo.srWindow.Top as u32 + 1, - }) + + // calculate the size of the visible window + // * use over/under-flow protections b/c MSDN docs only imply that srWindow components are all non-negative + // * ref: @@ + let cols = std::cmp::max( + bufinfo.srWindow.Right as i32 - bufinfo.srWindow.Left as i32 + 1, + 0, + ) as u32; + let rows = std::cmp::max( + bufinfo.srWindow.Bottom as i32 - bufinfo.srWindow.Top as i32 + 1, + 0, + ) as u32; + + Ok(ConsoleSize { cols, rows }) } }