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
4 changed files with 15 additions and 1 deletions
|
@ -206,6 +206,7 @@ impl OwnedHandle {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Allow child processes to inherit the handle.
|
/// Allow child processes to inherit the handle.
|
||||||
|
#[cfg(not(target_vendor = "uwp"))]
|
||||||
pub(crate) fn set_inheritable(&self) -> io::Result<()> {
|
pub(crate) fn set_inheritable(&self) -> io::Result<()> {
|
||||||
cvt(unsafe {
|
cvt(unsafe {
|
||||||
c::SetHandleInformation(
|
c::SetHandleInformation(
|
||||||
|
|
|
@ -10,6 +10,7 @@ use crate::mem;
|
||||||
use crate::mem::forget;
|
use crate::mem::forget;
|
||||||
use crate::sys;
|
use crate::sys;
|
||||||
use crate::sys::c;
|
use crate::sys::c;
|
||||||
|
#[cfg(not(target_vendor = "uwp"))]
|
||||||
use crate::sys::cvt;
|
use crate::sys::cvt;
|
||||||
|
|
||||||
/// A borrowed socket.
|
/// A borrowed socket.
|
||||||
|
|
|
@ -221,6 +221,7 @@ impl Handle {
|
||||||
Ok(Self(self.0.duplicate(access, inherit, options)?))
|
Ok(Self(self.0.duplicate(access, inherit, options)?))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(not(target_vendor = "uwp"))]
|
||||||
pub(crate) fn set_inheritable(&self) -> io::Result<()> {
|
pub(crate) fn set_inheritable(&self) -> io::Result<()> {
|
||||||
self.0.set_inheritable()
|
self.0.set_inheritable()
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,12 +57,23 @@ impl Pipes {
|
||||||
} else {
|
} else {
|
||||||
let (ours, theirs) = if ours_readable { (read, write) } else { (write, read) };
|
let (ours, theirs) = if ours_readable { (read, write) } else { (write, read) };
|
||||||
let ours = Handle::from_raw_handle(ours);
|
let ours = Handle::from_raw_handle(ours);
|
||||||
|
#[cfg(not(target_vendor = "uwp"))]
|
||||||
let theirs = Handle::from_raw_handle(theirs);
|
let theirs = Handle::from_raw_handle(theirs);
|
||||||
|
#[cfg(target_vendor = "uwp")]
|
||||||
|
let mut theirs = Handle::from_raw_handle(theirs);
|
||||||
|
|
||||||
if their_handle_inheritable {
|
if their_handle_inheritable {
|
||||||
|
#[cfg(not(target_vendor = "uwp"))]
|
||||||
|
{
|
||||||
theirs.set_inheritable()?;
|
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) })
|
Ok(Pipes { ours: AnonPipe::Sync(ours), theirs: AnonPipe::Sync(theirs) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue