mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 02:57:37 +00:00
Rollup merge of #97060 - bdbai:fix/uwphandle, r=ChrisDenton
Fix use of SetHandleInformation on UWP The use of `SetHandleInformation` (introduced in #96441 to make `HANDLE` inheritable) breaks UWP builds because it is not available for UWP targets. Proposed workaround: duplicate the `HANDLE` with `inherit = true` and immediately close the old one. Traditional Windows Desktop programs are not affected. cc `@ChrisDenton`
This commit is contained in:
commit
d56c59efdc
@ -206,6 +206,7 @@ impl OwnedHandle {
|
||||
}
|
||||
|
||||
/// Allow child processes to inherit the handle.
|
||||
#[cfg(not(target_vendor = "uwp"))]
|
||||
pub(crate) fn set_inheritable(&self) -> io::Result<()> {
|
||||
cvt(unsafe {
|
||||
c::SetHandleInformation(
|
||||
|
@ -10,6 +10,7 @@ use crate::mem;
|
||||
use crate::mem::forget;
|
||||
use crate::sys;
|
||||
use crate::sys::c;
|
||||
#[cfg(not(target_vendor = "uwp"))]
|
||||
use crate::sys::cvt;
|
||||
|
||||
/// A borrowed socket.
|
||||
|
@ -221,6 +221,7 @@ impl Handle {
|
||||
Ok(Self(self.0.duplicate(access, inherit, options)?))
|
||||
}
|
||||
|
||||
#[cfg(not(target_vendor = "uwp"))]
|
||||
pub(crate) fn set_inheritable(&self) -> io::Result<()> {
|
||||
self.0.set_inheritable()
|
||||
}
|
||||
|
@ -57,10 +57,21 @@ impl Pipes {
|
||||
} else {
|
||||
let (ours, theirs) = if ours_readable { (read, write) } else { (write, read) };
|
||||
let ours = Handle::from_raw_handle(ours);
|
||||
#[cfg(not(target_vendor = "uwp"))]
|
||||
let theirs = Handle::from_raw_handle(theirs);
|
||||
#[cfg(target_vendor = "uwp")]
|
||||
let mut theirs = Handle::from_raw_handle(theirs);
|
||||
|
||||
if their_handle_inheritable {
|
||||
theirs.set_inheritable()?;
|
||||
#[cfg(not(target_vendor = "uwp"))]
|
||||
{
|
||||
theirs.set_inheritable()?;
|
||||
}
|
||||
|
||||
#[cfg(target_vendor = "uwp")]
|
||||
{
|
||||
theirs = theirs.duplicate(0, true, c::DUPLICATE_SAME_ACCESS)?;
|
||||
}
|
||||
}
|
||||
|
||||
Ok(Pipes { ours: AnonPipe::Sync(ours), theirs: AnonPipe::Sync(theirs) })
|
||||
|
Loading…
Reference in New Issue
Block a user