wifi: ath11k: Fix error handling in ath11k_wmi_p2p_noa_event()
authorChristophe JAILLET <christophe.jaillet@wanadoo.fr>
Mon, 15 Apr 2024 20:26:41 +0000 (22:26 +0200)
committerKalle Valo <quic_kvalo@quicinc.com>
Thu, 18 Apr 2024 15:20:08 +0000 (18:20 +0300)
if (noa_descriptors > WMI_P2P_MAX_NOA_DESCRIPTORS), there is a mix of
return and goto. In such a case, 'td' should be freed to avoid a memory
leak.

While at it, change ath11k_wmi_p2p_noa_event() to return void.
'0' was returned in all cases, even in case of error and the only caller
does not handle the return value.
This is also more consistent with most of functions called from
ath11k_wmi_tlv_op_rx().

Fixes: 2408379f15a1 ("wifi: ath11k: implement handling of P2P NoA event")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://msgid.link/07f1fc75b2d5b4173ae1b7bb1da5be7f6fc608c8.1713212781.git.christophe.jaillet@wanadoo.fr
drivers/net/wireless/ath/ath11k/wmi.c

index c74aa3f95658dc54a423d3f08f1e1e63a9645ef3..e9ae305a8a6114ef30234d3db680f076639a75f8 100644 (file)
@@ -8650,30 +8650,27 @@ exit:
        kfree(tb);
 }
 
-static int ath11k_wmi_p2p_noa_event(struct ath11k_base *ab,
-                                   struct sk_buff *skb)
+static void ath11k_wmi_p2p_noa_event(struct ath11k_base *ab,
+                                    struct sk_buff *skb)
 {
        const void **tb;
        const struct wmi_p2p_noa_event *ev;
        const struct ath11k_wmi_p2p_noa_info *noa;
        struct ath11k *ar;
-       int ret, vdev_id;
+       int vdev_id;
        u8 noa_descriptors;
 
        tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
-               ret = PTR_ERR(tb);
-               ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
-               return ret;
+               ath11k_warn(ab, "failed to parse tlv: %ld\n", PTR_ERR(tb));
+               return;
        }
 
        ev = tb[WMI_TAG_P2P_NOA_EVENT];
        noa = tb[WMI_TAG_P2P_NOA_INFO];
 
-       if (!ev || !noa) {
-               ret = -EPROTO;
+       if (!ev || !noa)
                goto out;
-       }
 
        vdev_id = ev->vdev_id;
        noa_descriptors = u32_get_bits(noa->noa_attr,
@@ -8682,7 +8679,6 @@ static int ath11k_wmi_p2p_noa_event(struct ath11k_base *ab,
        if (noa_descriptors > WMI_P2P_MAX_NOA_DESCRIPTORS) {
                ath11k_warn(ab, "invalid descriptor num %d in P2P NoA event\n",
                            noa_descriptors);
-               return -EINVAL;
                goto out;
        }
 
@@ -8695,7 +8691,6 @@ static int ath11k_wmi_p2p_noa_event(struct ath11k_base *ab,
        if (!ar) {
                ath11k_warn(ab, "invalid vdev id %d in P2P NoA event\n",
                            vdev_id);
-               ret = -EINVAL;
                goto unlock;
        }
 
@@ -8705,7 +8700,6 @@ unlock:
        rcu_read_unlock();
 out:
        kfree(tb);
-       return 0;
 }
 
 static void ath11k_wmi_tlv_op_rx(struct ath11k_base *ab, struct sk_buff *skb)