svn commit: r360849 - in head: share/man/man9 sys/kern
Ed Maste
emaste at FreeBSD.org
Sat May 9 15:56:03 UTC 2020
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;
More information about the svn-src-all
mailing list