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;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to