Skip to content

Commit 9fb023b

Browse files
committed
Closing TcpListeners
1 parent 4dc0b4b commit 9fb023b

File tree

2 files changed

+33
-2
lines changed
  • fortanix-vme

2 files changed

+33
-2
lines changed

fortanix-vme/fortanix-vme-abi/src/lib.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ pub enum Request {
2626
Accept {
2727
/// The Vsock port the enclave is listening on
2828
enclave_port: u32,
29-
}
29+
},
30+
Close {
31+
enclave_port: u32,
32+
},
3033
}
3134

3235
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
@@ -87,7 +90,8 @@ pub enum Response {
8790
/// The vsock port number the runner will connect to the enclave in order to forward the
8891
/// incoming connection
8992
proxy_port: u32,
90-
}
93+
},
94+
Closed,
9195
}
9296

9397
#[cfg(test)]

fortanix-vme/fortanix-vme-runner/src/lib.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,10 @@ impl Server {
313313
self.listeners.read().unwrap().get(&addr).cloned()
314314
}
315315

316+
fn remove_listener(&self, addr: &VsockAddr) -> Option<Arc<Mutex<Listener>>> {
317+
self.listeners.write().unwrap().remove(&addr)
318+
}
319+
316320
// Preliminary work for PLAT-367
317321
#[allow(dead_code)]
318322
fn connection(&self, enclave: VsockAddr, runner: VsockAddr) -> Option<ConnectionInfo> {
@@ -413,11 +417,34 @@ impl Server {
413417
}
414418
}
415419

420+
fn handle_request_close(self: Arc<Self>, enclave_port: u32, enclave: &mut VsockStream) -> Result<(), IoError> {
421+
let cid: u32 = enclave.peer().unwrap().parse().unwrap_or(vsock::VMADDR_CID_HYPERVISOR);
422+
let addr = VsockAddr::new(cid, enclave_port);
423+
if let Some(listener) = self.remove_listener(&addr) {
424+
// Close `TcpListener`
425+
drop(listener);
426+
} else {
427+
// Info not found, possibly not a listener socket
428+
}
429+
let response = Response::Closed;
430+
Self::log_communication(
431+
"runner",
432+
enclave.local_port().unwrap_or_default(),
433+
"enclave",
434+
enclave.peer_port().unwrap_or_default(),
435+
&format!("{:?}", &response),
436+
Direction::Right,
437+
"vsock");
438+
enclave.write(&serde_cbor::ser::to_vec(&response).unwrap())?;
439+
Ok(())
440+
}
441+
416442
fn handle_client(self: Arc<Self>, stream: &mut VsockStream) -> Result<(), IoError> {
417443
match Self::read_request(stream) {
418444
Ok(Request::Connect{ addr }) => self.handle_request_connect(&addr, stream)?,
419445
Ok(Request::Bind{ addr, enclave_port }) => self.handle_request_bind(&addr, enclave_port, stream)?,
420446
Ok(Request::Accept{ enclave_port }) => self.handle_request_accept(enclave_port, stream)?,
447+
Ok(Request::Close{ enclave_port }) => self.handle_request_close(enclave_port, stream)?,
421448
Err(_e) => return Err(IoError::new(IoErrorKind::InvalidData, "Failed to read request")),
422449
};
423450
Ok(())

0 commit comments

Comments
 (0)