Module Name:    src
Committed By:   joerg
Date:           Thu Aug 25 15:37:00 UTC 2011

Modified Files:
        src/crypto/external/bsd/openssh/dist: log.c

Log Message:
Avoid using non-literal format strings and optimizing code a bit at the
same time.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/crypto/external/bsd/openssh/dist/log.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/crypto/external/bsd/openssh/dist/log.c
diff -u src/crypto/external/bsd/openssh/dist/log.c:1.3 src/crypto/external/bsd/openssh/dist/log.c:1.4
--- src/crypto/external/bsd/openssh/dist/log.c:1.3	Mon Jul 25 03:03:10 2011
+++ src/crypto/external/bsd/openssh/dist/log.c	Thu Aug 25 15:37:00 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: log.c,v 1.3 2011/07/25 03:03:10 christos Exp $	*/
+/*	$NetBSD: log.c,v 1.4 2011/08/25 15:37:00 joerg Exp $	*/
 /* $OpenBSD: log.c,v 1.41 2008/06/10 04:50:25 dtucker Exp $ */
 /*
  * Author: Tatu Ylonen <y...@cs.hut.fi>
@@ -36,8 +36,9 @@
  */
 
 #include "includes.h"
-__RCSID("$NetBSD: log.c,v 1.3 2011/07/25 03:03:10 christos Exp $");
+__RCSID("$NetBSD: log.c,v 1.4 2011/08/25 15:37:00 joerg Exp $");
 #include <sys/types.h>
+#include <sys/uio.h>
 
 #include <stdarg.h>
 #include <stdio.h>
@@ -302,8 +303,10 @@
 #ifdef SYSLOG_DATA_INIT
 	struct syslog_data sdata = SYSLOG_DATA_INIT;
 #endif
-	char msgbuf[MSGBUFSIZ];
-	char fmtbuf[4 * sizeof(msgbuf) + 1];
+	size_t len, len2;
+	int len3;
+	char msgbuf[MSGBUFSIZ], *msgbufp;
+	char visbuf[MSGBUFSIZ * 4 + 1];
 	const char *txt = NULL;
 	int pri = LOG_INFO;
 	int saved_errno = errno;
@@ -345,24 +348,33 @@
 		pri = LOG_ERR;
 		break;
 	}
+	len = sizeof(msgbuf);
+	msgbufp = msgbuf;
 	if (txt != NULL) {
-		snprintf(fmtbuf, sizeof(fmtbuf), "%s: %s", txt, fmt);
-		vsnprintf(msgbuf, sizeof(msgbuf), fmtbuf, args);
-	} else {
-		vsnprintf(msgbuf, sizeof(msgbuf), fmt, args);
+		len2 = strlen(txt);
+		if (len2 >= len)
+			len2 = len - 1;
+		memcpy(msgbufp, txt, len2);
+		msgbufp += len2;
+		*msgbufp++ = '\0';
+		len -= len2 + 1;
 	}
-	strvis(fmtbuf, msgbuf, VIS_SAFE|VIS_OCTAL);
+	vsnprintf(msgbufp, len, fmt, args);
+	len3 = strvis(visbuf, msgbuf, VIS_SAFE|VIS_OCTAL);
 	if (log_on_stderr) {
-		snprintf(msgbuf, sizeof msgbuf, "%s\r\n", fmtbuf);
-		write(STDERR_FILENO, msgbuf, strlen(msgbuf));
+		struct iovec iov[] = {
+			{ visbuf, len3 },
+			{ __UNCONST("\r\n"), 2 },
+		};
+		writev(STDERR_FILENO, iov, __arraycount(iov));
 	} else {
 #ifdef SYSLOG_DATA_INIT
 		openlog_r(argv0 ? argv0 : __progname, LOG_PID, log_facility, &sdata);
-		syslog_r(pri, &sdata, "%.500s", fmtbuf);
+		syslog_r(pri, &sdata, "%.500s", visbuf);
 		closelog_r(&sdata);
 #else
 		openlog(argv0 ? argv0 : __progname, LOG_PID, log_facility);
-		syslog(pri, "%.500s", fmtbuf);
+		syslog(pri, "%.500s", visbuf);
 		closelog();
 #endif
 	}

Reply via email to