DragonFlyBSD Kernel Audit
DF-0093 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/kern/sysv_shm.c b/sys/kern/sysv_shm.c
--- a/sys/kern/sysv_shm.c
+++ b/sys/kern/sysv_shm.c
@@ -420,8 +420,13 @@
 	switch (uap->cmd) {
 	case IPC_STAT:
 		error = ipcperm(p, &shmseg->shm_perm, IPC_R);
-		if (error == 0)
-			error = copyout(shmseg, uap->buf, sizeof(inbuf));
+		if (error == 0) {
+			/* Do not leak the in-kernel shm_internal pointer. */
+			struct shmid_ds outbuf;
+			outbuf = *shmseg;
+			outbuf.shm_internal = NULL;
+			error = copyout(&outbuf, uap->buf, sizeof(outbuf));
+		}
 		break;
 	case IPC_SET:
 		error = ipcperm(p, &shmseg->shm_perm, IPC_M);