Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 47dcc20a authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

ipv4: tcp: ip_send_unicast_reply() is not BH safe



I forgot that ip_send_unicast_reply() is not BH safe (yet).

Disabling preemption before calling it was not a good move.

Fixes: c10d9310 ("tcp: do not assume TCP code is non preemptible")
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Reported-by: default avatarAndres Lagar-Cavilla <andreslc@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4b307a8e
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -692,7 +692,7 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb)
		     offsetof(struct inet_timewait_sock, tw_bound_dev_if));

	arg.tos = ip_hdr(skb)->tos;
	preempt_disable();
	local_bh_disable();
	ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk),
			      skb, &TCP_SKB_CB(skb)->header.h4.opt,
			      ip_hdr(skb)->saddr, ip_hdr(skb)->daddr,
@@ -700,7 +700,7 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb)

	__TCP_INC_STATS(net, TCP_MIB_OUTSEGS);
	__TCP_INC_STATS(net, TCP_MIB_OUTRSTS);
	preempt_enable();
	local_bh_enable();

#ifdef CONFIG_TCP_MD5SIG
out:
@@ -776,14 +776,14 @@ static void tcp_v4_send_ack(struct net *net,
	if (oif)
		arg.bound_dev_if = oif;
	arg.tos = tos;
	preempt_disable();
	local_bh_disable();
	ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk),
			      skb, &TCP_SKB_CB(skb)->header.h4.opt,
			      ip_hdr(skb)->saddr, ip_hdr(skb)->daddr,
			      &arg, arg.iov[0].iov_len);

	__TCP_INC_STATS(net, TCP_MIB_OUTSEGS);
	preempt_enable();
	local_bh_enable();
}

static void tcp_v4_timewait_ack(struct sock *sk, struct sk_buff *skb)