|
@@ -121,7 +121,7 @@ struct afs_addr_list *afs_parse_text_addrs(const char *text, size_t len,
|
|
p = text;
|
|
p = text;
|
|
do {
|
|
do {
|
|
struct sockaddr_rxrpc *srx = &alist->addrs[alist->nr_addrs];
|
|
struct sockaddr_rxrpc *srx = &alist->addrs[alist->nr_addrs];
|
|
- char tdelim = delim;
|
|
|
|
|
|
+ const char *q, *stop;
|
|
|
|
|
|
if (*p == delim) {
|
|
if (*p == delim) {
|
|
p++;
|
|
p++;
|
|
@@ -130,28 +130,33 @@ struct afs_addr_list *afs_parse_text_addrs(const char *text, size_t len,
|
|
|
|
|
|
if (*p == '[') {
|
|
if (*p == '[') {
|
|
p++;
|
|
p++;
|
|
- tdelim = ']';
|
|
|
|
|
|
+ q = memchr(p, ']', end - p);
|
|
|
|
+ } else {
|
|
|
|
+ for (q = p; q < end; q++)
|
|
|
|
+ if (*q == '+' || *q == delim)
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
|
|
- if (in4_pton(p, end - p,
|
|
|
|
|
|
+ if (in4_pton(p, q - p,
|
|
(u8 *)&srx->transport.sin6.sin6_addr.s6_addr32[3],
|
|
(u8 *)&srx->transport.sin6.sin6_addr.s6_addr32[3],
|
|
- tdelim, &p)) {
|
|
|
|
|
|
+ -1, &stop)) {
|
|
srx->transport.sin6.sin6_addr.s6_addr32[0] = 0;
|
|
srx->transport.sin6.sin6_addr.s6_addr32[0] = 0;
|
|
srx->transport.sin6.sin6_addr.s6_addr32[1] = 0;
|
|
srx->transport.sin6.sin6_addr.s6_addr32[1] = 0;
|
|
srx->transport.sin6.sin6_addr.s6_addr32[2] = htonl(0xffff);
|
|
srx->transport.sin6.sin6_addr.s6_addr32[2] = htonl(0xffff);
|
|
- } else if (in6_pton(p, end - p,
|
|
|
|
|
|
+ } else if (in6_pton(p, q - p,
|
|
srx->transport.sin6.sin6_addr.s6_addr,
|
|
srx->transport.sin6.sin6_addr.s6_addr,
|
|
- tdelim, &p)) {
|
|
|
|
|
|
+ -1, &stop)) {
|
|
/* Nothing to do */
|
|
/* Nothing to do */
|
|
} else {
|
|
} else {
|
|
goto bad_address;
|
|
goto bad_address;
|
|
}
|
|
}
|
|
|
|
|
|
- if (tdelim == ']') {
|
|
|
|
- if (p == end || *p != ']')
|
|
|
|
- goto bad_address;
|
|
|
|
|
|
+ if (stop != q)
|
|
|
|
+ goto bad_address;
|
|
|
|
+
|
|
|
|
+ p = q;
|
|
|
|
+ if (q < end && *q == ']')
|
|
p++;
|
|
p++;
|
|
- }
|
|
|
|
|
|
|
|
if (p < end) {
|
|
if (p < end) {
|
|
if (*p == '+') {
|
|
if (*p == '+') {
|