[PATCH 7/7] cifs.upcall: fix IPv6 addrs sent to upcall to have colon delimiters

Jeff Layton <[email protected]>
Newsgroups gmane.linux.file-systems.cifs,gmane.network.samba.internals
Message-ID <[email protected]>
Current kernels don't send IPv6 addresses with the colon delimiters, add
a routine to add them when they're not present.

Signed-off-by: Jeff Layton <[email protected]>
---
 client/cifs.upcall.c |   33 +++++++++++++++++++++++++++++----
 1 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/client/cifs.upcall.c b/client/cifs.upcall.c
index 1e58503..0cc72fc 100644
--- a/client/cifs.upcall.c
+++ b/client/cifs.upcall.c
@@ -296,18 +296,43 @@ cifs_resolver(const key_serial_t key, const char *key_descr)
 	return 0;
 }
 
+/*
+ * Older kernels sent IPv6 addresses without colons. Well, at least
+ * they're fixed-length strings. Convert these addresses to have colon
+ * delimiters to make getaddrinfo happy.
+ */
+static void
+convert_inet6_addr(const char *from, char *to)
+{
+	int i = 1;
+
+	while (*from) {
+		*to++ = *from++;
+		if (!(i++ % 4) && *from)
+			*to++ = ':';
+	}
+	*to = 0;
+}
+
 static int
-ip_to_fqdn(const char *ipaddr, char *host, size_t hostlen)
+ip_to_fqdn(const char *addrstr, char *host, size_t hostlen)
 {
 	int rc;
 	struct addrinfo hints = { .ai_flags = AI_NUMERICHOST };
 	struct addrinfo *res;
+	const char *ipaddr = addrstr;
+	char converted[INET6_ADDRSTRLEN + 1];
+
+	if ((strlen(ipaddr) > INET_ADDRSTRLEN) && !strchr(ipaddr, ':')) {
+		convert_inet6_addr(ipaddr, converted);
+		ipaddr = converted;
+	}
 
 	rc = getaddrinfo(ipaddr, NULL, &hints, &res);
 	if (rc) {
-		syslog(LOG_DEBUG, "%s: failed to resolve %s to ipaddr: %s",
-			__func__, ipaddr,
-			rc == EAI_SYSTEM ? strerror(errno) : gai_strerror(rc));
+		syslog(LOG_DEBUG, "%s: failed to resolve %s to "
+			"ipaddr: %s", __func__, ipaddr,
+		rc == EAI_SYSTEM ? strerror(errno) : gai_strerror(rc));
 		return rc;
 	}
 
-- 
1.6.0.6
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.