374005d
From 1fa1b51356c0ea6e1d30f2d370b3b766d4230537 Mon Sep 17 00:00:00 2001
374005d
From: Mike Christie <michaelc@cs.wisc.edu>
374005d
Date: Thu, 5 Dec 2013 18:12:32 -0600
374005d
Subject: [PATCH] iscsi tools: Bug fix on IPC address copy (version 2)
374005d
374005d
This patch merges Yufei Ren <yufei.ren@stonybrook.edu> patch
374005d
with comments from the list plus what I think is a bug in the
374005d
addr_len usage.
374005d
374005d
For the addr_len use, it looks like we were using that as the
374005d
arg to memcpy, but that value included the length of the pathname
374005d
string and also the offset of sun_path in the sockaddr_un and so
374005d
that is too long.
374005d
---
374005d
 usr/iscsi_util.c | 12 ++++++++++++
374005d
 usr/iscsi_util.h |  3 +++
374005d
 usr/iscsid_req.c |  7 +------
374005d
 usr/mgmt_ipc.c   |  6 +-----
374005d
 4 files changed, 17 insertions(+), 11 deletions(-)
374005d
374005d
diff --git a/usr/iscsi_util.c b/usr/iscsi_util.c
374005d
index ac86847..9dbfbfd 100644
374005d
--- a/usr/iscsi_util.c
374005d
+++ b/usr/iscsi_util.c
374005d
@@ -25,16 +25,28 @@
374005d
 #include <string.h>
374005d
 #include <errno.h>
374005d
 #include <ctype.h>
374005d
+#include <sys/socket.h>
374005d
+#include <sys/un.h>
374005d
 #include <sys/types.h>
374005d
 #include <sys/stat.h>
374005d
 #include <sys/resource.h>
374005d
 
374005d
+#include "sysdeps.h"
374005d
 #include "log.h"
374005d
 #include "iscsi_settings.h"
374005d
 #include "iface.h"
374005d
 #include "session_info.h"
374005d
 #include "iscsi_util.h"
374005d
 
374005d
+int setup_abstract_addr(struct sockaddr_un *addr, char *unix_sock_name)
374005d
+{
374005d
+	memset(addr, 0, sizeof(*addr));
374005d
+	addr->sun_family = AF_LOCAL;
374005d
+	strlcpy(addr->sun_path + 1, unix_sock_name, sizeof(addr->sun_path) - 1);
374005d
+	return offsetof(struct sockaddr_un, sun_path) +
374005d
+		strlen(addr->sun_path + 1) + 1;
374005d
+}
374005d
+
374005d
 void daemon_init(void)
374005d
 {
374005d
 	int fd;
374005d
diff --git a/usr/iscsi_util.h b/usr/iscsi_util.h
374005d
index 110dfa8..ff725eb 100644
374005d
--- a/usr/iscsi_util.h
374005d
+++ b/usr/iscsi_util.h
374005d
@@ -26,4 +26,7 @@ extern int __iscsi_match_session(struct node_rec *rec, char *targetname,
374005d
 extern char *strstrip(char *s);
374005d
 extern char *cfg_get_string_param(char *pathname, const char *key);
374005d
 
374005d
+struct sockaddr_un;
374005d
+extern int setup_abstract_addr(struct sockaddr_un *addr, char *unix_sock_name);
374005d
+
374005d
 #endif
374005d
diff --git a/usr/iscsid_req.c b/usr/iscsid_req.c
374005d
index 715c0aa..0e91dee 100644
374005d
--- a/usr/iscsid_req.c
374005d
+++ b/usr/iscsid_req.c
374005d
@@ -67,12 +67,7 @@ static int ipc_connect(int *fd, char *unix_sock_name, int start_iscsid)
374005d
 		return ISCSI_ERR_ISCSID_NOTCONN;
374005d
 	}
374005d
 
374005d
-	addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(unix_sock_name) + 1;
374005d
-
374005d
-	memset(&addr, 0, sizeof(addr));
374005d
-	addr.sun_family = AF_LOCAL;
374005d
-	memcpy((char *) &addr.sun_path + 1, unix_sock_name,
374005d
-	       strlen(unix_sock_name));
374005d
+	addr_len = setup_abstract_addr(&addr, unix_sock_name);
374005d
 
374005d
 	/*
374005d
 	 * Trying to connect with exponential backoff
374005d
diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c
374005d
index 87bd346..a82c063 100644
374005d
--- a/usr/mgmt_ipc.c
374005d
+++ b/usr/mgmt_ipc.c
374005d
@@ -59,11 +59,7 @@ mgmt_ipc_listen(void)
374005d
 		return fd;
374005d
 	}
374005d
 
374005d
-	addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(ISCSIADM_NAMESPACE) + 1;
374005d
-
374005d
-	memset(&addr, 0, sizeof(addr));
374005d
-	addr.sun_family = AF_LOCAL;
374005d
-	memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, addr_len);
374005d
+	addr_len = setup_abstract_addr(&addr, ISCSIADM_NAMESPACE);
374005d
 
374005d
 	if ((err = bind(fd, (struct sockaddr *) &addr, addr_len)) < 0 ) {
374005d
 		log_error("Can not bind IPC socket");
374005d
-- 
374005d
1.8.3.1
374005d