Skip to content

Commit

Permalink
x11: dup fd before passing to shm_attach_fd
Browse files Browse the repository at this point in the history
This function takes `Into<RawFdContainer>`. So it accepts an owned fd,
and closes it. So as long as the API is like this, we need to dup a new
fd it can close when calling it.

`Into<RawFdContainer>` is implemented for anything implementing `IntoRawFd`,
so passing `OwnedFd` works.

Fixes #168. Should be
backported to 0.3.x.
  • Loading branch information
ids1024 authored Oct 31, 2023
1 parent 2eef592 commit 3b98da7
Showing 1 changed file with 10 additions and 7 deletions.
17 changes: 10 additions & 7 deletions src/x11.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@ use raw_window_handle::{
HasDisplayHandle, HasWindowHandle, RawDisplayHandle, RawWindowHandle, XcbDisplayHandle,
XcbWindowHandle,
};
use rustix::{fd, mm, shm as posix_shm};
use rustix::{
fd::{AsFd, BorrowedFd, OwnedFd},
mm, shm as posix_shm,
};

use std::{
fmt,
Expand Down Expand Up @@ -618,7 +621,7 @@ impl ShmBuffer {
) -> Result<(), PushBufferError> {
// Register the guard.
let new_id = conn.generate_id()?;
conn.shm_attach_fd(new_id, fd::AsRawFd::as_raw_fd(&seg), true)?
conn.shm_attach_fd(new_id, seg.as_fd().try_clone_to_owned().unwrap(), true)?
.ignore_error();

// Take out the old one and detach it.
Expand Down Expand Up @@ -738,9 +741,9 @@ impl ShmSegment {
}
}

impl fd::AsRawFd for ShmSegment {
fn as_raw_fd(&self) -> fd::RawFd {
self.id.as_raw_fd()
impl AsFd for ShmSegment {
fn as_fd(&self) -> BorrowedFd<'_> {
self.id.as_fd()
}
}

Expand Down Expand Up @@ -785,7 +788,7 @@ impl<D: ?Sized, W: ?Sized> Drop for X11Impl<D, W> {
}

/// Create a shared memory identifier.
fn create_shm_id() -> io::Result<fd::OwnedFd> {
fn create_shm_id() -> io::Result<OwnedFd> {
use posix_shm::{Mode, ShmOFlags};

let mut rng = fastrand::Rng::new();
Expand Down Expand Up @@ -838,7 +841,7 @@ fn is_shm_available(c: &impl Connection) -> bool {
};

let (attach, detach) = {
let attach = c.shm_attach_fd(seg_id, fd::AsRawFd::as_raw_fd(&seg), false);
let attach = c.shm_attach_fd(seg_id, seg.as_fd().try_clone_to_owned().unwrap(), false);
let detach = c.shm_detach(seg_id);

match (attach, detach) {
Expand Down

0 comments on commit 3b98da7

Please sign in to comment.