Blob Blame History Raw
From 85f647c4300a888bb6cbc27f33138549cab617e3 Mon Sep 17 00:00:00 2001
From: Lee Duncan <lduncan@suse.com>
Date: Fri, 15 Dec 2017 11:15:26 -0800
Subject: [PATCH] Ensure strings from peer are copied correctly.

The method of using strlen() and strcpy()/strncpy() has
a couple of holes. Do not try to measure the length of
strings supplied from peer, and ensure copied strings are
NULL-terminated. Use the new strlcpy() instead.
Found by Qualsys.
---
 iscsiuio/src/unix/iscsid_ipc.c | 24 ++++++------------------
 1 file changed, 6 insertions(+), 18 deletions(-)

diff --git a/iscsiuio/src/unix/iscsid_ipc.c b/iscsiuio/src/unix/iscsid_ipc.c
index 4a6687b32a17..8478f9a411a3 100644
--- a/iscsiuio/src/unix/iscsid_ipc.c
+++ b/iscsiuio/src/unix/iscsid_ipc.c
@@ -147,10 +147,7 @@ static int decode_cidr(char *in_ipaddr_str, struct iface_rec_decode *ird)
 	struct in_addr ia;
 	struct in6_addr ia6;
 
-	if (strlen(in_ipaddr_str) > NI_MAXHOST)
-		strncpy(ipaddr_str, in_ipaddr_str, NI_MAXHOST);
-	else
-		strcpy(ipaddr_str, in_ipaddr_str);
+	strlcpy(ipaddr_str, in_ipaddr_str, NI_MAXHOST);
 
 	/* Find the CIDR if any */
 	tmp = strchr(ipaddr_str, '/');
@@ -282,22 +279,16 @@ static int decode_iface(struct iface_rec_decode *ird, struct iface_rec *rec)
 
 			/* For LL on, ignore the IPv6 addr in the iface */
 			if (ird->linklocal_autocfg == IPV6_LL_AUTOCFG_OFF) {
-				if (strlen(rec->ipv6_linklocal) > NI_MAXHOST)
-					strncpy(ipaddr_str, rec->ipv6_linklocal,
-						NI_MAXHOST);
-				else
-					strcpy(ipaddr_str, rec->ipv6_linklocal);
+				strlcpy(ipaddr_str, rec->ipv6_linklocal,
+					NI_MAXHOST);
 				inet_pton(AF_INET6, ipaddr_str,
 					  &ird->ipv6_linklocal);
 			}
 
 			/* For RTR on, ignore the IPv6 addr in the iface */
 			if (ird->router_autocfg == IPV6_RTR_AUTOCFG_OFF) {
-				if (strlen(rec->ipv6_router) > NI_MAXHOST)
-					strncpy(ipaddr_str, rec->ipv6_router,
-						NI_MAXHOST);
-				else
-					strcpy(ipaddr_str, rec->ipv6_router);
+				strlcpy(ipaddr_str, rec->ipv6_router,
+					NI_MAXHOST);
 				inet_pton(AF_INET6, ipaddr_str,
 					  &ird->ipv6_router);
 			}
@@ -311,10 +302,7 @@ static int decode_iface(struct iface_rec_decode *ird, struct iface_rec *rec)
 					calculate_default_netmask(
 							ird->ipv4_addr.s_addr);
 
-			if (strlen(rec->gateway) > NI_MAXHOST)
-				strncpy(ipaddr_str, rec->gateway, NI_MAXHOST);
-			else
-				strcpy(ipaddr_str, rec->gateway);
+			strlcpy(ipaddr_str, rec->gateway, NI_MAXHOST);
 			inet_pton(AF_INET, ipaddr_str, &ird->ipv4_gateway);
 		}
 	} else {
-- 
2.17.2