Skip to content

Commit 7d56443

Browse files
committed
fix unix build
1 parent 1ffade3 commit 7d56443

File tree

7 files changed

+169
-64
lines changed

7 files changed

+169
-64
lines changed

libafl/src/bolts/llmp.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1871,7 +1871,7 @@ where
18711871
// (For now) the thread remote broker 2 broker just acts like a "normal" llmp client, except it proxies all messages to the attached socket, in both directions.
18721872
thread::spawn(move || {
18731873
// as always, call post_fork to potentially reconnect the provider (for threaded/forked use)
1874-
shmem_provider_clone.post_fork(true);
1874+
shmem_provider_clone.post_fork(true).unwrap();
18751875

18761876
#[cfg(fature = "llmp_debug")]
18771877
println!("B2b: Spawned proxy thread");
@@ -2064,7 +2064,7 @@ where
20642064

20652065
let ret = thread::spawn(move || {
20662066
// Call `post_fork` (even though this is not forked) so we get a new connection to the cloned `ShMemServer` if we are using a `ServedShMemProvider`
2067-
shmem_provider_clone.post_fork(true);
2067+
shmem_provider_clone.post_fork(true).unwrap();
20682068

20692069
let mut current_client_id = llmp_tcp_id + 1;
20702070

@@ -2127,7 +2127,7 @@ where
21272127
}
21282128
});
21292129

2130-
self.shmem_provider.post_fork(false);
2130+
self.shmem_provider.post_fork(false)?;
21312131
Ok(ret)
21322132
}
21332133

