Skip to content

Commit

Permalink
Fix embedded NULs in C wide strings returned from Windows API (#2264)
Browse files Browse the repository at this point in the history
  • Loading branch information
exactly-one-kas authored Apr 30, 2022
1 parent e7f8858 commit ea09d1d
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 10 deletions.
8 changes: 3 additions & 5 deletions src/platform_impl/windows/monitor.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
use std::{
collections::{BTreeSet, VecDeque},
ffi::OsString,
hash::Hash,
io, mem,
os::windows::prelude::OsStringExt,
ptr,
io, mem, ptr,
};

use windows_sys::Win32::{
Expand All @@ -17,6 +14,7 @@ use windows_sys::Win32::{
},
};

use super::util::decode_wide;
use crate::{
dpi::{PhysicalPosition, PhysicalSize},
monitor::{MonitorHandle as RootMonitorHandle, VideoMode as RootVideoMode},
Expand Down Expand Up @@ -169,7 +167,7 @@ impl MonitorHandle {
pub fn name(&self) -> Option<String> {
let monitor_info = get_monitor_info(self.0).unwrap();
Some(
OsString::from_wide(&monitor_info.szDevice)
decode_wide(&monitor_info.szDevice)
.to_string_lossy()
.to_string(),
)
Expand Down
4 changes: 1 addition & 3 deletions src/platform_impl/windows/raw_input.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
use std::{
ffi::OsString,
mem::{self, size_of},
os::windows::prelude::OsStringExt,
ptr,
};

Expand Down Expand Up @@ -129,7 +127,7 @@ pub fn get_raw_input_device_name(handle: HANDLE) -> Option<String> {

unsafe { name.set_len(minimum_size as _) };

OsString::from_wide(&name).into_string().ok()
util::decode_wide(&name).into_string().ok()
}

pub fn register_raw_input_devices(devices: &[RAWINPUTDEVICE]) -> bool {
Expand Down
12 changes: 10 additions & 2 deletions src/platform_impl/windows/util.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
use std::{
ffi::{c_void, OsStr},
ffi::{c_void, OsStr, OsString},
io,
iter::once,
mem,
ops::BitAnd,
os::windows::prelude::OsStrExt,
os::windows::prelude::{OsStrExt, OsStringExt},
ptr,
sync::atomic::{AtomicBool, Ordering},
};
Expand Down Expand Up @@ -37,6 +37,14 @@ pub fn encode_wide(string: impl AsRef<OsStr>) -> Vec<u16> {
string.as_ref().encode_wide().chain(once(0)).collect()
}

pub fn decode_wide(mut wide_c_string: &[u16]) -> OsString {
if let Some(null_pos) = wide_c_string.iter().position(|c| *c == 0) {
wide_c_string = &wide_c_string[..null_pos];
}

OsString::from_wide(wide_c_string)
}

pub fn has_flag<T>(bitset: T, flag: T) -> bool
where
T: Copy + PartialEq + BitAnd<T, Output = T>,
Expand Down

0 comments on commit ea09d1d

Please sign in to comment.