From 93c3ad10f14b8a71814ddf4721c5e39fbb8352d9 Mon Sep 17 00:00:00 2001 From: Ian Lepore Date: Mon, 16 Mar 2015 21:09:11 +0000 Subject: [PATCH] Fix minor fallout from sysctl strings being nulterminated now. The dmesg code can read the buffer via sysctl or from a core file. In the core file case there will be no nulterm, and the code copes with that, but now in the sysctl case there is a nulterm (there didn't used to be). The least disruptive way to restore the old behavior (and eliminate a spurious '\000' at the end of the output) is to remove the nulterm (by decrementing the buffer length) in the sysctl case. --- sbin/dmesg/dmesg.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/sbin/dmesg/dmesg.c b/sbin/dmesg/dmesg.c index f0fcb8125877..9fee41664b30 100644 --- a/sbin/dmesg/dmesg.c +++ b/sbin/dmesg/dmesg.c @@ -111,8 +111,10 @@ main(int argc, char *argv[]) if (memf == NULL) { /* - * Running kernel. Use sysctl. This gives an unwrapped - * buffer as a side effect. + * Running kernel. Use sysctl. This gives an unwrapped buffer + * as a side effect. Remove nulterm (if present) so the value + * returned by sysctl is formatted as the rest of the code + * expects (the same as the value read from a core file below). */ if (sysctlbyname("kern.msgbuf", NULL, &buflen, NULL, 0) == -1) err(1, "sysctl kern.msgbuf"); @@ -120,6 +122,8 @@ main(int argc, char *argv[]) errx(1, "malloc failed"); if (sysctlbyname("kern.msgbuf", bp, &buflen, NULL, 0) == -1) err(1, "sysctl kern.msgbuf"); + if (buflen > 0 && bp[buflen - 1] == '\0') + buflen--; if (clear) if (sysctlbyname("kern.msgbuf_clear", NULL, NULL, &clear, sizeof(int))) err(1, "sysctl kern.msgbuf_clear");