MCPcopy Create free account
hub / github.com/cloud-hypervisor/cloud-hypervisor / deliver_request

Method deliver_request

tpm/src/emulator.rs:310–377  ·  view source on GitHub ↗

Function to write to data socket and read the response from it

(&mut self, cmd: &mut BackendCmd)

Source from the content-addressed store, hash-verified

308
309 /// Function to write to data socket and read the response from it
310 pub fn deliver_request(&mut self, cmd: &mut BackendCmd) -> Result<()> {
311 // SAFETY: type "sockaddr_storage" is valid with an all-zero byte-pattern value
312 let mut addr: sockaddr_storage = unsafe { mem::zeroed() };
313 let mut len = mem::size_of::<sockaddr_storage>() as socklen_t;
314 let isselftest = is_selftest(&cmd.buffer[0..cmd.input_len]);
315
316 debug!(
317 "Send cmd: {:02X?} of len {:?} on data_ioc ",
318 cmd.buffer, cmd.input_len
319 );
320
321 let mut data_vecs = [libc::iovec {
322 iov_base: cmd.buffer.as_mut_ptr().cast(),
323 iov_len: cmd.input_len,
324 }; 1];
325
326 // SAFETY: all zero values from the unsafe method are updated before usage
327 let mut msghdr: libc::msghdr = unsafe { mem::zeroed() };
328 msghdr.msg_name = ptr::null_mut();
329 msghdr.msg_namelen = 0;
330 msghdr.msg_iov = data_vecs.as_mut_ptr().cast();
331 msghdr.msg_iovlen = data_vecs.len() as _;
332 msghdr.msg_control = ptr::null_mut();
333 msghdr.msg_controllen = 0;
334 msghdr.msg_flags = 0;
335 // SAFETY: FFI call and the return value of the unsafe method is checked
336 unsafe {
337 let ret = libc::sendmsg(self.data_fd, &msghdr, 0);
338 if ret == -1 {
339 return Err(Error::SendReceive(anyhow!(
340 "Failed to send tpm command over Data FD. Error Code {:?}",
341 std::io::Error::last_os_error()
342 )));
343 }
344 }
345
346 let output_len;
347 // SAFETY: FFI calls and return value from unsafe method is checked
348 unsafe {
349 let ret = libc::recvfrom(
350 self.data_fd,
351 cmd.buffer.as_mut_ptr().cast(),
352 cmd.buffer.len(),
353 0,
354 (&raw mut addr).cast(),
355 &raw mut len,
356 );
357 if ret == -1 {
358 return Err(Error::SendReceive(anyhow!(
359 "Failed to receive response for tpm command over Data FD. Error Code {:?}",
360 std::io::Error::last_os_error()
361 )));
362 }
363 output_len = ret as usize;
364 }
365 debug!(
366 "response = {:02X?} len = {:?} selftest = {:?}",
367 cmd.buffer, output_len, isselftest

Callers 1

writeMethod · 0.80

Calls 3

is_selftestFunction · 0.85
as_mut_ptrMethod · 0.80
lenMethod · 0.45

Tested by

no test coverage detected