Merge "Process large messages from TA"

This commit is contained in:
Hasini Gunasinghe 2022-12-14 16:33:24 +00:00 committed by Gerrit Code Review
commit 6dfeccf9c8

View file

@ -14,7 +14,9 @@
// limitations under the License.
//! This module implements the HAL service for Keymint (Rust) in Trusty.
use kmr_hal::{keymint, rpc, secureclock, send_hal_info, sharedsecret, SerializedChannel};
use kmr_hal::{
extract_rsp, keymint, rpc, secureclock, send_hal_info, sharedsecret, SerializedChannel,
};
use log::{error, info};
use std::{
ffi::CString,
@ -41,6 +43,7 @@ struct HalServiceError(String);
struct TipcChannel(trusty::TipcChannel);
impl SerializedChannel for TipcChannel {
const MAX_SIZE: usize = 4000;
fn execute(&mut self, serialized_req: &[u8]) -> binder::Result<Vec<u8>> {
self.0.send(serialized_req).map_err(|e| {
binder::Status::new_exception(
@ -54,21 +57,27 @@ impl SerializedChannel for TipcChannel {
),
)
})?;
let mut recv_buf = Vec::new();
// TODO(b/253501976): cope with fragmentation of responses
self.0.recv(&mut recv_buf).map_err(|e| {
binder::Status::new_exception(
binder::ExceptionCode::TRANSACTION_FAILED,
Some(
&CString::new(format!(
"Failed to receive the response via tipc channel because of {:?}",
e
))
.unwrap(),
),
)
})?;
Ok(recv_buf)
let mut expect_more_msgs = true;
let mut full_rsp = Vec::new();
while expect_more_msgs {
let mut recv_buf = Vec::new();
self.0.recv(&mut recv_buf).map_err(|e| {
binder::Status::new_exception(
binder::ExceptionCode::TRANSACTION_FAILED,
Some(
&CString::new(format!(
"Failed to receive the response via tipc channel because of {:?}",
e
))
.unwrap(),
),
)
})?;
let current_rsp_content;
(expect_more_msgs, current_rsp_content) = extract_rsp(&recv_buf)?;
full_rsp.extend_from_slice(current_rsp_content);
}
Ok(full_rsp)
}
}