diff options
author | Jeff Layton <jlayton@redhat.com> | 2009-08-14 07:59:51 -0400 |
---|---|---|
committer | Jeff Layton <jlayton@redhat.com> | 2009-08-14 07:59:51 -0400 |
commit | 19553e1552a57d5b0a9f3514bf64d2580b76a377 (patch) | |
tree | 524a5778ccc96e4f8e0414a282fa5bb5739adb37 /client | |
parent | 2f95ccc1e2c7fe8efd341cd6fc5adc402a7a0a18 (diff) | |
download | samba-19553e1552a57d5b0a9f3514bf64d2580b76a377.tar.gz samba-19553e1552a57d5b0a9f3514bf64d2580b76a377.tar.bz2 samba-19553e1552a57d5b0a9f3514bf64d2580b76a377.zip |
cifs.upcall: fix IPv6 addrs sent to upcall to have colon delimiters
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 <jlayton@redhat.com>
Diffstat (limited to 'client')
-rw-r--r-- | 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 c7a29bc5a2..c89df9cf63 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; } |