Skip to content

Commit 3009d4b

Browse files
committed
fix: store socket type in HostSocket for correct SO_TYPE response
Signed-off-by: danbugs <danilochiarlone@gmail.com>
1 parent f5eb506 commit 3009d4b

1 file changed

Lines changed: 16 additions & 8 deletions

File tree

host/src/lib.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,7 +1038,7 @@ use std::net::SocketAddr;
10381038
use std::sync::Mutex;
10391039

10401040
enum HostSocket {
1041-
Socket(Socket),
1041+
Socket(Socket, i32),
10421042
}
10431043

10441044
struct SocketTable {
@@ -1069,7 +1069,13 @@ impl SocketTable {
10691069

10701070
fn get_socket(&self, fd: u32) -> Result<&Socket> {
10711071
match self.get(fd)? {
1072-
HostSocket::Socket(s) => Ok(s),
1072+
HostSocket::Socket(s, _) => Ok(s),
1073+
}
1074+
}
1075+
1076+
fn get_sock_type(&self, fd: u32) -> Result<i32> {
1077+
match self.get(fd)? {
1078+
HostSocket::Socket(_, t) => Ok(*t),
10731079
}
10741080
}
10751081

@@ -1136,7 +1142,7 @@ fn register_net_tools(
11361142
Some(Protocol::from(protocol))
11371143
};
11381144
let sock = Socket::new(domain, stype, proto)?;
1139-
let fd = t.lock().unwrap().insert(HostSocket::Socket(sock));
1145+
let fd = t.lock().unwrap().insert(HostSocket::Socket(sock, sock_type));
11401146
Ok(json!({ "fd": fd }))
11411147
});
11421148

@@ -1186,13 +1192,15 @@ fn register_net_tools(
11861192
let t = table.clone();
11871193
tools.register("net_accept", move |args| {
11881194
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))? as u32;
1189-
let (new_sock, peer) = {
1195+
let (new_sock, peer, parent_type) = {
11901196
let tbl = t.lock().unwrap();
11911197
let sock = tbl.get_socket(fd)?;
1192-
sock.accept()?
1198+
let (s, p) = sock.accept()?;
1199+
let st = tbl.get_sock_type(fd)?;
1200+
(s, p, st)
11931201
};
11941202
let peer_addr: Option<SocketAddr> = peer.as_socket();
1195-
let new_fd = t.lock().unwrap().insert(HostSocket::Socket(new_sock));
1203+
let new_fd = t.lock().unwrap().insert(HostSocket::Socket(new_sock, parent_type));
11961204
let mut resp = json!({ "fd": new_fd });
11971205
if let Some(pa) = peer_addr {
11981206
resp["addr"] = json!(pa.ip().to_string());
@@ -1336,8 +1344,8 @@ fn register_net_tools(
13361344
let tbl = t.lock().unwrap();
13371345
let sock = tbl.get_socket(fd)?;
13381346
let val: i32 = if level == 1 && optname == 3 {
1339-
// SOL_SOCKET + SO_TYPE — all our sockets are SOCK_STREAM
1340-
1
1347+
// SOL_SOCKET + SO_TYPE — return the actual socket type
1348+
tbl.get_sock_type(fd)?
13411349
} else if level == 1 && optname == 2 {
13421350
sock.reuse_address()? as i32
13431351
} else if level == 6 && optname == 1 {

0 commit comments

Comments
 (0)