Skip to content

Commit 802fdfc

Browse files
committed
fix: use u64 for SocketTable next_id to prevent wraparound
Signed-off-by: danbugs <danilochiarlone@gmail.com>
1 parent 8744627 commit 802fdfc

1 file changed

Lines changed: 21 additions & 21 deletions

File tree

host/src/lib.rs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,8 +1042,8 @@ enum HostSocket {
10421042
}
10431043

10441044
struct SocketTable {
1045-
sockets: HashMap<u32, HostSocket>,
1046-
next_id: u32,
1045+
sockets: HashMap<u64, HostSocket>,
1046+
next_id: u64,
10471047
}
10481048

10491049
impl SocketTable {
@@ -1054,32 +1054,32 @@ impl SocketTable {
10541054
}
10551055
}
10561056

1057-
fn insert(&mut self, sock: HostSocket) -> u32 {
1057+
fn insert(&mut self, sock: HostSocket) -> u64 {
10581058
let id = self.next_id;
10591059
self.next_id += 1;
10601060
self.sockets.insert(id, sock);
10611061
id
10621062
}
10631063

1064-
fn get(&self, fd: u32) -> Result<&HostSocket> {
1064+
fn get(&self, fd: u64) -> Result<&HostSocket> {
10651065
self.sockets
10661066
.get(&fd)
10671067
.ok_or_else(|| anyhow!("bad_fd: {}", fd))
10681068
}
10691069

1070-
fn get_socket(&self, fd: u32) -> Result<&Socket> {
1070+
fn get_socket(&self, fd: u64) -> Result<&Socket> {
10711071
match self.get(fd)? {
10721072
HostSocket::Socket(s, _) => Ok(s),
10731073
}
10741074
}
10751075

1076-
fn get_sock_type(&self, fd: u32) -> Result<i32> {
1076+
fn get_sock_type(&self, fd: u64) -> Result<i32> {
10771077
match self.get(fd)? {
10781078
HostSocket::Socket(_, t) => Ok(*t),
10791079
}
10801080
}
10811081

1082-
fn remove(&mut self, fd: u32) -> Result<()> {
1082+
fn remove(&mut self, fd: u64) -> Result<()> {
10831083
self.sockets
10841084
.remove(&fd)
10851085
.map(|_| ())
@@ -1150,7 +1150,7 @@ fn register_net_tools(
11501150
let t = table.clone();
11511151
let pol = policy.clone();
11521152
tools.register("net_connect", move |args| {
1153-
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))? as u32;
1153+
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))?;
11541154
let addr = parse_sockaddr(&args)?;
11551155
pol.check(&addr)?;
11561156
let sa: SockAddr = addr.into();
@@ -1164,7 +1164,7 @@ fn register_net_tools(
11641164
let t = table.clone();
11651165
let lp = listen_ports.cloned().map(Arc::new);
11661166
tools.register("net_bind", move |args| {
1167-
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))? as u32;
1167+
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))?;
11681168
let addr = parse_sockaddr(&args)?;
11691169
match lp.as_ref() {
11701170
Some(ports) => ports.check(addr.port())?,
@@ -1180,7 +1180,7 @@ fn register_net_tools(
11801180
// net_listen
11811181
let t = table.clone();
11821182
tools.register("net_listen", move |args| {
1183-
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))? as u32;
1183+
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))?;
11841184
let backlog = args["backlog"].as_i64().unwrap_or(128) as i32;
11851185
let tbl = t.lock().unwrap();
11861186
let sock = tbl.get_socket(fd)?;
@@ -1191,7 +1191,7 @@ fn register_net_tools(
11911191
// net_accept
11921192
let t = table.clone();
11931193
tools.register("net_accept", move |args| {
1194-
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))? as u32;
1194+
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))?;
11951195
let (new_sock, peer, parent_type) = {
11961196
let tbl = t.lock().unwrap();
11971197
let sock = tbl.get_socket(fd)?;
@@ -1212,7 +1212,7 @@ fn register_net_tools(
12121212
// net_send
12131213
let t = table.clone();
12141214
tools.register("net_send", move |args| {
1215-
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))? as u32;
1215+
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))?;
12161216
let data_b64 = args["data"]
12171217
.as_str()
12181218
.ok_or_else(|| anyhow!("missing 'data'"))?;
@@ -1229,7 +1229,7 @@ fn register_net_tools(
12291229
let t = table.clone();
12301230
let pol = policy.clone();
12311231
tools.register("net_sendto", move |args| {
1232-
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))? as u32;
1232+
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))?;
12331233
let data_b64 = args["data"]
12341234
.as_str()
12351235
.ok_or_else(|| anyhow!("missing 'data'"))?;
@@ -1248,7 +1248,7 @@ fn register_net_tools(
12481248
// net_recv (alias for net_recvfrom with no addr returned for stream)
12491249
let t = table.clone();
12501250
tools.register("net_recv", move |args| {
1251-
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))? as u32;
1251+
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))?;
12521252
let len = args["len"].as_u64().unwrap_or(4096) as usize;
12531253
let mut buf = vec![std::mem::MaybeUninit::uninit(); len.min(65536)];
12541254
let tbl = t.lock().unwrap();
@@ -1265,7 +1265,7 @@ fn register_net_tools(
12651265
// net_recvfrom
12661266
let t = table.clone();
12671267
tools.register("net_recvfrom", move |args| {
1268-
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))? as u32;
1268+
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))?;
12691269
let len = args["len"].as_u64().unwrap_or(4096) as usize;
12701270
let mut buf = vec![0u8; len.min(65536)];
12711271

