diff options
author | Lorenzo Colitti <lorenzo@google.com> | 2015-03-03 14:16:16 (GMT) |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-03-04 20:46:51 (GMT) |
commit | 9145736d4862145684009d6a72a6e61324a9439e (patch) | |
tree | 9ea72c7b5714af73f53f54b4787d02349fa2f1db /Documentation/devicetree/bindings/net/apm-xgene-enet.txt | |
parent | cd33ccf5fd87e94342b6cf8990e2e1570632c276 (diff) | |
download | linux-9145736d4862145684009d6a72a6e61324a9439e.tar.xz |
net: ping: Return EAFNOSUPPORT when appropriate.
1. For an IPv4 ping socket, ping_check_bind_addr does not check
the family of the socket address that's passed in. Instead,
make it behave like inet_bind, which enforces either that the
address family is AF_INET, or that the family is AF_UNSPEC and
the address is 0.0.0.0.
2. For an IPv6 ping socket, ping_check_bind_addr returns EINVAL
if the socket family is not AF_INET6. Return EAFNOSUPPORT
instead, for consistency with inet6_bind.
3. Make ping_v4_sendmsg and ping_v6_sendmsg return EAFNOSUPPORT
instead of EINVAL if an incorrect socket address structure is
passed in.
4. Make IPv6 ping sockets be IPv6-only. The code does not support
IPv4, and it cannot easily be made to support IPv4 because
the protocol numbers for ICMP and ICMPv6 are different. This
makes connect(::ffff:192.0.2.1) fail with EAFNOSUPPORT instead
of making the socket unusable.
Among other things, this fixes an oops that can be triggered by:
int s = socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP);
struct sockaddr_in6 sin6 = {
.sin6_family = AF_INET6,
.sin6_addr = in6addr_any,
};
bind(s, (struct sockaddr *) &sin6, sizeof(sin6));
Change-Id: If06ca86d9f1e4593c0d6df174caca3487c57a241
Signed-off-by: Lorenzo Colitti <lorenzo@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'Documentation/devicetree/bindings/net/apm-xgene-enet.txt')
0 files changed, 0 insertions, 0 deletions