DragonFlyBSD Kernel Audit
DF-2060 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/dev/netif/ath/ath/if_ath_ioctl.c b/sys/dev/netif/ath/ath/if_ath_ioctl.c
--- a/sys/dev/netif/ath/ath/if_ath_ioctl.c
+++ b/sys/dev/netif/ath/ath/if_ath_ioctl.c
@@ -173,6 +173,7 @@
 	u_int id = ad->ad_id & ATH_DIAG_ID;
 	void *indata = NULL;
 	void *outdata = NULL;
+	void *outbuf = NULL;		/* tracks kmalloc'd result buffer for reclaim */
 	u_int32_t insize = ad->ad_in_size;
 	u_int32_t outsize = ad->ad_out_size;
 	int error = 0;
@@ -198,11 +199,12 @@
 		 * pointer for us to use below in reclaiming the buffer;
 		 * may want to be more defensive.
 		 */
-		outdata = kmalloc(outsize, M_TEMP, M_NOWAIT);
-		if (outdata == NULL) {
+		outbuf = kmalloc(outsize, M_TEMP, M_NOWAIT);
+		if (outbuf == NULL) {
 			error = ENOMEM;
 			goto bad;
 		}
+		outdata = outbuf;
 	}
 
 
@@ -229,8 +231,8 @@
 bad:
 	if ((ad->ad_id & ATH_DIAG_IN) && indata != NULL)
 		kfree(indata, M_TEMP);
-	if ((ad->ad_id & ATH_DIAG_DYN) && outdata != NULL)
-		kfree(outdata, M_TEMP);
+	if (outbuf != NULL)
+		kfree(outbuf, M_TEMP);
 	return error;
 }
 #endif /* ATH_DIAGAPI */