OSDN Git Service

rusty-gd: properly read ACL data from the HAL
authorZach Johnson <zachoverflow@google.com>
Sun, 15 Nov 2020 00:34:07 +0000 (16:34 -0800)
committerZach Johnson <zachoverflow@google.com>
Mon, 23 Nov 2020 21:09:26 +0000 (13:09 -0800)
Bug: 171749953
Tag: #gd-refactor
Test: gd/cert/run --rhost
Change-Id: Ic6ed193f89a689a255820704b606b8ffb03a9ee0

gd/rust/hal/src/rootcanal_hal.rs

index d32de66..03e8900 100644 (file)
@@ -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();
             }
         }
     }