@@ -1290,15 +1290,15 @@ fn register_net_tools(
12901290
// net_close
12911291
let t = table.clone();
12921292
tools.register("net_close", move |args| {
1293-
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))? as u32;
1293+
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))?;
12941294
t.lock().unwrap().remove(fd)?;
12951295
Ok(json!({}))
12961296
});
12971297

12981298
// net_shutdown
12991299
let t = table.clone();
13001300
tools.register("net_shutdown", move |args| {
1301-
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))? as u32;
1301+
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))?;
13021302
let how = args["how"].as_i64().unwrap_or(2) as i32;
13031303
let shutdown = match how {
13041304
0 => std::net::Shutdown::Read,
@@ -1314,7 +1314,7 @@ fn register_net_tools(
13141314
// net_setsockopt
13151315
let t = table.clone();
13161316
tools.register("net_setsockopt", move |args| {
1317-
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))? as u32;
1317+
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))?;
13181318
let level = args["level"].as_i64().unwrap_or(0) as i32;
13191319
let optname = args["optname"].as_i64().unwrap_or(0) as i32;
13201320
let value = args["value"].as_i64().unwrap_or(0) as i32;
@@ -1338,7 +1338,7 @@ fn register_net_tools(
13381338
// net_getsockopt
13391339
let t = table.clone();
13401340
tools.register("net_getsockopt", move |args| {
1341-
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))? as u32;
1341+
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))?;
13421342
let level = args["level"].as_i64().unwrap_or(0) as i32;
13431343
let optname = args["optname"].as_i64().unwrap_or(0) as i32;
13441344
let tbl = t.lock().unwrap();
@@ -1359,7 +1359,7 @@ fn register_net_tools(
13591359
// net_getpeername
13601360
let t = table.clone();
13611361
tools.register("net_getpeername", move |args| {
1362-
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))? as u32;
1362+
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))?;
13631363
let tbl = t.lock().unwrap();
13641364
let sock = tbl.get_socket(fd)?;
13651365
let peer = sock.peer_addr()?;
@@ -1373,7 +1373,7 @@ fn register_net_tools(
13731373
// net_getsockname
13741374
let t = table.clone();
13751375
tools.register("net_getsockname", move |args| {
1376-
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))? as u32;
1376+
let fd = args["fd"].as_u64().ok_or_else(|| anyhow!("missing 'fd'"))?;
13771377
let tbl = t.lock().unwrap();
13781378
let sock = tbl.get_socket(fd)?;
13791379
let local = sock.local_addr()?;

0 commit comments

Comments
 (0)