Re: [PATCH net] net/x25: fix use-after-free in x25_kill_by_neigh()

From: Paolo Abeni

Date: Thu Jul 23 2026 - 06:13:29 EST


On 7/13/26 12:47 PM, David Lee wrote:
> diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c
> index c31d2af5dd22..8aae9273b7c1 100644
> --- a/net/x25/af_x25.c
> +++ b/net/x25/af_x25.c
> @@ -1768,15 +1768,19 @@ void x25_kill_by_neigh(struct x25_neigh *nb)
> {
> struct sock *s;
>
> +again:
> write_lock_bh(&x25_list_lock);
>
> sk_for_each(s, &x25_list) {
> if (x25_sk(s)->neighbour == nb) {
> + sock_hold(s);
> write_unlock_bh(&x25_list_lock);
> lock_sock(s);
> - x25_disconnect(s, ENETUNREACH, 0, 0);
> + if (x25_sk(s)->neighbour == nb)
> + x25_disconnect(s, ENETUNREACH, 0, 0);
> release_sock(s);
> - write_lock_bh(&x25_list_lock);
> + sock_put(s);
> + goto again;
> }
> }
> write_unlock_bh(&x25_list_lock);

Note that sk will stay on list (with NULL neigh) even after disconnect
and the above introduces a quadratic behavior, but I can't find an easy
way to avoid it.

/P