mirror of https://gitee.com/openkylin/linux.git
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:
parent
d06dbaf6c2
commit
39139f64e1
|
@ -997,18 +997,31 @@ 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;
|
||||||
|
p = ipend;
|
||||||
|
|
||||||
|
if (delim == ']') {
|
||||||
|
if (*p != ']') {
|
||||||
|
dout("missing matching ']'\n");
|
||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
p = ipend;
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
/* port? */
|
/* port? */
|
||||||
if (p < end && *p == ':') {
|
if (p < end && *p == ':') {
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue