DragonFlyBSD Kernel Audit
DF-0036 / fix.diff
← back to finding ↓ download raw
--- a/kern/subr_prf.c
+++ b/kern/subr_prf.c
@@ -686,18 +686,10 @@
 				lflag = 1;
 			goto reswitch;
 		case 'n':
-			if (cflag)
-				*(__va_arg(ap, char *)) = retval;
-			else if (hflag)
-				*(__va_arg(ap, short *)) = retval;
-			else if (jflag)
-				*(__va_arg(ap, intmax_t *)) = retval;
-			else if (lflag)
-				*(__va_arg(ap, long *)) = retval;
-			else if (qflag)
-				*(__va_arg(ap, quad_t *)) = retval;
-			else
-				*(__va_arg(ap, int *)) = retval;
+			/* %n is a no-op: no in-tree consumers, and its availability
+			 * converts any format-string bug into an arbitrary kernel write.
+			 * Consume the pointer to preserve va_list alignment. */
+			(void)__va_arg(ap, void *);
 			break;
 		case 'o':
 			base = 8;