1313use prelude:: v1:: * ;
1414use io:: prelude:: * ;
1515
16+ use cmp;
1617use io:: { self , Cursor } ;
1718use ptr;
1819use 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
10095impl Stdin {
0 commit comments