RE: [EXT] [PATCH net-next v2 1/2] nfc: llcp_core: Hold a ref to llcp_local->dev when holding a ref to llcp_local

From: Suman Ghosh
Date: Sun Dec 03 2023 - 12:00:14 EST


Hi Siddh,

>@@ -180,6 +183,7 @@ int nfc_llcp_local_put(struct nfc_llcp_local *local)
> if (local == NULL)
> return 0;
>
>+ nfc_put_device(local->dev);
[Suman] One question here, if we consider the path, nfc_llcp_mac_is_down() -> nfc_llcp_socket_release() -> nfc_llcp_local_put(), then inside nfc_llcp_socket_release()
we are already doing nfc_put_device() if "sk->sk_state == LLCP_CONNECTED", with this change we are doing it again. I guess you need to add some check to avoid that. Let me know if I am missing something.

> return kref_put(&local->ref, local_release); }
>
>@@ -959,8 +963,17 @@ static void nfc_llcp_recv_connect(struct
>nfc_llcp_local *local,
> }
>
> new_sock = nfc_llcp_sock(new_sk);
>- new_sock->dev = local->dev;
>+
> new_sock->local = nfc_llcp_local_get(local);
>+ if (!new_sock->local) {
>+ reason = LLCP_DM_REJ;
>+ release_sock(&sock->sk);
>+ sock_put(&sock->sk);
>+ sock_put(&new_sock->sk);
[Suman] don't we need to free new_sock? nfc_llcp_sock_free()?
>+ goto fail;
>+ }
>+
>+ new_sock->dev = local->dev;
> new_sock->rw = sock->rw;
> new_sock->miux = sock->miux;
> new_sock->nfc_protocol = sock->nfc_protocol; @@ -1597,7 +1610,11 @@
>int nfc_llcp_register_device(struct nfc_dev *ndev)
> if (local == NULL)
> return -ENOMEM;
>
>- local->dev = ndev;
>+ /* Hold a reference to the device. */
>+ local->dev = nfc_get_device(ndev->idx);
>+ if (!local->dev)
>+ return -ENODEV;
[Suman] Memory leak here. Need to call kfree(local).
>+
> INIT_LIST_HEAD(&local->list);
> kref_init(&local->ref);
> mutex_init(&local->sdp_lock);
>--
>2.42.0
>