DragonFlyBSD Kernel Audit
DF-0586 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/netbt/hci_socket.c b/sys/netbt/hci_socket.c
--- a/sys/netbt/hci_socket.c
+++ b/sys/netbt/hci_socket.c
@@ -86,6 +86,8 @@
 
 LIST_HEAD(hci_pcb_list, hci_pcb) hci_pcb = LIST_HEAD_INITIALIZER(hci_pcb);
 
+struct lock hci_pcb_lock = LOCK_INITIALIZER("hci_pcb", 0, 0);
+
 /* sysctl defaults */
 int hci_sendspace = HCI_CMD_PKT_SIZE;
 int hci_recvspace = 4096;
@@ -573,7 +575,9 @@
 		so->so_pcb = NULL;
 		sofree(so);		/* remove pcb ref */
 
+		lockmgr(&hci_pcb_lock, LK_EXCLUSIVE);
 		LIST_REMOVE(pcb, hp_next);
+		lockmgr(&hci_pcb_lock, LK_RELEASE);
 		kfree(pcb, M_PCB);
 		error = 0;
 	}
@@ -652,9 +656,9 @@
 	hci_filter_set(HCI_EVENT_COMMAND_STATUS, &pcb->hp_efilter);
 	hci_filter_set(HCI_EVENT_PKT, &pcb->hp_pfilter);
 
-	crit_enter();
+	lockmgr(&hci_pcb_lock, LK_EXCLUSIVE);
 	LIST_INSERT_HEAD(&hci_pcb, pcb, hp_next);
-	crit_exit();
+	lockmgr(&hci_pcb_lock, LK_RELEASE);
 	error = 0;
 out:
 	lwkt_replymsg(&msg->attach.base.lmsg, error);
@@ -932,6 +936,7 @@
 	sa.bt_family = AF_BLUETOOTH;
 	bdaddr_copy(&sa.bt_bdaddr, &unit->hci_bdaddr);
 
+	lockmgr(&hci_pcb_lock, LK_SHARED);
 	LIST_FOREACH(pcb, &hci_pcb, hp_next) {
 		/*
 		 * filter according to source address
@@ -1009,6 +1014,7 @@
 			m_freem(m0);
 		}
 	}
+	lockmgr(&hci_pcb_lock, LK_RELEASE);
 }
 
 struct pr_usrreqs hci_usrreqs = {