Function to write to data socket and read the response from it
(&mut self, cmd: &mut BackendCmd)
| 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 |
no test coverage detected