DragonFlyBSD Kernel Audit
DF-2098 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/dev/netif/ath/ath_hal/ar5416/ar5416_gpio.c b/sys/dev/netif/ath/ath_hal/ar5416/ar5416_gpio.c
@@ -88,6 +88,8 @@
 #define	N(a)	(sizeof(a) / sizeof(a[0]))
 
 	HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins);
+	if (gpio >= AH_PRIVATE(ah)->ah_caps.halNumGpioPins)
+		return AH_FALSE;
 
 	/*
 	 * This table maps the HAL GPIO pins to the actual hardware
@@ -139,6 +141,8 @@
 	uint32_t gpio_shift, reg;
 
 	HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins);
+	if (gpio >= AH_PRIVATE(ah)->ah_caps.halNumGpioPins)
+		return AH_FALSE;
 
 	HALDEBUG(ah, HAL_DEBUG_GPIO, "%s: gpio=%d\n", __func__, gpio);
 
@@ -163,6 +167,8 @@
 	uint32_t reg;
 
 	HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins);
+	if (gpio >= AH_PRIVATE(ah)->ah_caps.halNumGpioPins)
+		return AH_FALSE;
 	HALDEBUG(ah, HAL_DEBUG_GPIO,
 	   "%s: gpio=%d, val=%d\n", __func__, gpio, val);
 
@@ -191,7 +197,7 @@
 	 */
 	if (AR_SREV_KIWI_10_OR_LATER(ah))
 		bits = MS(OS_REG_READ(ah, AR_GPIO_IN_OUT), AR9287_GPIO_IN_VAL);
-	if (AR_SREV_KITE_10_OR_LATER(ah))
+	else if (AR_SREV_KITE_10_OR_LATER(ah))
 		bits = MS(OS_REG_READ(ah, AR_GPIO_IN_OUT), AR9285_GPIO_IN_VAL);
 	else if (AR_SREV_MERLIN_10_OR_LATER(ah))
 		bits = MS(OS_REG_READ(ah, AR_GPIO_IN_OUT), AR928X_GPIO_IN_VAL);
@@ -210,6 +216,8 @@
 	uint32_t val, mask;
 
 	HALASSERT(gpio < AH_PRIVATE(ah)->ah_caps.halNumGpioPins);
+	if (gpio >= AH_PRIVATE(ah)->ah_caps.halNumGpioPins)
+		return;
 	HALDEBUG(ah, HAL_DEBUG_GPIO,
 	    "%s: gpio=%d, ilevel=%d\n", __func__, gpio, ilevel);