Skip to content

Commit

Permalink
Rollup merge of #112154 - ShaneEverittM:zero-len-utf16, r=thomcc
Browse files Browse the repository at this point in the history
Fix bug in utf16_to_utf8 for zero length strings

This fixes the behavior of sending EOF by pressing Ctrl+Z => Enter in a windows console.

Previously, that would trip the unpaired surrogate error, whereas now we correctly detect EOF.
  • Loading branch information
matthiaskrgr authored Jun 1, 2023
2 parents ae106cf + 1293c17 commit 953f849
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 0 deletions.
7 changes: 7 additions & 0 deletions library/std/src/sys/windows/stdio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ use crate::sys::cvt;
use crate::sys::handle::Handle;
use core::str::utf8_char_width;

#[cfg(test)]
mod tests;

// Don't cache handles but get them fresh for every read/write. This allows us to track changes to
// the value over time (such as if a process calls `SetStdHandle` while it's running). See #40490.
pub struct Stdin {
Expand Down Expand Up @@ -383,6 +386,10 @@ fn utf16_to_utf8(utf16: &[u16], utf8: &mut [u8]) -> io::Result<usize> {
debug_assert!(utf16.len() <= c::c_int::MAX as usize);
debug_assert!(utf8.len() <= c::c_int::MAX as usize);

if utf16.is_empty() {
return Ok(0);
}

let result = unsafe {
c::WideCharToMultiByte(
c::CP_UTF8, // CodePage
Expand Down
6 changes: 6 additions & 0 deletions library/std/src/sys/windows/stdio/tests.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
use super::utf16_to_utf8;

#[test]
fn zero_size_read() {
assert_eq!(utf16_to_utf8(&[], &mut []).unwrap(), 0);
}

0 comments on commit 953f849

Please sign in to comment.