⬢ DragonFlyBSD Kernel Audit
DF-5733 / fix.diff
← back to finding ↓ download raw
--- a/sys/netbt/rfcomm_session.c
+++ b/sys/netbt/rfcomm_session.c
@@ -1371,7 +1371,13 @@
 
 		callout_stop(&dlc->rd_timeout);
 
-		if (pn.mtu > RFCOMM_MTU_MAX || pn.mtu > dlc->rd_mtu) {
+		/*
+		 * reject invalid or unacceptable MTU.  The lower bound is
+		 * mandatory: rd_mtu == 0 reaches a divide-by-zero in
+		 * rfcomm_dlc_start() (rd_rxsize / rd_mtu).
+		 */
+		if (pn.mtu < RFCOMM_MTU_MIN ||
+		    pn.mtu > RFCOMM_MTU_MAX || pn.mtu > dlc->rd_mtu) {
 			dlc->rd_state = RFCOMM_DLC_WAIT_DISCONNECT;
 			err = rfcomm_session_send_frame(rs, RFCOMM_FRAME_DISC,
 							pn.dlci);