qcacld-3.0: Release serialization cmd when get peer null

In P2P connect process, GO and GC send deauth/disassoc at the
end of WPS. GO send disassoc and free station info. GO receive
deauth from GC, and send cmd WLAN_SER_CMD_GET_DISCONNECT_STATS
to get disconnect stats.

If GO send deauth and free peer info before receive deauth
from GC. Wlan_objmgr_get_peer return null, and peer is null.
Cmd of WLAN_SER_CMD_GET_DISCONNECT_STATS will never be
released since get_peer_rssi_cb will never be called.
And cmd will timeout, which is not expected.

If we call get_peer_rssi_cb without check, cmd will release.
Also csr_get_peer_rssi_cb will check peer is null or not.

Change-Id: I10b496526e259711a4dd7a91b7388ac79bb54fef
CRs-Fixed: 3119513
This commit is contained in:
chunquan
2022-02-22 19:09:11 +08:00
committed by Madan Koyyalamudi
parent 4e3884f464
commit 6e475e2bff
2 changed files with 7 additions and 3 deletions

View File

@@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -305,8 +305,7 @@ tgt_mc_cp_stats_prepare_raw_peer_rssi(struct wlan_objmgr_psoc *psoc,
} }
end: end:
if (ev.peer_stats) get_peer_rssi_cb(&ev, last_req->cookie);
get_peer_rssi_cb(&ev, last_req->cookie);
ucfg_mc_cp_stats_free_stats_resources(&ev); ucfg_mc_cp_stats_free_stats_resources(&ev);

View File

@@ -419,6 +419,11 @@ static void get_peer_rssi_cb(struct stats_event *ev, void *cookie)
return; return;
} }
if (!ev->peer_stats) {
osif_err("no peer stats");
goto get_peer_rssi_cb_fail;
}
priv = osif_request_priv(request); priv = osif_request_priv(request);
rssi_size = sizeof(*ev->peer_stats) * ev->num_peer_stats; rssi_size = sizeof(*ev->peer_stats) * ev->num_peer_stats;
if (rssi_size == 0) { if (rssi_size == 0) {