⬢ DragonFlyBSD Kernel Audit
DF-5841 / fix.diff
← back to finding ↓ download raw
--- a/sys/kern/sys_generic.c
+++ b/sys/kern/sys_generic.c
@@ -671,14 +671,22 @@
 		goto done;
 	}
 
-	if ((com & IOC_VOID) == 0 && size > sizeof(ubuf.stkbuf)) {
-		memp = kmalloc(size, M_IOCTLOPS, M_WAITOK);
+	if (size > sizeof(ubuf.stkbuf)) {
+		memp = kmalloc(size, M_IOCTLOPS, M_WAITOK | M_ZERO);
 		data = memp;
 	} else {
 		memp = NULL;
 		data = ubuf.stkbuf;
 	}
 	if (com & IOC_VOID) {
+		/*
+		 * Zero the buffer for IOC_VOID commands with an IOC_OUT
+		 * component so the copyout below never discloses
+		 * uninitialized kernel stack.  (The heap case is already
+		 * zeroed via M_ZERO.)
+		 */
+		if ((com & IOC_OUT) != 0 && memp == NULL)
+			bzero(data, sizeof(ubuf.stkbuf));
 		*(caddr_t *)data = uspc_data;
 	} else if (com & IOC_IN) {
 		if (size != 0) {