DF-0559 / fix.diff
diff --git a/sys/netbt/hci_event.c b/sys/netbt/hci_event.c --- a/sys/netbt/hci_event.c +++ b/sys/netbt/hci_event.c @@ -451,8 +451,14 @@ DPRINTFN(1, "(%s) %d response%s\n", device_get_nameunit(unit->hci_dev), ep.num_responses, (ep.num_responses == 1 ? "" : "s")); + if (m->m_pkthdr.len < ep.num_responses * sizeof(ir)) { + kprintf("%s: malformed Inquiry_Result: claims %d responses " + "but only %d bytes remain\n", + device_get_nameunit(unit->hci_dev), ep.num_responses, + m->m_pkthdr.len); + return; + } while(ep.num_responses--) { - KKASSERT(m->m_pkthdr.len >= sizeof(ir)); m_copydata(m, 0, sizeof(ir), &ir); m_adj(m, sizeof(ir)); @@ -488,8 +494,14 @@ DPRINTFN(1, "%d response%s\n", ep.num_responses, (ep.num_responses == 1 ? "" : "s")); + if (m->m_pkthdr.len < ep.num_responses * sizeof(rr)) { + kprintf("%s: malformed Inquiry_Result_with_RSSI: claims %d " + "responses but only %d bytes remain\n", + device_get_nameunit(unit->hci_dev), ep.num_responses, + m->m_pkthdr.len); + return; + } while(ep.num_responses--) { - KKASSERT(m->m_pkthdr.len >= sizeof(rr)); m_copydata(m, 0, sizeof(rr), &rr); m_adj(m, sizeof(rr)); |