From 55fc3947e9bddf258bd70cd021db93ae972605c9 Mon Sep 17 00:00:00 2001 From: Zach Johnson Date: Sat, 14 Nov 2020 16:34:07 -0800 Subject: [PATCH] rusty-gd: properly read ACL data from the HAL Bug: 171749953 Tag: #gd-refactor Test: gd/cert/run --rhost Change-Id: Ic6ed193f89a689a255820704b606b8ffb03a9ee0 --- gd/rust/hal/src/rootcanal_hal.rs | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/gd/rust/hal/src/rootcanal_hal.rs b/gd/rust/hal/src/rootcanal_hal.rs index d32de6692..03e89009d 100644 --- a/gd/rust/hal/src/rootcanal_hal.rs +++ b/gd/rust/hal/src/rootcanal_hal.rs @@ -52,21 +52,28 @@ impl RootcanalHal { R: AsyncReadExt + Unpin, { let mut reader = BufReader::new(reader); - let header_size = H4_HEADER_SIZE + HciPacketHeaderSize::Event as usize; loop { - let mut header = BytesMut::with_capacity(1024); - header.resize(header_size, 0); - reader.read_exact(&mut header).await?; - let param_len: usize = header[2].into(); - let mut payload = header.split_off(header_size); - payload.resize(param_len, 0); - reader.read_exact(&mut payload).await?; - let h4_type = header.split_to(H4_HEADER_SIZE); - header.unsplit(payload); - if h4_type[0] == HciPacketType::Event as u8 { - evt_tx.send(header.freeze()).unwrap(); - } else if h4_type[0] == HciPacketType::Acl as u8 { - acl_tx.send(header.freeze()).unwrap(); + let mut buffer = BytesMut::with_capacity(1024); + buffer.resize(H4_HEADER_SIZE, 0); + reader.read_exact(&mut buffer).await?; + if buffer[0] == HciPacketType::Event as u8 { + buffer.resize(HciPacketHeaderSize::Event as usize, 0); + reader.read_exact(&mut buffer).await?; + let len: usize = buffer[1].into(); + let mut payload = buffer.split_off(HciPacketHeaderSize::Event as usize); + payload.resize(len, 0); + reader.read_exact(&mut payload).await?; + buffer.unsplit(payload); + evt_tx.send(buffer.freeze()).unwrap(); + } else if buffer[0] == HciPacketType::Acl as u8 { + buffer.resize(HciPacketHeaderSize::Acl as usize, 0); + reader.read_exact(&mut buffer).await?; + let len: usize = (buffer[2] as u16 + ((buffer[3] as u16) << 8)).into(); + let mut payload = buffer.split_off(HciPacketHeaderSize::Event as usize); + payload.resize(len, 0); + reader.read_exact(&mut payload).await?; + buffer.unsplit(payload); + acl_tx.send(buffer.freeze()).unwrap(); } } } -- 2.11.0