mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-21 19:53:59 +08:00
tcp: send_reset: test for non-NULL sk first
tcp_md5_do_lookup requires a full socket, so once we extend _send_reset() to also accept timewait socket we would have to change if (!sk && hash_location) to something like if ((!sk || !sk_fullsock(sk)) && hash_location) { ... } else { (sk && sk_fullsock(sk)) tcp_md5_do_lookup() } Switch the two branches: check if we have a socket first, then fall back to a listener lookup if we saw a md5 option (hash_location). Signed-off-by: Florian Westphal <fw@strlen.de> Acked-by: Eric Dumazet <edumazet@google.com> Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
b1f0a0e99c
commit
e46787f0dd
net
@ -587,7 +587,7 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb)
|
||||
} rep;
|
||||
struct ip_reply_arg arg;
|
||||
#ifdef CONFIG_TCP_MD5SIG
|
||||
struct tcp_md5sig_key *key;
|
||||
struct tcp_md5sig_key *key = NULL;
|
||||
const __u8 *hash_location = NULL;
|
||||
unsigned char newhash[16];
|
||||
int genhash;
|
||||
@ -627,7 +627,10 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb)
|
||||
net = sk ? sock_net(sk) : dev_net(skb_dst(skb)->dev);
|
||||
#ifdef CONFIG_TCP_MD5SIG
|
||||
hash_location = tcp_parse_md5sig_option(th);
|
||||
if (!sk && hash_location) {
|
||||
if (sk) {
|
||||
key = tcp_md5_do_lookup(sk, (union tcp_md5_addr *)
|
||||
&ip_hdr(skb)->saddr, AF_INET);
|
||||
} else if (hash_location) {
|
||||
/*
|
||||
* active side is lost. Try to find listening socket through
|
||||
* source port, and then find md5 key through listening socket.
|
||||
@ -651,10 +654,6 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb)
|
||||
genhash = tcp_v4_md5_hash_skb(newhash, key, NULL, skb);
|
||||
if (genhash || memcmp(hash_location, newhash, 16) != 0)
|
||||
goto release_sk1;
|
||||
} else {
|
||||
key = sk ? tcp_md5_do_lookup(sk, (union tcp_md5_addr *)
|
||||
&ip_hdr(skb)->saddr,
|
||||
AF_INET) : NULL;
|
||||
}
|
||||
|
||||
if (key) {
|
||||
|
@ -854,7 +854,9 @@ static void tcp_v6_send_reset(const struct sock *sk, struct sk_buff *skb)
|
||||
|
||||
#ifdef CONFIG_TCP_MD5SIG
|
||||
hash_location = tcp_parse_md5sig_option(th);
|
||||
if (!sk && hash_location) {
|
||||
if (sk) {
|
||||
key = tcp_v6_md5_do_lookup(sk, &ipv6h->saddr);
|
||||
} else if (hash_location) {
|
||||
/*
|
||||
* active side is lost. Try to find listening socket through
|
||||
* source port, and then find md5 key through listening socket.
|
||||
@ -877,8 +879,6 @@ static void tcp_v6_send_reset(const struct sock *sk, struct sk_buff *skb)
|
||||
genhash = tcp_v6_md5_hash_skb(newhash, key, NULL, skb);
|
||||
if (genhash || memcmp(hash_location, newhash, 16) != 0)
|
||||
goto release_sk1;
|
||||
} else {
|
||||
key = sk ? tcp_v6_md5_do_lookup(sk, &ipv6h->saddr) : NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user