fix(computer): bounded portal close and closed leaked session

Bounded the RemoteDesktop close in Libei::drop with CLOSE_TIMEOUT so an unresponsive xdg-desktop-portal cannot hang worker teardown past the surrounding close budget.

Closed the portal session when ei::Context::new fails after Start/ConnectToEIS, the one init path that previously dropped the session without revoking the grant.

Fixes #7884
This commit is contained in:
roboomp
2026-08-07 11:12:04 +00:00
parent 71cf826aeb
commit cf5bd72877
@@ -43,10 +43,18 @@ impl Drop for Libei {
let Some(portal) = self.portal_session.take() else { let Some(portal) = self.portal_session.take() else {
return; return;
}; };
let _ = portal.runtime.block_on(portal.session.close()); close_session(portal.runtime, &portal.session);
} }
} }
/// Closes a RemoteDesktop portal session, bounded by `CLOSE_TIMEOUT` so an
/// unresponsive `xdg-desktop-portal` cannot hang teardown indefinitely.
fn close_session(runtime: &tokio::runtime::Runtime, session: &RemoteDesktopSession) {
let _ = runtime.block_on(async {
tokio::time::timeout(crate::desktop::CLOSE_TIMEOUT, session.close()).await
});
}
impl Libei { impl Libei {
pub(super) fn new() -> CoreResult<Self> { pub(super) fn new() -> CoreResult<Self> {
let (context, portal_session) = match ei::Context::connect_to_env() { let (context, portal_session) = match ei::Context::connect_to_env() {
@@ -114,8 +122,13 @@ impl Libei {
} }
}) })
.map_err(DesktopError::permission_denied)?; .map_err(DesktopError::permission_denied)?;
let context = ei::Context::new(UnixStream::from(fd)) let context = match ei::Context::new(UnixStream::from(fd)) {
.map_err(|err| DesktopError::input_failed(format!("libei portal socket: {err}")))?; Ok(context) => context,
Err(err) => {
close_session(runtime, &session);
return Err(DesktopError::input_failed(format!("libei portal socket: {err}")));
},
};
Ok((context, PortalSession { runtime, session })) Ok((context, PortalSession { runtime, session }))
} }