Skip to content

Commit 6d3fa69

Browse files
committed
Fix underflow in socketAddr::address
With a regression test for issue #1403.
1 parent 6fad879 commit 6d3fa69

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

src/sys/unix/uds/socketaddr.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ enum AddressKind<'a> {
2828
impl SocketAddr {
2929
fn address(&self) -> AddressKind<'_> {
3030
let offset = path_offset(&self.sockaddr);
31+
// Don't underflow in `len` below.
32+
if (self.socklen as usize) < offset {
33+
return AddressKind::Unnamed;
34+
}
3135
let len = self.socklen as usize - offset;
3236
let path = unsafe { &*(&self.sockaddr.sun_path as *const [libc::c_char] as *const [u8]) };
3337

tests/regressions.rs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
#![cfg(all(feature = "os-poll", feature = "net"))]
22

3-
use mio::net::{TcpListener, TcpStream};
4-
use mio::{Events, Interest, Poll, Token, Waker};
53
use std::io::{self, Read};
64
use std::sync::Arc;
75
use std::time::Duration;
86
use std::{net, thread};
97

8+
use mio::net::{TcpListener, TcpStream};
9+
use mio::{Events, Interest, Poll, Token, Waker};
10+
1011
mod util;
11-
use util::{any_local_address, init, init_with_poll};
12+
use util::{any_local_address, init, init_with_poll, temp_file};
1213

1314
const ID1: Token = Token(1);
1415
const WAKE_TOKEN: Token = Token(10);
@@ -103,3 +104,22 @@ fn issue_1205() {
103104
assert_eq!(waker_event.token(), WAKE_TOKEN);
104105
handle.join().unwrap();
105106
}
107+
108+
#[test]
109+
#[cfg(unix)]
110+
fn issue_1403() {
111+
use mio::net::UnixDatagram;
112+
113+
init();
114+
115+
let path = temp_file("issue_1403");
116+
let datagram1 = UnixDatagram::bind(&path).unwrap();
117+
let datagram2 = UnixDatagram::unbound().unwrap();
118+
119+
let mut buf = [1u8; 1024];
120+
let n = datagram2.send_to(&buf, &path).unwrap();
121+
122+
let (got, addr) = datagram1.recv_from(&mut buf).unwrap();
123+
assert_eq!(got, n);
124+
assert_eq!(addr.as_pathname(), None);
125+
}

0 commit comments

Comments
 (0)