From b5e2c9767814275d4d9e2f34ea586a604794bfa1 Mon Sep 17 00:00:00 2001 From: edef Date: Sat, 14 Feb 2026 23:13:18 +0000 Subject: [PATCH 1/2] fix(vsock): don't clobber port with CID on connect self.port was assigned ep.cid instead of self.cid, causing subsequent read/write calls to look up a nonexistent port in VSOCK_MAP and fail with EINVAL. --- src/fd/socket/vsock.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fd/socket/vsock.rs b/src/fd/socket/vsock.rs index 949a47112d..bd77010d06 100644 --- a/src/fd/socket/vsock.rs +++ b/src/fd/socket/vsock.rs @@ -161,7 +161,7 @@ impl ObjectInterface for Socket { const HEADER_SIZE: usize = mem::size_of::(); let port = VSOCK_MAP.lock().connect(ep.port, ep.cid)?; self.port = port; - self.port = ep.cid; + self.cid = ep.cid; future::poll_fn(|cx| { if let Some(mut driver_guard) = hardware::get_vsock_driver().unwrap().try_lock() From ce037fe0901cfe306cf5cfce56ac225625ed437b Mon Sep 17 00:00:00 2001 From: edef Date: Sat, 14 Feb 2026 23:13:26 +0000 Subject: [PATCH 2/2] fix(vsock): read peer_buf_alloc from connect response The Op::Response handler set state to Connected but never read buf_alloc or fwd_cnt from the response header. Since RawSocket initializes peer_buf_alloc to 0, the write path would block forever (0 >= 0 means "no peer buffer space available"). --- src/executor/vsock.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/executor/vsock.rs b/src/executor/vsock.rs index f992a478d5..d4a470fd50 100644 --- a/src/executor/vsock.rs +++ b/src/executor/vsock.rs @@ -119,6 +119,9 @@ async fn vsock_run() { } else if op == Op::Response && type_ == Type::Stream { if raw.remote_cid == header_cid && raw.state == VsockState::Connecting { raw.state = VsockState::Connected; + raw.peer_buf_alloc = header.buf_alloc.to_ne(); + raw.peer_fwd_cnt = header.fwd_cnt.to_ne(); + raw.tx_waker.wake(); } } else if raw.remote_cid == header_cid { hdr = Some(*header);