⬢ DragonFlyBSD Kernel Audit
DF-3478 / fix.diff
← back to finding ↓ download raw
--- a/sys/netgraph7/bluetooth/socket/ng_btsocket_l2cap.c
+++ b/sys/netgraph7/bluetooth/socket/ng_btsocket_l2cap.c
@@ -2435,8 +2435,6 @@
 ng_btsocket_l2cap_listen(netmsg_t msg)
 {
 	struct socket		*so = msg->listen.base.nm_so;
-	struct thread		*td = msg->listen.nm_td;
-	int			 backlog = msg->listen.nm_flags; /* XXX */
 	ng_btsocket_l2cap_pcb_p	 pcb = so2l2cap_pcb(so);
 	int			 error = 0;
 
@@ -2457,7 +2455,15 @@
 		error = EADDRNOTAVAIL;
 		goto out;
 	}
-	solisten(so, backlog, td);
+	/*
+	 * DO NOT call solisten() here: on DragonFly the listen(2) path
+	 * already ran it on the syscall side (kern_listen() -> solisten()
+	 * sets SO_ACCEPTCONN/so_qlimit and THEN calls so_pru_listen(),
+	 * which dispatches to this handler).  Calling solisten() again
+	 * re-enters so_pru_listen() and recurses without bound (inline
+	 * dispatch on the netisr cpu0 port) until the kernel stack
+	 * overflows -> double fault -> unprivileged kernel panic.
+	 */

 out:
 	lwkt_replymsg(&msg->listen.base.lmsg, error);