Blame 0007-iscsid-iscsiadm-fix-abstract-socket-length-in-bind-c.patch

0e55d5b
From 2d086a831dc16d10729d6fce17bed3ade3efd16c Mon Sep 17 00:00:00 2001
0e55d5b
From: Tomasz Torcz <tomek@pipebreaker.pl>
0e55d5b
Date: Wed, 28 Nov 2012 13:37:06 +0100
0e55d5b
Subject: iscsid,iscsiadm: fix abstract socket length in bind() call
0e55d5b
0e55d5b
For abstract sockets, the addrlen parameter should be the actual
0e55d5b
length of socket's name.  Otherwise socket gets padded with some
0e55d5b
number of NULs.
0e55d5b
---
0e55d5b
 usr/iscsid_req.c | 10 ++++++----
0e55d5b
 usr/mgmt_ipc.c   |  9 +++++----
0e55d5b
 2 files changed, 11 insertions(+), 8 deletions(-)
0e55d5b
0e55d5b
diff --git a/usr/iscsid_req.c b/usr/iscsid_req.c
0e55d5b
index 0902011..1c4678d 100644
0e55d5b
--- a/usr/iscsid_req.c
0e55d5b
+++ b/usr/iscsid_req.c
0e55d5b
@@ -56,7 +56,7 @@ static void iscsid_startup(void)
0e55d5b
 
0e55d5b
 static int iscsid_connect(int *fd, int start_iscsid)
0e55d5b
 {
0e55d5b
-	int nsec;
0e55d5b
+	int nsec, addr_len;
0e55d5b
 	struct sockaddr_un addr;
0e55d5b
 
0e55d5b
 	*fd = socket(AF_LOCAL, SOCK_STREAM, 0);
0e55d5b
@@ -65,15 +65,17 @@ static int iscsid_connect(int *fd, int start_iscsid)
0e55d5b
 		return ISCSI_ERR_ISCSID_NOTCONN;
0e55d5b
 	}
0e55d5b
 
0e55d5b
+	addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(ISCSIADM_NAMESPACE) + 1;
0e55d5b
+
0e55d5b
 	memset(&addr, 0, sizeof(addr));
0e55d5b
 	addr.sun_family = AF_LOCAL;
0e55d5b
-	memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE,
0e55d5b
-		strlen(ISCSIADM_NAMESPACE));
0e55d5b
+	memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, addr_len);
0e55d5b
+
0e55d5b
 	/*
0e55d5b
 	 * Trying to connect with exponential backoff
0e55d5b
 	 */
0e55d5b
 	for (nsec = 1; nsec <= MAXSLEEP; nsec <<= 1) {
0e55d5b
-		if (connect(*fd, (struct sockaddr *) &addr, sizeof(addr)) == 0)
0e55d5b
+		if (connect(*fd, (struct sockaddr *) &addr, addr_len) == 0)
0e55d5b
 			/* Connection established */
0e55d5b
 			return ISCSI_SUCCESS;
0e55d5b
 
0e55d5b
diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c
0e55d5b
index 5c39c2e..a1dafc9 100644
0e55d5b
--- a/usr/mgmt_ipc.c
0e55d5b
+++ b/usr/mgmt_ipc.c
0e55d5b
@@ -43,7 +43,7 @@
0e55d5b
 int
0e55d5b
 mgmt_ipc_listen(void)
0e55d5b
 {
0e55d5b
-	int fd, err;
0e55d5b
+	int fd, err, addr_len;
0e55d5b
 	struct sockaddr_un addr;
0e55d5b
 
0e55d5b
 	fd = socket(AF_LOCAL, SOCK_STREAM, 0);
0e55d5b
@@ -52,12 +52,13 @@ mgmt_ipc_listen(void)
0e55d5b
 		return fd;
0e55d5b
 	}
0e55d5b
 
0e55d5b
+	addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(ISCSIADM_NAMESPACE) + 1;
0e55d5b
+
0e55d5b
 	memset(&addr, 0, sizeof(addr));
0e55d5b
 	addr.sun_family = AF_LOCAL;
0e55d5b
-	memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE,
0e55d5b
-		strlen(ISCSIADM_NAMESPACE));
0e55d5b
+	memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, addr_len);
0e55d5b
 
0e55d5b
-	if ((err = bind(fd, (struct sockaddr *) &addr, sizeof(addr))) < 0) {
0e55d5b
+	if ((err = bind(fd, (struct sockaddr *) &addr, addr_len)) < 0 ) {
0e55d5b
 		log_error("Can not bind IPC socket");
0e55d5b
 		close(fd);
0e55d5b
 		return err;
0e55d5b
-- 
0e55d5b
1.7.11.7
0e55d5b