diff options
author | 2016-08-17 18:07:07 +0000 | |
---|---|---|
committer | 2016-08-17 18:07:07 +0000 | |
commit | a469cbf7dce3ab124fc08b7ded7326d947f018b2 (patch) | |
tree | 255c6602ab3221c26b992758bcf67e5f5a00317b /lib/libc/stdio/vfwprintf.c | |
parent | Make sure manuals in architecture-independent directories are treated (diff) | |
download | wireguard-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.c | 23 |
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) { |