Module Name: src
Committed By: plunky
Date: Wed Jul 27 10:25:09 UTC 2011
Modified Files:
src/sys/netbt: hci_event.c hci_link.c l2cap_signal.c rfcomm_session.c
Log Message:
cleanup some DIAGNOSTIC and KASSERT code
- remove #ifdef DIAGNOSTIC, so that we won't act
differently
- handle the cases where a Bluetooth adapter
sends invalid packet data (I've not seen this,
but it is not impossible)
- use KASSERT for actual impossible situations
(to catch bad future development)
To generate a diff of this commit:
cvs rdiff -u -r1.22 -r1.23 src/sys/netbt/hci_event.c src/sys/netbt/hci_link.c
cvs rdiff -u -r1.13 -r1.14 src/sys/netbt/l2cap_signal.c
cvs rdiff -u -r1.17 -r1.18 src/sys/netbt/rfcomm_session.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/netbt/hci_event.c
diff -u src/sys/netbt/hci_event.c:1.22 src/sys/netbt/hci_event.c:1.23
--- src/sys/netbt/hci_event.c:1.22 Mon Nov 22 19:56:51 2010
+++ src/sys/netbt/hci_event.c Wed Jul 27 10:25:09 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: hci_event.c,v 1.22 2010/11/22 19:56:51 plunky Exp $ */
+/* $NetBSD: hci_event.c,v 1.23 2011/07/27 10:25:09 plunky Exp $ */
/*-
* Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hci_event.c,v 1.22 2010/11/22 19:56:51 plunky Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hci_event.c,v 1.23 2011/07/27 10:25:09 plunky Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -157,8 +157,7 @@
* process HCI Events
*
* We will free the mbuf at the end, no need for any sub
- * functions to handle that. We kind of assume that the
- * device sends us valid events.
+ * functions to handle that.
*/
void
hci_event(struct mbuf *m, struct hci_unit *unit)
@@ -167,11 +166,15 @@
KASSERT(m->m_flags & M_PKTHDR);
- KASSERT(m->m_pkthdr.len >= sizeof(hdr));
+ if (m->m_pkthdr.len < sizeof(hdr))
+ goto done;
+
m_copydata(m, 0, sizeof(hdr), &hdr);
m_adj(m, sizeof(hdr));
KASSERT(hdr.type == HCI_EVENT_PKT);
+ if (m->m_pkthdr.len != hdr.length)
+ goto done;
DPRINTFN(1, "(%s) event %s\n",
device_xname(unit->hci_dev), hci_eventstr(hdr.event));
@@ -233,6 +236,7 @@
break;
}
+done:
m_freem(m);
}
@@ -246,7 +250,9 @@
{
hci_command_status_ep ep;
- KASSERT(m->m_pkthdr.len >= sizeof(ep));
+ if (m->m_pkthdr.len < sizeof(ep))
+ return;
+
m_copydata(m, 0, sizeof(ep), &ep);
m_adj(m, sizeof(ep));
@@ -292,7 +298,9 @@
hci_command_compl_ep ep;
hci_status_rp rp;
- KASSERT(m->m_pkthdr.len >= sizeof(ep));
+ if (m->m_pkthdr.len < sizeof(ep))
+ return;
+
m_copydata(m, 0, sizeof(ep), &ep);
m_adj(m, sizeof(ep));
@@ -369,7 +377,9 @@
uint16_t handle, num;
int num_acl = 0, num_sco = 0;
- KASSERT(m->m_pkthdr.len >= sizeof(ep));
+ if (m->m_pkthdr.len < sizeof(ep))
+ return;
+
m_copydata(m, 0, sizeof(ep), &ep);
m_adj(m, sizeof(ep));
@@ -439,7 +449,9 @@
hci_inquiry_response ir;
struct hci_memo *memo;
- KASSERT(m->m_pkthdr.len >= sizeof(ep));
+ if (m->m_pkthdr.len < sizeof(ep))
+ return;
+
m_copydata(m, 0, sizeof(ep), &ep);
m_adj(m, sizeof(ep));
@@ -447,7 +459,9 @@
(ep.num_responses == 1 ? "" : "s"));
while(ep.num_responses--) {
- KASSERT(m->m_pkthdr.len >= sizeof(ir));
+ if (m->m_pkthdr.len < sizeof(ir))
+ return;
+
m_copydata(m, 0, sizeof(ir), &ir);
m_adj(m, sizeof(ir));
@@ -476,7 +490,9 @@
hci_rssi_response rr;
struct hci_memo *memo;
- KASSERT(m->m_pkthdr.len >= sizeof(ep));
+ if (m->m_pkthdr.len < sizeof(ep))
+ return;
+
m_copydata(m, 0, sizeof(ep), &ep);
m_adj(m, sizeof(ep));
@@ -484,7 +500,9 @@
(ep.num_responses == 1 ? "" : "s"));
while(ep.num_responses--) {
- KASSERT(m->m_pkthdr.len >= sizeof(rr));
+ if (m->m_pkthdr.len < sizeof(rr))
+ return;
+
m_copydata(m, 0, sizeof(rr), &rr);
m_adj(m, sizeof(rr));
@@ -512,7 +530,9 @@
hci_extended_result_ep ep;
struct hci_memo *memo;
- KASSERT(m->m_pkthdr.len >= sizeof(ep));
+ if (m->m_pkthdr.len < sizeof(ep))
+ return;
+
m_copydata(m, 0, sizeof(ep), &ep);
m_adj(m, sizeof(ep));
@@ -546,7 +566,9 @@
struct hci_link *link;
int err;
- KASSERT(m->m_pkthdr.len >= sizeof(ep));
+ if (m->m_pkthdr.len < sizeof(ep))
+ return;
+
m_copydata(m, 0, sizeof(ep), &ep);
m_adj(m, sizeof(ep));
@@ -641,7 +663,9 @@
hci_discon_compl_ep ep;
struct hci_link *link;
- KASSERT(m->m_pkthdr.len >= sizeof(ep));
+ if (m->m_pkthdr.len < sizeof(ep))
+ return;
+
m_copydata(m, 0, sizeof(ep), &ep);
m_adj(m, sizeof(ep));
@@ -668,7 +692,9 @@
hci_reject_con_cp rp;
struct hci_link *link;
- KASSERT(m->m_pkthdr.len >= sizeof(ep));
+ if (m->m_pkthdr.len < sizeof(ep))
+ return;
+
m_copydata(m, 0, sizeof(ep), &ep);
m_adj(m, sizeof(ep));
@@ -715,7 +741,9 @@
struct hci_link *link;
int err;
- KASSERT(m->m_pkthdr.len >= sizeof(ep));
+ if (m->m_pkthdr.len < sizeof(ep))
+ return;
+
m_copydata(m, 0, sizeof(ep), &ep);
m_adj(m, sizeof(ep));
@@ -757,7 +785,9 @@
struct hci_link *link;
int err;
- KASSERT(m->m_pkthdr.len >= sizeof(ep));
+ if (m->m_pkthdr.len < sizeof(ep))
+ return;
+
m_copydata(m, 0, sizeof(ep), &ep);
m_adj(m, sizeof(ep));
@@ -801,7 +831,9 @@
struct hci_link *link;
int err;
- KASSERT(m->m_pkthdr.len >= sizeof(ep));
+ if (m->m_pkthdr.len < sizeof(ep))
+ return;
+
m_copydata(m, 0, sizeof(ep), &ep);
m_adj(m, sizeof(ep));
@@ -841,7 +873,9 @@
hci_read_clock_offset_compl_ep ep;
struct hci_link *link;
- KASSERT(m->m_pkthdr.len >= sizeof(ep));
+ if (m->m_pkthdr.len < sizeof(ep))
+ return;
+
m_copydata(m, 0, sizeof(ep), &ep);
m_adj(m, sizeof(ep));
@@ -865,7 +899,9 @@
{
hci_read_bdaddr_rp rp;
- KASSERT(m->m_pkthdr.len >= sizeof(rp));
+ if (m->m_pkthdr.len < sizeof(rp))
+ return;
+
m_copydata(m, 0, sizeof(rp), &rp);
m_adj(m, sizeof(rp));
@@ -890,7 +926,9 @@
{
hci_read_buffer_size_rp rp;
- KASSERT(m->m_pkthdr.len >= sizeof(rp));
+ if (m->m_pkthdr.len < sizeof(rp))
+ return;
+
m_copydata(m, 0, sizeof(rp), &rp);
m_adj(m, sizeof(rp));
@@ -920,7 +958,9 @@
{
hci_read_local_features_rp rp;
- KASSERT(m->m_pkthdr.len >= sizeof(rp));
+ if (m->m_pkthdr.len < sizeof(rp))
+ return;
+
m_copydata(m, 0, sizeof(rp), &rp);
m_adj(m, sizeof(rp));
@@ -1029,7 +1069,9 @@
{
hci_read_local_extended_features_rp rp;
- KASSERT(m->m_pkthdr.len >= sizeof(rp));
+ if (m->m_pkthdr.len < sizeof(rp))
+ return;
+
m_copydata(m, 0, sizeof(rp), &rp);
m_adj(m, sizeof(rp));
@@ -1076,7 +1118,9 @@
{
hci_read_local_ver_rp rp;
- KASSERT(m->m_pkthdr.len >= sizeof(rp));
+ if (m->m_pkthdr.len < sizeof(rp))
+ return;
+
m_copydata(m, 0, sizeof(rp), &rp);
m_adj(m, sizeof(rp));
@@ -1103,7 +1147,9 @@
{
hci_read_local_commands_rp rp;
- KASSERT(m->m_pkthdr.len >= sizeof(rp));
+ if (m->m_pkthdr.len < sizeof(rp))
+ return;
+
m_copydata(m, 0, sizeof(rp), &rp);
m_adj(m, sizeof(rp));
@@ -1132,7 +1178,9 @@
struct hci_link *link, *next;
int acl;
- KASSERT(m->m_pkthdr.len >= sizeof(rp));
+ if (m->m_pkthdr.len < sizeof(rp))
+ return;
+
m_copydata(m, 0, sizeof(rp), &rp);
m_adj(m, sizeof(rp));
Index: src/sys/netbt/hci_link.c
diff -u src/sys/netbt/hci_link.c:1.22 src/sys/netbt/hci_link.c:1.23
--- src/sys/netbt/hci_link.c:1.22 Thu Oct 14 07:05:03 2010
+++ src/sys/netbt/hci_link.c Wed Jul 27 10:25:09 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: hci_link.c,v 1.22 2010/10/14 07:05:03 plunky Exp $ */
+/* $NetBSD: hci_link.c,v 1.23 2011/07/27 10:25:09 plunky Exp $ */
/*-
* Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hci_link.c,v 1.22 2010/10/14 07:05:03 plunky Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hci_link.c,v 1.23 2011/07/27 10:25:09 plunky Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -432,29 +432,22 @@
KASSERT(m != NULL);
KASSERT(unit != NULL);
- KASSERT(m->m_pkthdr.len >= sizeof(hdr));
+ if (m->m_pkthdr.len < sizeof(hdr))
+ goto bad;
+
m_copydata(m, 0, sizeof(hdr), &hdr);
m_adj(m, sizeof(hdr));
-#ifdef DIAGNOSTIC
- if (hdr.type != HCI_ACL_DATA_PKT) {
- aprint_error_dev(unit->hci_dev, "bad ACL packet type\n");
- goto bad;
- }
-
- if (m->m_pkthdr.len != le16toh(hdr.length)) {
- aprint_error_dev(unit->hci_dev,
- "bad ACL packet length (%d != %d)\n",
- m->m_pkthdr.len, le16toh(hdr.length));
- goto bad;
- }
-#endif
+ KASSERT(hdr.type == HCI_ACL_DATA_PKT);
hdr.length = le16toh(hdr.length);
hdr.con_handle = le16toh(hdr.con_handle);
handle = HCI_CON_HANDLE(hdr.con_handle);
pb = HCI_PB_FLAG(hdr.con_handle);
+ if (m->m_pkthdr.len != hdr.length)
+ goto bad;
+
link = hci_link_lookup_handle(unit, handle);
if (link == NULL) {
hci_discon_cp cp;
@@ -486,10 +479,8 @@
aprint_error_dev(unit->hci_dev,
"dropped incomplete ACL packet\n");
- if (m->m_pkthdr.len < sizeof(l2cap_hdr_t)) {
- aprint_error_dev(unit->hci_dev, "short ACL packet\n");
+ if (m->m_pkthdr.len < sizeof(l2cap_hdr_t))
goto bad;
- }
link->hl_rxp = m;
got = m->m_pkthdr.len;
@@ -510,7 +501,9 @@
break;
default:
- aprint_error_dev(unit->hci_dev, "unknown packet type\n");
+ DPRINTF("%s: unknown packet type\n",
+ device_xname(unit->hci_dev));
+
goto bad;
}
@@ -837,28 +830,20 @@
KASSERT(m != NULL);
KASSERT(unit != NULL);
- KASSERT(m->m_pkthdr.len >= sizeof(hdr));
- m_copydata(m, 0, sizeof(hdr), &hdr);
- m_adj(m, sizeof(hdr));
-
-#ifdef DIAGNOSTIC
- if (hdr.type != HCI_SCO_DATA_PKT) {
- aprint_error_dev(unit->hci_dev, "bad SCO packet type\n");
+ if (m->m_pkthdr.len < sizeof(hdr))
goto bad;
- }
- if (m->m_pkthdr.len != hdr.length) {
- aprint_error_dev(unit->hci_dev,
- "bad SCO packet length (%d != %d)\n",
- m->m_pkthdr.len, hdr.length);
+ m_copydata(m, 0, sizeof(hdr), &hdr);
+ m_adj(m, sizeof(hdr));
- goto bad;
- }
-#endif
+ KASSERT(hdr.type == HCI_SCO_DATA_PKT);
hdr.con_handle = le16toh(hdr.con_handle);
handle = HCI_CON_HANDLE(hdr.con_handle);
+ if (m->m_pkthdr.len != hdr.length)
+ goto bad;
+
link = hci_link_lookup_handle(unit, handle);
if (link == NULL || link->hl_type == HCI_LINK_ACL) {
DPRINTF("%s: dumping packet for unknown handle #%d\n",
Index: src/sys/netbt/l2cap_signal.c
diff -u src/sys/netbt/l2cap_signal.c:1.13 src/sys/netbt/l2cap_signal.c:1.14
--- src/sys/netbt/l2cap_signal.c:1.13 Sun Jul 17 20:54:53 2011
+++ src/sys/netbt/l2cap_signal.c Wed Jul 27 10:25:09 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: l2cap_signal.c,v 1.13 2011/07/17 20:54:53 joerg Exp $ */
+/* $NetBSD: l2cap_signal.c,v 1.14 2011/07/27 10:25:09 plunky Exp $ */
/*-
* Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: l2cap_signal.c,v 1.13 2011/07/17 20:54:53 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: l2cap_signal.c,v 1.14 2011/07/27 10:25:09 plunky Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -155,10 +155,7 @@
goto reject;
}
}
-
-#ifdef DIAGNOSTIC
panic("impossible!");
-#endif
reject:
l2cap_send_command_rej(link, cmd.ident, L2CAP_REJ_NOT_UNDERSTOOD);
@@ -930,14 +927,8 @@
l2cap_hdr_t *hdr;
l2cap_cmd_hdr_t *cmd;
-#ifdef DIAGNOSTIC
- if (link == NULL)
- return ENETDOWN;
-
- if (sizeof(l2cap_cmd_hdr_t) + length > link->hl_mtu)
- aprint_error_dev(link->hl_unit->hci_dev,
- "exceeding L2CAP Signal MTU for link!\n");
-#endif
+ KASSERT(link != NULL);
+ KASSERT(sizeof(l2cap_cmd_hdr_t) + length <= link->hl_mtu);
m = m_gethdr(M_DONTWAIT, MT_DATA);
if (m == NULL)
Index: src/sys/netbt/rfcomm_session.c
diff -u src/sys/netbt/rfcomm_session.c:1.17 src/sys/netbt/rfcomm_session.c:1.18
--- src/sys/netbt/rfcomm_session.c:1.17 Wed Nov 17 20:19:25 2010
+++ src/sys/netbt/rfcomm_session.c Wed Jul 27 10:25:09 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: rfcomm_session.c,v 1.17 2010/11/17 20:19:25 plunky Exp $ */
+/* $NetBSD: rfcomm_session.c,v 1.18 2011/07/27 10:25:09 plunky Exp $ */
/*-
* Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rfcomm_session.c,v 1.17 2010/11/17 20:19:25 plunky Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rfcomm_session.c,v 1.18 2011/07/27 10:25:09 plunky Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -456,12 +456,11 @@
*/
while (count-- > 0) {
credit = SIMPLEQ_FIRST(&rs->rs_credits);
-#ifdef DIAGNOSTIC
if (credit == NULL) {
printf("%s: too many packets completed!\n", __func__);
break;
}
-#endif
+
dlc = credit->rc_dlc;
if (dlc != NULL) {
dlc->rd_pending--;