Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 9 May 2020 15:56:02 +0000 (UTC)
From:      Ed Maste <emaste@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r360849 - in head: share/man/man9 sys/kern
Message-ID:  <202005091556.049Fu2Vp051746@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: emaste
Date: Sat May  9 15:56:02 2020
New Revision: 360849
URL: https://svnweb.freebsd.org/changeset/base/360849

Log:
  remove %n support from printf(9)
  
  It can be dangerous and there is no need for it in the kernel.
  Inspired by Kees Cook's change in Linux, and later OpenBSD.
  
  Reviewed by:	cem, gordon, philip
  Sponsored by:	The FreeBSD Foundation
  Differential Revision:	https://reviews.freebsd.org/D24760

Modified:
  head/share/man/man9/printf.9
  head/sys/kern/subr_prf.c

Modified: head/share/man/man9/printf.9
==============================================================================
--- head/share/man/man9/printf.9	Sat May  9 14:49:56 2020	(r360848)
+++ head/share/man/man9/printf.9	Sat May  9 15:56:02 2020	(r360849)
@@ -26,7 +26,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd November 18, 2015
+.Dd May 9, 2020
 .Dt PRINTF 9
 .Os
 .Sh NAME
@@ -83,7 +83,7 @@ parameter in the same manner as
 .Xr printf 3 .
 However,
 .Xr printf 9
-adds two other conversion specifiers.
+adds two other conversion specifiers and omits one.
 .Pp
 The
 .Cm \&%b
@@ -119,6 +119,10 @@ a time.
 The string is used as a delimiter between individual bytes.
 If present, a width directive will specify the number of bytes to display.
 By default, 16 bytes of data are output.
+.Pp
+The
+.Cm \&%n
+conversion specifier is not supported.
 .Pp
 The
 .Fn log

Modified: head/sys/kern/subr_prf.c
==============================================================================
--- head/sys/kern/subr_prf.c	Sat May  9 14:49:56 2020	(r360848)
+++ head/sys/kern/subr_prf.c	Sat May  9 15:56:02 2020	(r360849)
@@ -775,20 +775,24 @@ reswitch:	switch (ch = (u_char)*fmt++) {
 				lflag = 1;
 			goto reswitch;
 		case 'n':
+			/*
+			 * We do not support %n in kernel, but consume the
+			 * argument.
+			 */
 			if (jflag)
-				*(va_arg(ap, intmax_t *)) = retval;
+				(void)va_arg(ap, intmax_t *);
 			else if (qflag)
-				*(va_arg(ap, quad_t *)) = retval;
+				(void)va_arg(ap, quad_t *);
 			else if (lflag)
-				*(va_arg(ap, long *)) = retval;
+				(void)va_arg(ap, long *);
 			else if (zflag)
-				*(va_arg(ap, size_t *)) = retval;
+				(void)va_arg(ap, size_t *);
 			else if (hflag)
-				*(va_arg(ap, short *)) = retval;
+				(void)va_arg(ap, short *);
 			else if (cflag)
-				*(va_arg(ap, char *)) = retval;
+				(void)va_arg(ap, char *);
 			else
-				*(va_arg(ap, int *)) = retval;
+				(void)va_arg(ap, int *);
 			break;
 		case 'o':
 			base = 8;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202005091556.049Fu2Vp051746>