Skip to content

Commit 115eef5

Browse files
committed
Only use WC_ERR_INVALID_CHARS on NT, fall back to 0 flags on incompatible versions of Windows
Fixes #18
1 parent b11b862 commit 115eef5

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

library/std/src/sys/pal/windows/stdio.rs

+37
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,10 @@ fn utf16_to_utf8(utf16: &[u16], utf8: &mut [u8]) -> io::Result<usize> {
378378
return Ok(0);
379379
}
380380

381+
#[cfg(target_vendor = "rust9x")]
382+
let is_nt = crate::sys::compat::checks::is_windows_nt();
383+
384+
#[cfg(not(target_vendor = "rust9x"))]
381385
let result = unsafe {
382386
c::WideCharToMultiByte(
383387
c::CP_UTF8, // CodePage
@@ -390,6 +394,39 @@ fn utf16_to_utf8(utf16: &[u16], utf8: &mut [u8]) -> io::Result<usize> {
390394
ptr::null_mut(), // lpUsedDefaultChar
391395
)
392396
};
397+
398+
#[cfg(target_vendor = "rust9x")]
399+
let result = {
400+
let mut result = unsafe {
401+
c::WideCharToMultiByte(
402+
c::CP_UTF8, // CodePage
403+
if is_nt { c::WC_ERR_INVALID_CHARS } else { 0 }, // dwFlags
404+
utf16.as_ptr(), // lpWideCharStr
405+
utf16.len() as i32, // cchWideChar
406+
utf8.as_mut_ptr(), // lpMultiByteStr
407+
utf8.len() as i32, // cbMultiByte
408+
ptr::null(), // lpDefaultChar
409+
ptr::null_mut(), // lpUsedDefaultChar
410+
)
411+
};
412+
413+
if result == 0 && unsafe { c::GetLastError() } == c::ERROR_INVALID_FLAGS && is_nt {
414+
result = unsafe {
415+
c::WideCharToMultiByte(
416+
c::CP_UTF8, // CodePage
417+
0, // dwFlags (0 for pre-Vista compatibility)
418+
utf16.as_ptr(), // lpWideCharStr
419+
utf16.len() as i32, // cchWideChar
420+
utf8.as_mut_ptr(), // lpMultiByteStr
421+
utf8.len() as i32, // cbMultiByte
422+
ptr::null(), // lpDefaultChar
423+
ptr::null_mut(), // lpUsedDefaultChar
424+
)
425+
};
426+
}
427+
result
428+
};
429+
393430
if result == 0 {
394431
// We can't really do any better than forget all data and return an error.
395432
Err(io::const_io_error!(

0 commit comments

Comments
 (0)