tcp: fix over estimation in sk_forced_mem_schedule()
authorEric Dumazet <edumazet@google.com>
Tue, 14 Jun 2022 17:17:33 +0000 (10:17 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Aug 2022 12:24:29 +0000 (14:24 +0200)
commit c4ee118561a0f74442439b7b5b486db1ac1ddfeb upstream.

sk_forced_mem_schedule() has a bug similar to ones fixed
in commit 7c80b038d23e ("net: fix sk_wmem_schedule() and
sk_rmem_schedule() errors")

While this bug has little chance to trigger in old kernels,
we need to fix it before the following patch.

Fixes: d83769a580f1 ("tcp: fix possible deadlock in tcp_send_fin()")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Acked-by: Soheil Hassas Yeganeh <soheil@google.com>
Reviewed-by: Shakeel Butt <shakeelb@google.com>
Reviewed-by: Wei Wang <weiwan@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/ipv4/tcp_output.c

index 24cadcd..40c9da4 100644 (file)
@@ -3372,11 +3372,12 @@ void tcp_xmit_retransmit_queue(struct sock *sk)
  */
 void sk_forced_mem_schedule(struct sock *sk, int size)
 {
-       int amt;
+       int delta, amt;
 
-       if (size <= sk->sk_forward_alloc)
+       delta = size - sk->sk_forward_alloc;
+       if (delta <= 0)
                return;
-       amt = sk_mem_pages(size);
+       amt = sk_mem_pages(delta);
        sk->sk_forward_alloc += amt * SK_MEM_QUANTUM;
        sk_memory_allocated_add(sk, amt);