ceph: fix parsing of ipv6 addresses

Check for brackets around the ipv6 address to avoid ambiguity with the port
number.

Signed-off-by: Sage Weil <sage@newdream.net>
This commit is contained in:
Sage Weil 2010-07-08 09:54:52 -07:00
parent d06dbaf6c2
commit 39139f64e1
1 changed files with 19 additions and 6 deletions

View File

@ -997,19 +997,32 @@ int ceph_parse_ips(const char *c, const char *end,
struct sockaddr_in *in4 = (void *)ss; struct sockaddr_in *in4 = (void *)ss;
struct sockaddr_in6 *in6 = (void *)ss; struct sockaddr_in6 *in6 = (void *)ss;
int port; int port;
char delim = ',';
if (*p == '[') {
delim = ']';
p++;
}
memset(ss, 0, sizeof(*ss)); memset(ss, 0, sizeof(*ss));
if (in4_pton(p, end - p, (u8 *)&in4->sin_addr.s_addr, if (in4_pton(p, end - p, (u8 *)&in4->sin_addr.s_addr,
',', &ipend)) { delim, &ipend))
ss->ss_family = AF_INET; ss->ss_family = AF_INET;
} else if (in6_pton(p, end - p, (u8 *)&in6->sin6_addr.s6_addr, else if (in6_pton(p, end - p, (u8 *)&in6->sin6_addr.s6_addr,
',', &ipend)) { delim, &ipend))
ss->ss_family = AF_INET6; ss->ss_family = AF_INET6;
} else { else
goto bad; goto bad;
}
p = ipend; p = ipend;
if (delim == ']') {
if (*p != ']') {
dout("missing matching ']'\n");
goto bad;
}
p++;
}
/* port? */ /* port? */
if (p < end && *p == ':') { if (p < end && *p == ':') {
port = 0; port = 0;
@ -1043,7 +1056,7 @@ int ceph_parse_ips(const char *c, const char *end,
return 0; return 0;
bad: bad:
pr_err("parse_ips bad ip '%s'\n", c); pr_err("parse_ips bad ip '%.*s'\n", (int)(end - c), c);
return -EINVAL; return -EINVAL;
} }