Skip to content

Commit 09d1e08

Browse files
hanna-kruppevorner
authored andcommitted
I/O safety
Use OwnedFd instead of IntoRawFd, as it enforces the ownership of the file descriptor. Updating minimal rust version to 1.66.0 (introduction of OwnedFd).
1 parent 115d998 commit 09d1e08

File tree

15 files changed

+49
-43
lines changed

15 files changed

+49
-43
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ readme = "README.md"
1212
keywords = ["signal", "unix", "daemon"]
1313
license = "MIT OR Apache-2.0"
1414
edition = "2018"
15-
rust-version = "1.31"
15+
rust-version = "1.66"
1616

1717
[badges]
1818
maintenance = { status = "actively-developed" }

signal-hook-async-std/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ impl<E: Exfiltrator> SignalsInfo<E> {
9292
S: Borrow<c_int>,
9393
{
9494
let (read, write) = Async::<UnixStream>::pair()?;
95-
let inner = SignalDelivery::with_pipe(read, write, exfiltrator, signals)?;
95+
let inner = SignalDelivery::with_pipe(read, write.into_inner()?, exfiltrator, signals)?;
9696
Ok(Self(OwningSignalIterator::new(inner)))
9797
}
9898

signal-hook-mio/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ keywords = ["signal", "unix", "mio"]
1414
license = "MIT OR Apache-2.0"
1515

1616
edition = "2018"
17-
rust-version = "1.36"
17+
rust-version = "1.66"
1818

1919
[badges]
2020
travis-ci = { repository = "vorner/signal-hook" }

signal-hook-mio/src/lib.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ macro_rules! implement_signals_with_pipe {
2525
($pipe:path) => {
2626
use std::borrow::Borrow;
2727
use std::io::Error;
28+
use std::os::fd::{FromRawFd, IntoRawFd, OwnedFd};
2829

2930
use signal_hook::iterator::backend::{self, SignalDelivery};
3031
use signal_hook::iterator::exfiltrator::{Exfiltrator, SignalOnly};
@@ -61,7 +62,10 @@ macro_rules! implement_signals_with_pipe {
6162
S: Borrow<c_int>,
6263
{
6364
let (read, write) = Pipe::pair()?;
64-
let delivery = SignalDelivery::with_pipe(read, write, exfiltrator, signals)?;
65+
// For mio 1.0 we could use OwnedFd::from, but older mio versions don't have that
66+
// due to their lower MSRV, so we need to go through RawFd.
67+
let write_fd = unsafe { OwnedFd::from_raw_fd(write.into_raw_fd()) };
68+
let delivery = SignalDelivery::with_pipe(read, write_fd, exfiltrator, signals)?;
6569
Ok(Self(delivery))
6670
}
6771

signal-hook-mio/tests/mio_0_6.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use libc::c_int;
1616
fn mio_wakeup() {
1717
let _lock = serial_test::lock();
1818

19-
let mut signals = Signals::new(&[SIGUSR1]).unwrap();
19+
let mut signals = Signals::new([SIGUSR1]).unwrap();
2020
let token = Token(0);
2121
let poll = Poll::new().unwrap();
2222
poll.register(&signals, token, Ready::readable(), PollOpt::level())
@@ -47,7 +47,7 @@ fn mio_wakeup() {
4747
fn mio_multiple_signals() {
4848
let _lock = serial_test::lock();
4949

50-
let mut signals = Signals::new(&[SIGUSR1, SIGUSR2]).unwrap();
50+
let mut signals = Signals::new([SIGUSR1, SIGUSR2]).unwrap();
5151
let poll = Poll::new().unwrap();
5252
let token = Token(0);
5353
poll.register(&signals, token, Ready::readable(), PollOpt::level())
@@ -79,7 +79,7 @@ fn mio_multiple_signals() {
7979
fn mio_parallel_multiple() {
8080
let _lock = serial_test::lock();
8181

82-
let mut signals = Signals::new(&[SIGUSR1]).unwrap();
82+
let mut signals = Signals::new([SIGUSR1]).unwrap();
8383
let poll = Poll::new().unwrap();
8484
let token = Token(0);
8585
poll.register(&signals, token, Ready::readable(), PollOpt::level())

signal-hook-mio/tests/mio_0_7.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ fn mio_wakeup() {
5151
fn mio_multiple_signals() {
5252
let _lock = serial_test::lock();
5353

54-
let mut signals = Signals::new(&[SIGUSR1, SIGUSR2]).unwrap();
54+
let mut signals = Signals::new([SIGUSR1, SIGUSR2]).unwrap();
5555
let mut poll = Poll::new().unwrap();
5656
let token = Token(0);
5757
poll.registry()
@@ -84,7 +84,7 @@ fn mio_multiple_signals() {
8484
fn mio_parallel_multiple() {
8585
let _lock = serial_test::lock();
8686

87-
let mut signals = Signals::new(&[SIGUSR1]).unwrap();
87+
let mut signals = Signals::new([SIGUSR1]).unwrap();
8888
let mut poll = Poll::new().unwrap();
8989
let token = Token(0);
9090
poll.registry()

signal-hook-mio/tests/mio_0_8.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use libc::c_int;
1717
fn mio_wakeup() {
1818
let _lock = serial_test::lock();
1919

20-
let mut signals = Signals::new(&[SIGUSR1]).unwrap();
20+
let mut signals = Signals::new([SIGUSR1]).unwrap();
2121
let mut poll = Poll::new().unwrap();
2222
let token = Token(0);
2323
poll.registry()
@@ -51,7 +51,7 @@ fn mio_wakeup() {
5151
fn mio_multiple_signals() {
5252
let _lock = serial_test::lock();
5353

54-
let mut signals = Signals::new(&[SIGUSR1, SIGUSR2]).unwrap();
54+
let mut signals = Signals::new([SIGUSR1, SIGUSR2]).unwrap();
5555
let mut poll = Poll::new().unwrap();
5656
let token = Token(0);
5757
poll.registry()
@@ -84,7 +84,7 @@ fn mio_multiple_signals() {
8484
fn mio_parallel_multiple() {
8585
let _lock = serial_test::lock();
8686

87-
let mut signals = Signals::new(&[SIGUSR1]).unwrap();
87+
let mut signals = Signals::new([SIGUSR1]).unwrap();
8888
let mut poll = Poll::new().unwrap();
8989
let token = Token(0);
9090
poll.registry()

signal-hook-mio/tests/mio_1_0.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use libc::c_int;
1717
fn mio_wakeup() {
1818
let _lock = serial_test::lock();
1919

20-
let mut signals = Signals::new(&[SIGUSR1]).unwrap();
20+
let mut signals = Signals::new([SIGUSR1]).unwrap();
2121
let mut poll = Poll::new().unwrap();
2222
let token = Token(0);
2323
poll.registry()
@@ -51,7 +51,7 @@ fn mio_wakeup() {
5151
fn mio_multiple_signals() {
5252
let _lock = serial_test::lock();
5353

54-
let mut signals = Signals::new(&[SIGUSR1, SIGUSR2]).unwrap();
54+
let mut signals = Signals::new([SIGUSR1, SIGUSR2]).unwrap();
5555
let mut poll = Poll::new().unwrap();
5656
let token = Token(0);
5757
poll.registry()
@@ -84,7 +84,7 @@ fn mio_multiple_signals() {
8484
fn mio_parallel_multiple() {
8585
let _lock = serial_test::lock();
8686

87-
let mut signals = Signals::new(&[SIGUSR1]).unwrap();
87+
let mut signals = Signals::new([SIGUSR1]).unwrap();
8888
let mut poll = Poll::new().unwrap();
8989
let token = Token(0);
9090
poll.registry()

signal-hook-tokio/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ impl<E: Exfiltrator> SignalsInfo<E> {
110110
S: Borrow<c_int>,
111111
{
112112
let (read, write) = UnixStream::pair()?;
113-
let inner = SignalDelivery::with_pipe(read, write, exfiltrator, signals)?;
113+
let inner = SignalDelivery::with_pipe(read, write.into_std()?, exfiltrator, signals)?;
114114
Ok(Self(OwningSignalIterator::new(inner)))
115115
}
116116

src/iterator/backend.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use std::borrow::{Borrow, BorrowMut};
2121
use std::fmt::{Debug, Formatter, Result as FmtResult};
2222
use std::io::Error;
2323
use std::mem::MaybeUninit;
24+
use std::os::fd::{AsFd, OwnedFd};
2425
use std::os::unix::io::AsRawFd;
2526
use std::ptr;
2627
use std::sync::atomic::{AtomicBool, Ordering};
@@ -39,9 +40,9 @@ trait SelfPipeWrite: Debug + Send + Sync {
3940
fn wake_readers(&self);
4041
}
4142

42-
impl<W: AsRawFd + Debug + Send + Sync> SelfPipeWrite for W {
43+
impl<W: AsFd + Debug + Send + Sync> SelfPipeWrite for W {
4344
fn wake_readers(&self) {
44-
pipe::wake(self.as_raw_fd(), WakeMethod::Send);
45+
pipe::wake(self.as_fd(), WakeMethod::Send);
4546
}
4647
}
4748

@@ -264,11 +265,11 @@ where
264265
where
265266
I: IntoIterator<Item = S>,
266267
S: Borrow<c_int>,
267-
W: 'static + AsRawFd + Debug + Send + Sync,
268+
W: 'static + Into<OwnedFd> + Debug + Send + Sync,
268269
{
269270
let pending = Arc::new(PendingSignals::new(exfiltrator));
270271
let pending_add_signal = Arc::clone(&pending);
271-
let handle = Handle::new(write, pending_add_signal);
272+
let handle = Handle::new(write.into(), pending_add_signal);
272273
let me = Self {
273274
read,
274275
handle,

0 commit comments

Comments
 (0)