Skip to content

Commit bd80a53

Browse files
committed
Further simplify Windows stdout/stderr
This makes it output as much valid UTF-8 as it can then return failure.
1 parent 6993939 commit bd80a53

File tree

1 file changed

+8
-13
lines changed

1 file changed

+8
-13
lines changed

src/libstd/sys/windows/stdio.rs

+8-13
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use prelude::v1::*;
1414
use io::prelude::*;
1515

16+
use cmp;
1617
use io::{self, Cursor};
1718
use ptr;
1819
use str;
@@ -69,19 +70,13 @@ fn write(out: &Output, data: &[u8]) -> io::Result<usize> {
6970
// [1]: https://tahoe-lafs.org/trac/tahoe-lafs/ticket/1232
7071
// [2]: http://www.mail-archive.com/[email protected]/msg00661.html
7172
const OUT_MAX: usize = 8192;
72-
let (utf16, data_len) = match str::from_utf8(data).ok() {
73-
Some(mut utf8) => {
74-
if utf8.len() > OUT_MAX {
75-
let mut new_len = OUT_MAX;
76-
while !utf8.is_char_boundary(new_len) {
77-
new_len -= 1;
78-
}
79-
utf8 = &utf8[..new_len];
80-
}
81-
(utf8.encode_utf16().collect::<Vec<u16>>(), utf8.len())
82-
}
83-
None => return Err(invalid_encoding()),
73+
let len = cmp::min(data.len(), OUT_MAX);
74+
let utf8 = match str::from_utf8(&data[..len]) {
75+
Ok(s) => s,
76+
Err(ref e) if e.valid_up_to() == 0 => return Err(invalid_encoding()),
77+
Err(e) => str::from_utf8(&data[..e.valid_up_to()]).unwrap(),
8478
};
79+
let utf16 = utf8.encode_utf16().collect::<Vec<u16>>();
8580
let mut written = 0;
8681
try!(cvt(unsafe {
8782
c::WriteConsoleW(handle,
@@ -94,7 +89,7 @@ fn write(out: &Output, data: &[u8]) -> io::Result<usize> {
9489
// FIXME if this only partially writes the utf16 buffer then we need to
9590
// figure out how many bytes of `data` were actually written
9691
assert_eq!(written as usize, utf16.len());
97-
Ok(data_len)
92+
Ok(utf8.len())
9893
}
9994

10095
impl Stdin {

0 commit comments

Comments
 (0)