⬢ DragonFlyBSD Kernel Audit
DF-4733 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/netif/ath/ath_hal/ar5210/ar5210_xmit.c
+++ b/sys/dev/netif/ath/ath_hal/ar5210/ar5210_xmit.c
@@ -37,7 +37,8 @@
 {
 	struct ath_hal_5210 *ahp = AH5210(ah);
 
-	if (q >= HAL_NUM_TX_QUEUES) {
+	/* NB: q is signed; reject negative before it reaches ah_txq[] */
+	if (q < 0 || q >= HAL_NUM_TX_QUEUES) {
 		HALDEBUG(ah, HAL_DEBUG_ANY, "%s: invalid queue num %u\n",
 		    __func__, q);
 		return AH_FALSE;
@@ -53,7 +54,8 @@
 {
 	struct ath_hal_5210 *ahp = AH5210(ah);
 
-	if (q >= HAL_NUM_TX_QUEUES) {
+	/* NB: q is signed; reject negative before it reaches ah_txq[] */
+	if (q < 0 || q >= HAL_NUM_TX_QUEUES) {
 		HALDEBUG(ah, HAL_DEBUG_ANY, "%s: invalid queue num %u\n",
 		    __func__, q);
 		return AH_FALSE;
@@ -259,7 +261,11 @@
 	struct ath_hal_5210 *ahp = AH5210(ah);
 	HAL_TX_QUEUE_INFO *qi;
 
-	HALASSERT(q < HAL_NUM_TX_QUEUES);
+	if (q >= HAL_NUM_TX_QUEUES) {
+		HALDEBUG(ah, HAL_DEBUG_ANY, "ar5210GetTxDP: invalid queue num %u\n",
+		    __func__, q);
+		return 0xffffffff;
+	}
 
 	qi = &ahp->ah_txq[q];
 	switch (qi->tqi_type) {
@@ -284,7 +290,11 @@
 	struct ath_hal_5210 *ahp = AH5210(ah);
 	HAL_TX_QUEUE_INFO *qi;
 
-	HALASSERT(q < HAL_NUM_TX_QUEUES);
+	if (q >= HAL_NUM_TX_QUEUES) {
+		HALDEBUG(ah, HAL_DEBUG_ANY, "ar5210SetTxDP: invalid queue num %u\n",
+		    __func__, q);
+		return AH_FALSE;
+	}
 
 	HALDEBUG(ah, HAL_DEBUG_TXQUEUE, "%s: queue %u 0x%x\n",
 	    __func__, q, txdp);
@@ -369,7 +379,11 @@
 	struct ath_hal_5210 *ahp = AH5210(ah);
 	HAL_TX_QUEUE_INFO *qi;
 
-	HALASSERT(q < HAL_NUM_TX_QUEUES);
+	if (q >= HAL_NUM_TX_QUEUES) {
+		HALDEBUG(ah, HAL_DEBUG_ANY, "ar5210StartTxDma: invalid queue num %u\n",
+		    __func__, q);
+		return AH_FALSE;
+	}
 
 	HALDEBUG(ah, HAL_DEBUG_TXQUEUE, "%s: queue %u\n", __func__, q);
 	qi = &ahp->ah_txq[q];
@@ -403,7 +417,11 @@
 	HAL_TX_QUEUE_INFO *qi;
 	uint32_t v;
 
-	HALASSERT(q < HAL_NUM_TX_QUEUES);
+	if (q >= HAL_NUM_TX_QUEUES) {
+		HALDEBUG(ah, HAL_DEBUG_ANY, "ar5210NumTxPending: invalid queue num %u\n",
+		    __func__, q);
+		return 0;
+	}
 
 	HALDEBUG(ah, HAL_DEBUG_TXQUEUE, "%s: queue %u\n", __func__, q);
 	qi = &ahp->ah_txq[q];
@@ -430,7 +448,11 @@
 	struct ath_hal_5210 *ahp = AH5210(ah);
 	HAL_TX_QUEUE_INFO *qi;
 
-	HALASSERT(q < HAL_NUM_TX_QUEUES);
+	if (q >= HAL_NUM_TX_QUEUES) {
+		HALDEBUG(ah, HAL_DEBUG_ANY, "ar5210StopTxDma: invalid queue num %u\n",
+		    __func__, q);
+		return AH_FALSE;
+	}
 
 	HALDEBUG(ah, HAL_DEBUG_TXQUEUE, "%s: queue %u\n", __func__, q);
 	qi = &ahp->ah_txq[q];