aboutsummaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
authorMattias Grönlund <[email protected]>2022-08-09 00:53:32 +0200
committerDario Nieuwenhuis <[email protected]>2022-08-13 15:25:34 +0200
commit3388b5cecf95d6b0bc9cf5c952e9f0aa1e019b8a (patch)
tree1c6f65c26f8b64620195b4a9fb7d708d076c341b /src/lib.rs
parentddfbfa0132285963382a4d7290d506186da31369 (diff)
Improve data checks for VHD events
For some reason I got strange events on channel 1 (ASYNCEVENT_HEADER): 0.647329 WARN unexpected ehternet type 0x0508, expected Qualcom ether type 0x886c This patch improves the validation of BCD WHD events to minimize the risk for panic.
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs53
1 files changed, 44 insertions, 9 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 133ce3161..3d08370c7 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -815,20 +815,55 @@ where
815 trace!(" {:?}", bcd_header); 815 trace!(" {:?}", bcd_header);
816 816
817 let packet_start = BcdHeader::SIZE + 4 * bcd_header.data_offset as usize; 817 let packet_start = BcdHeader::SIZE + 4 * bcd_header.data_offset as usize;
818 if packet_start > payload.len() { 818
819 warn!("packet start out of range."); 819 if packet_start + EventPacket::SIZE > payload.len() {
820 warn!("BCD event, incomplete header");
821 return;
822 }
823 let bcd_packet = &payload[packet_start..];
824 trace!(" {:02x}", &bcd_packet[..(bcd_packet.len() as usize).min(36)]);
825
826 let mut event_packet = EventPacket::from_bytes(&bcd_packet[..EventPacket::SIZE].try_into().unwrap());
827 event_packet.byteswap();
828
829 const ETH_P_LINK_CTL: u16 = 0x886c; // HPNA, wlan link local tunnel, according to linux if_ether.h
830 if event_packet.eth.ether_type != ETH_P_LINK_CTL {
831 warn!(
832 "unexpected ethernet type 0x{:04x}, expected Broadcom ether type 0x{:04x}",
833 event_packet.eth.ether_type, ETH_P_LINK_CTL
834 );
835 return;
836 }
837 const BROADCOM_OUI: &[u8] = &[0x00, 0x10, 0x18];
838 if event_packet.hdr.oui != BROADCOM_OUI {
839 warn!(
840 "unexpected ethernet OUI {:02x}, expected Broadcom OUI {:02x}",
841 event_packet.hdr.oui, BROADCOM_OUI
842 );
843 return;
844 }
845 const BCMILCP_SUBTYPE_VENDOR_LONG: u16 = 32769;
846 if event_packet.hdr.subtype != BCMILCP_SUBTYPE_VENDOR_LONG {
847 warn!("unexpected subtype {}", event_packet.hdr.subtype);
848 return;
849 }
850
851 const BCMILCP_BCM_SUBTYPE_EVENT: u16 = 1;
852 if event_packet.hdr.user_subtype != BCMILCP_BCM_SUBTYPE_EVENT {
853 warn!("unexpected user_subtype {}", event_packet.hdr.subtype);
854 return;
855 }
856
857 if event_packet.msg.datalen as usize >= (bcd_packet.len() - EventMessage::SIZE) {
858 warn!("BCD event, incomplete data");
820 return; 859 return;
821 } 860 }
822 let packet = &payload[packet_start..];
823 trace!(" {:02x}", &packet[..(packet.len() as usize).min(36)]);
824 861
825 let mut evt = EventHeader::from_bytes(&packet[24..][..EventHeader::SIZE].try_into().unwrap()); 862 let evt_data = &bcd_packet[EventMessage::SIZE..][..event_packet.msg.datalen as usize];
826 evt.byteswap();
827 let evt_data = &packet[24 + EventHeader::SIZE..][..evt.datalen as usize];
828 debug!( 863 debug!(
829 "=== EVENT {}: {} {:02x}", 864 "=== EVENT {}: {} {:02x}",
830 events::Event::from(evt.event_type as u8), 865 events::Event::from(event_packet.msg.event_type as u8),
831 evt, 866 event_packet.msg,
832 evt_data 867 evt_data
833 ); 868 );
834 } 869 }