|
3 | 3 | reason = "This module mirrors Win32 APIs with raw handle and pointer parameters." |
4 | 4 | )] |
5 | 5 |
|
| 6 | +use core::hint::cold_path; |
6 | 7 | use std::{io, path::Path}; |
7 | | -use windows_sys::Win32::{ |
8 | | - Foundation::{HANDLE, HMODULE, WAIT_FAILED}, |
9 | | - System::Threading::PROCESS_INFORMATION, |
10 | | -}; |
11 | 8 |
|
12 | 9 | use crate::windows::{CheckWin32Bool, CheckWin32Handle}; |
13 | 10 |
|
| 11 | +use memchr::memchr; |
14 | 12 | pub use windows_sys::Win32::{ |
15 | 13 | Foundation::{ |
16 | 14 | DUPLICATE_CLOSE_SOURCE, DUPLICATE_SAME_ACCESS, ERROR_ACCESS_DENIED, ERROR_ALREADY_EXISTS, |
17 | 15 | ERROR_BROKEN_PIPE, ERROR_IO_PENDING, ERROR_MORE_DATA, ERROR_NETNAME_DELETED, ERROR_NO_DATA, |
18 | 16 | ERROR_NO_SYSTEM_RESOURCES, ERROR_NOT_FOUND, ERROR_OPERATION_ABORTED, ERROR_PIPE_BUSY, |
19 | 17 | ERROR_PIPE_CONNECTED, ERROR_PORT_UNREACHABLE, ERROR_PRIVILEGE_NOT_HELD, ERROR_SEM_TIMEOUT, |
20 | | - ERROR_SUCCESS, GENERIC_READ, GENERIC_WRITE, STILL_ACTIVE, WAIT_ABANDONED_0, WAIT_OBJECT_0, |
21 | | - WAIT_TIMEOUT, |
| 18 | + ERROR_SUCCESS, GENERIC_READ, GENERIC_WRITE, HANDLE, HMODULE, STILL_ACTIVE, |
| 19 | + WAIT_ABANDONED_0, WAIT_FAILED, WAIT_OBJECT_0, WAIT_TIMEOUT, |
22 | 20 | }, |
23 | 21 | Globalization::{ |
24 | 22 | LCMAP_FULLWIDTH, LCMAP_HALFWIDTH, LCMAP_HIRAGANA, LCMAP_KATAKANA, LCMAP_LINGUISTIC_CASING, |
@@ -57,12 +55,12 @@ pub use windows_sys::Win32::{ |
57 | 55 | ABOVE_NORMAL_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, CREATE_BREAKAWAY_FROM_JOB, |
58 | 56 | CREATE_DEFAULT_ERROR_MODE, CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP, |
59 | 57 | CREATE_NO_WINDOW, DETACHED_PROCESS, HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS, |
60 | | - NORMAL_PRIORITY_CLASS, PROCESS_ALL_ACCESS, PROCESS_DUP_HANDLE, REALTIME_PRIORITY_CLASS, |
61 | | - STARTF_FORCEOFFFEEDBACK, STARTF_FORCEONFEEDBACK, STARTF_PREVENTPINNING, |
62 | | - STARTF_RUNFULLSCREEN, STARTF_TITLEISAPPID, STARTF_TITLEISLINKNAME, |
63 | | - STARTF_UNTRUSTEDSOURCE, STARTF_USECOUNTCHARS, STARTF_USEFILLATTRIBUTE, |
64 | | - STARTF_USEHOTKEY, STARTF_USEPOSITION, STARTF_USESHOWWINDOW, STARTF_USESIZE, |
65 | | - STARTF_USESTDHANDLES, |
| 58 | + NORMAL_PRIORITY_CLASS, PROCESS_ALL_ACCESS, PROCESS_DUP_HANDLE, PROCESS_INFORMATION, |
| 59 | + REALTIME_PRIORITY_CLASS, STARTF_FORCEOFFFEEDBACK, STARTF_FORCEONFEEDBACK, |
| 60 | + STARTF_PREVENTPINNING, STARTF_RUNFULLSCREEN, STARTF_TITLEISAPPID, |
| 61 | + STARTF_TITLEISLINKNAME, STARTF_UNTRUSTEDSOURCE, STARTF_USECOUNTCHARS, |
| 62 | + STARTF_USEFILLATTRIBUTE, STARTF_USEHOTKEY, STARTF_USEPOSITION, STARTF_USESHOWWINDOW, |
| 63 | + STARTF_USESIZE, STARTF_USESTDHANDLES, |
66 | 64 | }, |
67 | 65 | }, |
68 | 66 | UI::WindowsAndMessaging::SW_HIDE, |
@@ -312,7 +310,8 @@ pub fn build_environment_block( |
312 | 310 |
|
313 | 311 | let mut last_entry: HashMap<String, Vec<u16>> = HashMap::new(); |
314 | 312 | for (key, value) in entries { |
315 | | - if key.contains('\0') || value.contains('\0') { |
| 313 | + if memchr(b'\0', key.as_bytes()) || memchr(b'\0', value.as_bytes()) { |
| 314 | + cold_path(); |
316 | 315 | return Err(BuildEnvironmentBlockError::ContainsNul); |
317 | 316 | } |
318 | 317 | if key.is_empty() || key[1..].contains('=') { |
|
0 commit comments