summaryrefslogtreecommitdiffstats
path: root/lib/libc/stdio/vfwprintf.c
diff options
context:
space:
mode:
authorderaadt <deraadt@openbsd.org>2016-08-17 18:07:07 +0000
committerderaadt <deraadt@openbsd.org>2016-08-17 18:07:07 +0000
commita469cbf7dce3ab124fc08b7ded7326d947f018b2 (patch)
tree255c6602ab3221c26b992758bcf67e5f5a00317b /lib/libc/stdio/vfwprintf.c
parentMake sure manuals in architecture-independent directories are treated (diff)
downloadwireguard-openbsd-a469cbf7dce3ab124fc08b7ded7326d947f018b2.tar.xz
wireguard-openbsd-a469cbf7dce3ab124fc08b7ded7326d947f018b2.zip
Generate syslog warnings for %s fmt strings NULL to "(null)" conversions.
Over time we can repair software which performs this non-standard behaviour, and fix bugs along the way. Let's first find out how bad the situation is by deploying this in snapshots. This type of logging is possible because OpenBSD syslog_r(3) -> sendsyslog(2) is side-effect free enough to be used in the bowels of libc. ok tedu
Diffstat (limited to 'lib/libc/stdio/vfwprintf.c')
-rw-r--r--lib/libc/stdio/vfwprintf.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/lib/libc/stdio/vfwprintf.c b/lib/libc/stdio/vfwprintf.c
index 520c8bc7d22..e65dddc0c74 100644
--- a/lib/libc/stdio/vfwprintf.c
+++ b/lib/libc/stdio/vfwprintf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vfwprintf.c,v 1.15 2015/12/28 22:08:18 mmcc Exp $ */
+/* $OpenBSD: vfwprintf.c,v 1.16 2016/08/17 18:07:07 deraadt Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
@@ -49,6 +49,7 @@
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
+#include <syslog.h>
#include <unistd.h>
#include "local.h"
@@ -816,12 +817,28 @@ fp_common:
/*FALLTHROUGH*/
case 's':
if (flags & LONGINT) {
- if ((cp = GETARG(wchar_t *)) == NULL)
+ if ((cp = GETARG(wchar_t *)) == NULL) {
+ struct syslog_data sdata = SYSLOG_DATA_INIT;
+ int save_errno = errno;
+
+ syslog_r(LOG_CRIT | LOG_CONS, &sdata,
+ "vfwprintf \%ls NULL in \"%s\"", fmt0);
+ errno = save_errno;
+
cp = L"(null)";
+ }
} else {
char *mbsarg;
- if ((mbsarg = GETARG(char *)) == NULL)
+ if ((mbsarg = GETARG(char *)) == NULL) {
+ struct syslog_data sdata = SYSLOG_DATA_INIT;
+ int save_errno = errno;
+
+ syslog_r(LOG_CRIT | LOG_CONS, &sdata,
+ "vfwprintf \%s NULL in \"%s\"", fmt0);
+ errno = save_errno;
+
mbsarg = "(null)";
+ }
free(convbuf);
convbuf = __mbsconv(mbsarg, prec);
if (convbuf == NULL) {