libafl/src/bolts/os/ashmem_server.rs

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ impl ShMem for ServedShMem {
7676
impl ServedShMemProvider {
7777
/// Send a request to the server, and wait for a response
7878
#[allow(clippy::similar_names)] // id and fd
79-
fn send_receive(&mut self, request: AshmemRequest) -> (i32, i32) {
80-
let body = postcard::to_allocvec(&request).unwrap();
79+
fn send_receive(&mut self, request: AshmemRequest) -> Result<(i32, i32), Error> {
80+
let body = postcard::to_allocvec(&request)?;
8181

8282
let header = (body.len() as u32).to_be_bytes();
8383
let mut message = header.to_vec();
@@ -95,8 +95,8 @@ impl ServedShMemProvider {
9595

9696
let server_id = ShMemId::from_slice(&shm_slice);
9797
let server_id_str = server_id.to_string();
98-
let server_fd: i32 = server_id_str.parse().unwrap();
99-
(server_fd, fd_buf[0])
98+
let server_fd: i32 = server_id_str.parse()?;
99+
Ok((server_fd, fd_buf[0]))
100100
}
101101
}
102102

@@ -118,18 +118,16 @@ impl ShMemProvider for ServedShMemProvider {
118118
/// Connect to the server and return a new [`ServedShMemProvider`]
119119
fn new() -> Result<Self, Error> {
120120
let mut res = Self {
121-
stream: UnixStream::connect_to_unix_addr(
122-
&UnixSocketAddr::new(ASHMEM_SERVER_NAME).unwrap(),
123-
)?,
121+
stream: UnixStream::connect_to_unix_addr(&UnixSocketAddr::new(ASHMEM_SERVER_NAME)?)?,
124122
inner: AshmemShMemProvider::new()?,
125123
id: -1,
126124
};
127-
let (id, _) = res.send_receive(AshmemRequest::Hello(None));
125+
let (id, _) = res.send_receive(AshmemRequest::Hello(None))?;
128126
res.id = id;
129127
Ok(res)
130128
}
131129
fn new_map(&mut self, map_size: usize) -> Result<Self::Mem, crate::Error> {
132-
let (server_fd, client_fd) = self.send_receive(AshmemRequest::NewMap(map_size));
130+
let (server_fd, client_fd) = self.send_receive(AshmemRequest::NewMap(map_size))?;
133131

134132
Ok(ServedShMem {
135133
inner: ManuallyDrop::new(
@@ -145,7 +143,7 @@ impl ShMemProvider for ServedShMemProvider {
145143
let server_id_str = parts.get(0).unwrap();
146144
let (server_fd, client_fd) = self.send_receive(AshmemRequest::ExistingMap(
147145
ShMemDescription::from_string_and_size(server_id_str, size),
148-
));
146+
))?;
149147
Ok(ServedShMem {
150148
inner: ManuallyDrop::new(
151149
self.inner
@@ -155,16 +153,21 @@ impl ShMemProvider for ServedShMemProvider {
155153
})
156154
}
157155

158-
fn post_fork(&mut self) {
159-
self.stream =
160-
UnixStream::connect_to_unix_addr(&UnixSocketAddr::new(ASHMEM_SERVER_NAME).unwrap())
161-
.expect("Unable to reconnect to the ashmem service");
162-
let (id, _) = self.send_receive(AshmemRequest::Hello(Some(self.id)));
163-
self.id = id;
156+
fn post_fork(&mut self, is_child: bool) -> Result<(), Error> {
157+
if is_child {
158+
// After fork, the child needs to reconnect as to not share the fds with the parent.
159+
self.stream =
160+
UnixStream::connect_to_unix_addr(&UnixSocketAddr::new(ASHMEM_SERVER_NAME)?)?;
161+
let (id, _) = self.send_receive(AshmemRequest::Hello(Some(self.id)))?;
162+
self.id = id;
163+
}
164+
Ok(())
164165
}
165166

166167
fn release_map(&mut self, map: &mut Self::Mem) {
167-
let (refcount, _) = self.send_receive(AshmemRequest::Deregister(map.server_fd));
168+
let (refcount, _) = self
169+
.send_receive(AshmemRequest::Deregister(map.server_fd))
170+
.expect("Could not communicate to AshMem server!");
168171
if refcount == 0 {
169172
unsafe {
170173
ManuallyDrop::drop(&mut map.inner);

libafl/src/bolts/os/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ pub mod ashmem_server;
77
pub mod unix_signals;
88

99
#[cfg(unix)]
10-
mod pipes;
10+
pub mod pipes;
1111

1212
#[cfg(all(windows, feature = "std"))]
1313
pub mod windows_exceptions;

libafl/src/bolts/os/pipes.rs

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
//! Unix `pipe` wrapper for `LibAFL`
2+
use crate::Error;
13
use nix::unistd::{close, pipe, read, write};
4+
use std::io::{self, ErrorKind, Read, Write};
5+
use std::os::unix::io::RawFd;
26

37
#[derive(Debug, Clone)]
48
pub struct Pipe {
@@ -7,60 +11,72 @@ pub struct Pipe {
711
}
812

913
impl Pipe {
10-
fn new() -> Self {
11-
let mut fds = [-1 as c_int, -1 as c_int];
12-
let ret = unsafe { libc::pipe(fds.as_mut_ptr()) };
13-
if ret < 0 {
14-
panic!("pipe() failed");
15-
}
16-
Self {
17-
read_end: fds[0],
18-
write_end: fds[1],
19-
}
14+
pub fn new() -> Result<Self, Error> {
15+
let (read_end, write_end) = pipe()?;
16+
Ok(Self {
17+
read_end: Some(read_end),
18+
write_end: Some(write_end),
19+
})
2020
}
2121

22-
fn close_read_end() {
22+
pub fn close_read_end(&mut self) {
2323
if let Some(read_end) = self.read_end {
24-
close(read_end);
24+
let _ = close(read_end);
2525
self.read_end = None;
2626
}
2727
}
2828

29-
fn close_write_end() {
29+
pub fn close_write_end(&mut self) {
3030
if let Some(write_end) = self.write_end {
31-
close(write_end);
31+
let _ = close(write_end);
3232
self.write_end = None;
3333
}
3434
}
3535
}
3636

3737
impl Read for Pipe {
3838
/// Reads a few bytes
39-
fn read(&self, buf: &mut [u8]) -> Result<usize, Error> {
39+
fn read(&mut self, buf: &mut [u8]) -> Result<usize, io::Error> {
4040
match self.read_end {
41-
Some(read_end) => Ok(read(self.read_end, buf)?),
42-
None => Err(Error::IllegalState("Read pipe was already closed")),
41+
Some(read_end) => match read(read_end, buf) {
42+
Ok(res) => Ok(res),
43+
Err(e) => Err(io::Error::from_raw_os_error(e.as_errno().unwrap() as i32)),
44+
},
45+
None => Err(io::Error::new(
46+
ErrorKind::BrokenPipe,
47+
"Read pipe end was already closed",
48+
)),
4349
}
4450
}
4551
}
4652

4753
impl Write for Pipe {
4854
/// Writes a few bytes
49-
fn write(&self, buf: &[u8]) -> Result<usize, Error> {
50-
match self.read_end {
51-
Some(read_end) => Ok(write(self.write_end, buf)?),
52-
None => Err(Error::IllegalState("Write pipe was already closed")),
55+
fn write(&mut self, buf: &[u8]) -> Result<usize, io::Error> {
56+
match self.write_end {
57+
Some(write_end) => match write(write_end, buf) {
58+
Ok(res) => Ok(res),
59+
Err(e) => Err(io::Error::from_raw_os_error(e.as_errno().unwrap() as i32)),
60+
},
61+
None => Err(io::Error::new(
62+
ErrorKind::BrokenPipe,
63+
"Write pipe end was already closed",
64+
)),
5365
}
5466
}
67+
68+
fn flush(&mut self) -> Result<(), io::Error> {
69+
Ok(())
70+
}
5571
}
5672

5773
impl Drop for Pipe {
5874
fn drop(&mut self) {
5975
if let Some(read_end) = self.read_end {
60-
let _ = close(self.read_end);
76+
let _ = close(read_end);
6177
}
6278
if let Some(write_end) = self.write_end {
63-
let _ = close(self.write_end);
79+
let _ = close(write_end);
6480
}
6581
}
6682
}

0 commit comments

Comments
 (0)