Skip to content

Commit

Permalink
IB/srp: Fix IPv6 address parsing
Browse files Browse the repository at this point in the history
Split IPv6 addresses at the colon that separates the IPv6 address
and the port number instead of at a colon in the middle of the IPv6
address. Check whether the IPv6 address is surrounded with square
brackets.

Fixes: 19f3134 ("IB/srp: Add RDMA/CM support")
Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
  • Loading branch information
Bart Van Assche authored and Doug Ledford committed Mar 14, 2018
1 parent 19b1f54 commit c62adb7
Showing 1 changed file with 23 additions and 4 deletions.
27 changes: 23 additions & 4 deletions drivers/infiniband/ulp/srp/ib_srp.c
Original file line number Diff line number Diff line change
Expand Up @@ -3414,18 +3414,37 @@ static const match_table_t srp_opt_tokens = {
{ SRP_OPT_ERR, NULL }
};

/**
* srp_parse_in - parse an IP address and port number combination
*
* Parse the following address formats:
* - IPv4: <ip_address>:<port>, e.g. 1.2.3.4:5.
* - IPv6: \[<ipv6_address>\]:<port>, e.g. [1::2:3%4]:5.
*/
static int srp_parse_in(struct net *net, struct sockaddr_storage *sa,
const char *addr_port_str)
{
char *addr = kstrdup(addr_port_str, GFP_KERNEL);
char *port_str = addr;
char *addr_end, *addr = kstrdup(addr_port_str, GFP_KERNEL);
char *port_str;
int ret;

if (!addr)
return -ENOMEM;
strsep(&port_str, ":");
ret = inet_pton_with_scope(net, AF_UNSPEC, addr, port_str, sa);
port_str = strrchr(addr, ':');
if (!port_str)
return -EINVAL;
*port_str++ = '\0';
ret = inet_pton_with_scope(net, AF_INET, addr, port_str, sa);
if (ret && addr[0]) {
addr_end = addr + strlen(addr) - 1;
if (addr[0] == '[' && *addr_end == ']') {
*addr_end = '\0';
ret = inet_pton_with_scope(net, AF_INET6, addr + 1,
port_str, sa);
}
}
kfree(addr);
pr_debug("%s -> %pISpfsc\n", addr_port_str, sa);
return ret;
}

Expand Down

0 comments on commit c62adb7

Please sign in to comment.