Message ID | 20231222-tcp-ao-kref_get_unless_zero-v1-1-551c2edd0136@arista.com (mailing list archive) |
---|---|
State | Accepted |
Commit | b901a4e276943f61e11ddb597a0abc1e7dfadf0f |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net/tcp_sigpool: Use kref_get_unless_zero() | expand |
On Fri, Dec 22, 2023 at 01:13:59AM +0000, Dmitry Safonov wrote: > The freeing and re-allocation of algorithm are protected by cpool_mutex, > so it doesn't fix an actual use-after-free, but avoids a deserved > refcount_warn_saturate() warning. > > A trivial fix for the racy behavior. > > Fixes: 8c73b26315aa ("net/tcp: Prepare tcp_md5sig_pool for TCP-AO") > Suggested-by: Eric Dumazet <edumazet@google.com> > Signed-off-by: Dmitry Safonov <dima@arista.com> > --- > net/ipv4/tcp_sigpool.c | 5 ++--- > 1 file changed, 2 insertions(+), 3 deletions(-) > > diff --git a/net/ipv4/tcp_sigpool.c b/net/ipv4/tcp_sigpool.c > index 55b310a722c7..8512cb09ebc0 100644 > --- a/net/ipv4/tcp_sigpool.c > +++ b/net/ipv4/tcp_sigpool.c > @@ -162,9 +162,8 @@ int tcp_sigpool_alloc_ahash(const char *alg, size_t scratch_size) > if (strcmp(cpool[i].alg, alg)) > continue; > > - if (kref_read(&cpool[i].kref) > 0) > - kref_get(&cpool[i].kref); > - else > + /* pairs with tcp_sigpool_release() */ > + if (!kref_get_unless_zero(&cpool[i].kref)) > kref_init(&cpool[i].kref); > ret = i; > goto out; > > --- > base-commit: 1a44b0073b9235521280e19d963b6dfef7888f18 > change-id: 20231222-tcp-ao-kref_get_unless_zero-fe7105781ba4 > No observable regressions when booting the kernel with this patch applied. Tested-by: Bagas Sanjaya <bagasdotme@gmail.com>
On Fri, Dec 22, 2023 at 2:14 AM Dmitry Safonov <dima@arista.com> wrote: > > The freeing and re-allocation of algorithm are protected by cpool_mutex, > so it doesn't fix an actual use-after-free, but avoids a deserved > refcount_warn_saturate() warning. > > A trivial fix for the racy behavior. > > Fixes: 8c73b26315aa ("net/tcp: Prepare tcp_md5sig_pool for TCP-AO") > Suggested-by: Eric Dumazet <edumazet@google.com> > Signed-off-by: Dmitry Safonov <dima@arista.com> Reported-by: syzbot <syzkaller@googlegroups.com> Reviewed-by: Eric Dumazet <edumazet@google.com>
Hello: This patch was applied to netdev/net.git (main) by David S. Miller <davem@davemloft.net>: On Fri, 22 Dec 2023 01:13:59 +0000 you wrote: > The freeing and re-allocation of algorithm are protected by cpool_mutex, > so it doesn't fix an actual use-after-free, but avoids a deserved > refcount_warn_saturate() warning. > > A trivial fix for the racy behavior. > > Fixes: 8c73b26315aa ("net/tcp: Prepare tcp_md5sig_pool for TCP-AO") > Suggested-by: Eric Dumazet <edumazet@google.com> > Signed-off-by: Dmitry Safonov <dima@arista.com> > > [...] Here is the summary with links: - net/tcp_sigpool: Use kref_get_unless_zero() https://git.kernel.org/netdev/net/c/b901a4e27694 You are awesome, thank you!
diff --git a/net/ipv4/tcp_sigpool.c b/net/ipv4/tcp_sigpool.c index 55b310a722c7..8512cb09ebc0 100644 --- a/net/ipv4/tcp_sigpool.c +++ b/net/ipv4/tcp_sigpool.c @@ -162,9 +162,8 @@ int tcp_sigpool_alloc_ahash(const char *alg, size_t scratch_size) if (strcmp(cpool[i].alg, alg)) continue; - if (kref_read(&cpool[i].kref) > 0) - kref_get(&cpool[i].kref); - else + /* pairs with tcp_sigpool_release() */ + if (!kref_get_unless_zero(&cpool[i].kref)) kref_init(&cpool[i].kref); ret = i; goto out;
The freeing and re-allocation of algorithm are protected by cpool_mutex, so it doesn't fix an actual use-after-free, but avoids a deserved refcount_warn_saturate() warning. A trivial fix for the racy behavior. Fixes: 8c73b26315aa ("net/tcp: Prepare tcp_md5sig_pool for TCP-AO") Suggested-by: Eric Dumazet <edumazet@google.com> Signed-off-by: Dmitry Safonov <dima@arista.com> --- net/ipv4/tcp_sigpool.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) --- base-commit: 1a44b0073b9235521280e19d963b6dfef7888f18 change-id: 20231222-tcp-ao-kref_get_unless_zero-fe7105781ba4 Best regards,