⬢ DragonFlyBSD Kernel Audit
DF-4519 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/netif/ath/ath_hal/ar5212/ar5212_xmit.c
+++ b/sys/dev/netif/ath/ath_hal/ar5212/ar5212_xmit.c
@@ -88,7 +88,8 @@
 	struct ath_hal_5212 *ahp = AH5212(ah);
 	HAL_CAPABILITIES *pCap = &AH_PRIVATE(ah)->ah_caps;
 
-	if (q >= pCap->halTotalQueues) {
+	/* NB: q is signed; reject negative before it reaches ah_txq[] */
+	if (q < 0 || q >= pCap->halTotalQueues) {
 		HALDEBUG(ah, HAL_DEBUG_ANY, "%s: invalid queue num %u\n",
 		    __func__, q);
 		return AH_FALSE;
@@ -106,7 +107,8 @@
 	HAL_CAPABILITIES *pCap = &AH_PRIVATE(ah)->ah_caps;
 
 
-	if (q >= pCap->halTotalQueues) {
+	/* NB: q is signed; reject negative before it reaches ah_txq[] */
+	if (q < 0 || q >= pCap->halTotalQueues) {
 		HALDEBUG(ah, HAL_DEBUG_ANY, "%s: invalid queue num %u\n",
 		    __func__, q);
 		return AH_FALSE;
@@ -514,7 +516,11 @@
 uint32_t
 ar5212GetTxDP(struct ath_hal *ah, u_int q)
 {
-	HALASSERT(q < AH_PRIVATE(ah)->ah_caps.halTotalQueues);
+	if (q >= AH_PRIVATE(ah)->ah_caps.halTotalQueues) {
+		HALDEBUG(ah, HAL_DEBUG_ANY, "%s: invalid queue num %u\n",
+		    __func__, q);
+		return 0;
+	}
 	return OS_REG_READ(ah, AR_QTXDP(q));
 }
 
@@ -524,7 +530,11 @@
 HAL_BOOL
 ar5212SetTxDP(struct ath_hal *ah, u_int q, uint32_t txdp)
 {
-	HALASSERT(q < AH_PRIVATE(ah)->ah_caps.halTotalQueues);
+	if (q >= AH_PRIVATE(ah)->ah_caps.halTotalQueues) {
+		HALDEBUG(ah, HAL_DEBUG_ANY, "%s: invalid queue num %u\n",
+		    __func__, q);
+		return AH_FALSE;
+	}
 	HALASSERT(AH5212(ah)->ah_txq[q].tqi_type != HAL_TX_QUEUE_INACTIVE);
 
 	/*
@@ -544,7 +554,11 @@
 HAL_BOOL
 ar5212StartTxDma(struct ath_hal *ah, u_int q)
 {
-	HALASSERT(q < AH_PRIVATE(ah)->ah_caps.halTotalQueues);
+	if (q >= AH_PRIVATE(ah)->ah_caps.halTotalQueues) {
+		HALDEBUG(ah, HAL_DEBUG_ANY, "%s: invalid queue num %u\n",
+		    __func__, q);
+		return AH_FALSE;
+	}
 
 	HALASSERT(AH5212(ah)->ah_txq[q].tqi_type != HAL_TX_QUEUE_INACTIVE);
 
@@ -566,7 +580,11 @@
 {
 	uint32_t npend;
 
-	HALASSERT(q < AH_PRIVATE(ah)->ah_caps.halTotalQueues);
+	if (q >= AH_PRIVATE(ah)->ah_caps.halTotalQueues) {
+		HALDEBUG(ah, HAL_DEBUG_ANY, "%s: invalid queue num %u\n",
+		    __func__, q);
+		return 0;
+	}
 	HALASSERT(AH5212(ah)->ah_txq[q].tqi_type != HAL_TX_QUEUE_INACTIVE);
 
 	npend = OS_REG_READ(ah, AR_QSTS(q)) & AR_Q_STS_PEND_FR_CNT;
@@ -591,7 +609,11 @@
 	u_int i;
 	u_int wait;
 
-	HALASSERT(q < AH_PRIVATE(ah)->ah_caps.halTotalQueues);
+	if (q >= AH_PRIVATE(ah)->ah_caps.halTotalQueues) {
+		HALDEBUG(ah, HAL_DEBUG_ANY, "%s: invalid queue num %u\n",
+		    __func__, q);
+		return AH_FALSE;
+	}
 
 	HALASSERT(AH5212(ah)->ah_txq[q].tqi_type != HAL_TX_QUEUE_INACTIVE);