diff options
| -rw-r--r-- | fs/ceph/messenger.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/fs/ceph/messenger.c b/fs/ceph/messenger.c index e8c5a2d0e88f..3ddef1556457 100644 --- a/fs/ceph/messenger.c +++ b/fs/ceph/messenger.c | |||
| @@ -997,19 +997,32 @@ int ceph_parse_ips(const char *c, const char *end, | |||
| 997 | struct sockaddr_in *in4 = (void *)ss; | 997 | struct sockaddr_in *in4 = (void *)ss; |
| 998 | struct sockaddr_in6 *in6 = (void *)ss; | 998 | struct sockaddr_in6 *in6 = (void *)ss; |
| 999 | int port; | 999 | int port; |
| 1000 | char delim = ','; | ||
| 1001 | |||
| 1002 | if (*p == '[') { | ||
| 1003 | delim = ']'; | ||
| 1004 | p++; | ||
| 1005 | } | ||
| 1000 | 1006 | ||
| 1001 | memset(ss, 0, sizeof(*ss)); | 1007 | memset(ss, 0, sizeof(*ss)); |
| 1002 | if (in4_pton(p, end - p, (u8 *)&in4->sin_addr.s_addr, | 1008 | if (in4_pton(p, end - p, (u8 *)&in4->sin_addr.s_addr, |
| 1003 | ',', &ipend)) { | 1009 | delim, &ipend)) |
| 1004 | ss->ss_family = AF_INET; | 1010 | ss->ss_family = AF_INET; |
| 1005 | } else if (in6_pton(p, end - p, (u8 *)&in6->sin6_addr.s6_addr, | 1011 | else if (in6_pton(p, end - p, (u8 *)&in6->sin6_addr.s6_addr, |
| 1006 | ',', &ipend)) { | 1012 | delim, &ipend)) |
| 1007 | ss->ss_family = AF_INET6; | 1013 | ss->ss_family = AF_INET6; |
| 1008 | } else { | 1014 | else |
| 1009 | goto bad; | 1015 | goto bad; |
| 1010 | } | ||
| 1011 | p = ipend; | 1016 | p = ipend; |
| 1012 | 1017 | ||
| 1018 | if (delim == ']') { | ||
| 1019 | if (*p != ']') { | ||
| 1020 | dout("missing matching ']'\n"); | ||
| 1021 | goto bad; | ||
| 1022 | } | ||
| 1023 | p++; | ||
| 1024 | } | ||
| 1025 | |||
| 1013 | /* port? */ | 1026 | /* port? */ |
| 1014 | if (p < end && *p == ':') { | 1027 | if (p < end && *p == ':') { |
| 1015 | port = 0; | 1028 | port = 0; |
| @@ -1043,7 +1056,7 @@ int ceph_parse_ips(const char *c, const char *end, | |||
| 1043 | return 0; | 1056 | return 0; |
| 1044 | 1057 | ||
| 1045 | bad: | 1058 | bad: |
| 1046 | pr_err("parse_ips bad ip '%s'\n", c); | 1059 | pr_err("parse_ips bad ip '%.*s'\n", (int)(end - c), c); |
| 1047 | return -EINVAL; | 1060 | return -EINVAL; |
| 1048 | } | 1061 | } |
| 1049 | 1062 | ||
