diff options
author | David Ahern <dsa@cumulusnetworks.com> | 2016-08-23 21:06:33 -0700 |
---|---|---|
committer | Lorenzo Colitti <lorenzo@google.com> | 2016-09-19 02:19:26 +0900 |
commit | 2f500d61a4df5764d94abfab7cbc43e4e9b92881 (patch) | |
tree | d9b424f491c53baf58ea0ae2706c6e3a9df463a4 /net/ipv4/udp.c | |
parent | ecd02bbc43641454b940fcf9c16b39ab8179af67 (diff) |
net: diag: support SOCK_DESTROY for UDP sockets
This implements SOCK_DESTROY for UDP sockets similar to what was done
for TCP with commit c1e64e298b8ca ("net: diag: Support destroying TCP
sockets.") A process with a UDP socket targeted for destroy is awakened
and recvmsg fails with ECONNABORTED.
[cherry-pick of 5d77dca82839ef016a93ad7acd7058b14d967752]
Change-Id: I4b4862548e6e3c05dde27781e7daa0b18b93bd81
Signed-off-by: David Ahern <dsa@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/udp.c')
-rw-r--r-- | net/ipv4/udp.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index d8946929813e..660933edd2d2 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -2257,6 +2257,20 @@ unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait) } EXPORT_SYMBOL(udp_poll); +int udp_abort(struct sock *sk, int err) +{ + lock_sock(sk); + + sk->sk_err = err; + sk->sk_error_report(sk); + udp_disconnect(sk, 0); + + release_sock(sk); + + return 0; +} +EXPORT_SYMBOL_GPL(udp_abort); + struct proto udp_prot = { .name = "UDP", .owner = THIS_MODULE, @@ -2288,6 +2302,7 @@ struct proto udp_prot = { .compat_getsockopt = compat_udp_getsockopt, #endif .clear_sk = sk_prot_clear_portaddr_nulls, + .diag_destroy = udp_abort, }; EXPORT_SYMBOL(udp_prot); |