Module Name:    src
Committed By:   mrg
Date:           Mon Feb  4 08:21:12 UTC 2019

Modified Files:
        src/lib/libintl: gettext.c
        src/sbin/iscsid: iscsid_main.c
        src/usr.sbin/npf/npfd: npfd_log.c

Log Message:
check for snprintf() truncation and fail sanely if so, rather than
attempting to use a file that won't exist or isn't secure.


To generate a diff of this commit:
cvs rdiff -u -r1.29 -r1.30 src/lib/libintl/gettext.c
cvs rdiff -u -r1.11 -r1.12 src/sbin/iscsid/iscsid_main.c
cvs rdiff -u -r1.12 -r1.13 src/usr.sbin/npf/npfd/npfd_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/lib/libintl/gettext.c
diff -u src/lib/libintl/gettext.c:1.29 src/lib/libintl/gettext.c:1.30
--- src/lib/libintl/gettext.c:1.29	Fri May 29 12:26:28 2015
+++ src/lib/libintl/gettext.c	Mon Feb  4 08:21:11 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: gettext.c,v 1.29 2015/05/29 12:26:28 christos Exp $	*/
+/*	$NetBSD: gettext.c,v 1.30 2019/02/04 08:21:11 mrg Exp $	*/
 
 /*-
  * Copyright (c) 2000, 2001 Citrus Project,
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: gettext.c,v 1.29 2015/05/29 12:26:28 christos Exp $");
+__RCSID("$NetBSD: gettext.c,v 1.30 2019/02/04 08:21:11 mrg Exp $");
 
 #include <sys/param.h>
 #include <sys/stat.h>
@@ -329,8 +329,10 @@ lookup_mofile(char *buf, size_t len, con
 			continue;
 #endif
 
-		snprintf(buf, len, "%s/%s/%s/%s.mo", dir, p,
+		int rv = snprintf(buf, len, "%s/%s/%s/%s.mo", dir, p,
 		    category, domainname);
+		if (rv > (int)len)
+			return NULL;
 		if (stat(buf, &st) < 0)
 			continue;
 		if ((st.st_mode & S_IFMT) != S_IFREG)
@@ -942,7 +944,7 @@ dcngettext(const char *domainname, const
 	   unsigned long int n, int category)
 {
 	const char *msgid;
-	char path[PATH_MAX];
+	char path[PATH_MAX+1];
 	const char *lpath;
 	static char olpath[PATH_MAX];
 	const char *cname = NULL;

Index: src/sbin/iscsid/iscsid_main.c
diff -u src/sbin/iscsid/iscsid_main.c:1.11 src/sbin/iscsid/iscsid_main.c:1.12
--- src/sbin/iscsid/iscsid_main.c:1.11	Mon May 30 21:58:32 2016
+++ src/sbin/iscsid/iscsid_main.c	Mon Feb  4 08:21:12 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: iscsid_main.c,v 1.11 2016/05/30 21:58:32 mlelstv Exp $	*/
+/*	$NetBSD: iscsid_main.c,v 1.12 2019/02/04 08:21:12 mrg Exp $	*/
 
 /*-
  * Copyright (c) 2005,2006,2011 The NetBSD Foundation, Inc.
@@ -90,6 +90,7 @@ create_node_name(void)
 	uint32_t hid = 0;
 	size_t siz;
 	int mib[2];
+	int total;
 	unsigned char *s;
 
 	(void) memset(&snp, 0x0, sizeof(snp));
@@ -109,8 +110,12 @@ create_node_name(void)
 	for (s = snp.InitiatorAlias; *s; s++)
 		if (!isalnum((unsigned char) *s) && *s != '-' && *s != '.' && *s != ':')
 			*s = '-';
-	snprintf((char *)snp.InitiatorName, sizeof(snp.InitiatorName),
+	total = snprintf((char *)snp.InitiatorName, sizeof(snp.InitiatorName),
 		"iqn.1994-04.org.netbsd:iscsi.%s:%u", snp.InitiatorAlias, hid);
+	if ((size_t)total > sizeof(snp.InitiatorName)) {
+		printf("Warning: iSCSI Node InitiatorName too long to set InitiatorAlias!\n");
+		return ISCSID_STATUS_NO_INITIATOR_NAME;
+	}
 
 	ioctl(driver, ISCSI_SET_NODE_NAME, &snp);
 	return snp.status;

Index: src/usr.sbin/npf/npfd/npfd_log.c
diff -u src/usr.sbin/npf/npfd/npfd_log.c:1.12 src/usr.sbin/npf/npfd/npfd_log.c:1.13
--- src/usr.sbin/npf/npfd/npfd_log.c:1.12	Mon Oct 16 11:17:45 2017
+++ src/usr.sbin/npf/npfd/npfd_log.c	Mon Feb  4 08:21:12 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: npfd_log.c,v 1.12 2017/10/16 11:17:45 christos Exp $	*/
+/*	$NetBSD: npfd_log.c,v 1.13 2019/02/04 08:21:12 mrg Exp $	*/
 
 /*-
  * Copyright (c) 2015 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: npfd_log.c,v 1.12 2017/10/16 11:17:45 christos Exp $");
+__RCSID("$NetBSD: npfd_log.c,v 1.13 2019/02/04 08:21:12 mrg Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -190,7 +190,9 @@ fix:
 rename:
 	fclose(fp);
 	char tmp[MAXPATHLEN];
-	snprintf(tmp, sizeof(tmp), "%s.XXXXXX", ctx->path);
+	if (snprintf(tmp, sizeof(tmp), "%s.XXXXXX", ctx->path) > MAXPATHLEN)
+		syslog(LOG_ERR, "Temp file truncated: `%s' does not fit",
+		       ctx->path);
 	int fd;
 	if ((fd = mkstemp(tmp)) == -1) {
 		syslog(LOG_ERR, "Can't make temp file `%s': %m", tmp);

Reply via email to