mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-07-07 10:15:45 +00:00
tpm: save almost 8KB stack space
The largest possible PTM response is only 16 bytes. Size the output buffer correctly. In the socket read function, rely on the caller to provide a sufficiently large buffer. That eliminates another large stack variable. In total this saves almost 8KB stack space. Signed-off-by: Wei Liu <liuwe@microsoft.com>
This commit is contained in:
parent
8e996ff2fe
commit
6e22f23831
@ -216,7 +216,16 @@ impl Emulator {
|
|||||||
))
|
))
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
let mut output = [0_u8; TPM_CRB_BUFFER_MAX];
|
// The largest response is 16 bytes so far.
|
||||||
|
if msg_len_out > 16 {
|
||||||
|
return Err(Error::RunControlCmd(anyhow!(
|
||||||
|
"Response size is too large for Cmd {:02X?}, max 16 wanted {}",
|
||||||
|
cmd,
|
||||||
|
msg_len_out
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut output = [0u8; 16];
|
||||||
|
|
||||||
// Every Control Cmd gets atleast a result code in response. Read it
|
// Every Control Cmd gets atleast a result code in response. Read it
|
||||||
let read_size = self.control_socket.read(&mut output).map_err(|e| {
|
let read_size = self.control_socket.read(&mut output).map_err(|e| {
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
//
|
//
|
||||||
|
|
||||||
use crate::TPM_CRB_BUFFER_MAX;
|
|
||||||
use anyhow::anyhow;
|
use anyhow::anyhow;
|
||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
use std::os::unix::io::{AsRawFd, RawFd};
|
use std::os::unix::io::{AsRawFd, RawFd};
|
||||||
@ -122,23 +121,15 @@ impl SocketDev {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
|
pub fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
|
||||||
let newbuf: &mut [u8] = &mut [0; TPM_CRB_BUFFER_MAX];
|
|
||||||
|
|
||||||
if self.stream.is_none() {
|
if self.stream.is_none() {
|
||||||
return Err(Error::ReadFromSocket(anyhow!(
|
return Err(Error::ReadFromSocket(anyhow!(
|
||||||
"Stream for tpm socket was not initialized"
|
"Stream for tpm socket was not initialized"
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
let mut socket = self.stream.as_ref().unwrap();
|
let mut socket = self.stream.as_ref().unwrap();
|
||||||
let size: usize = socket.read(newbuf).map_err(|e| {
|
let size: usize = socket.read(buf).map_err(|e| {
|
||||||
Error::ReadFromSocket(anyhow!("Failed to read from socket. Error Code {:?}", e))
|
Error::ReadFromSocket(anyhow!("Failed to read from socket. Error Code {:?}", e))
|
||||||
})?;
|
})?;
|
||||||
if buf.len() < size {
|
|
||||||
return Err(Error::ReadFromSocket(anyhow!(
|
|
||||||
"Input buffer is of insufficient size"
|
|
||||||
)));
|
|
||||||
}
|
|
||||||
buf[0..size].clone_from_slice(&newbuf[0..size]);
|
|
||||||
Ok(size)
|
Ok(size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user