Skip to content

Commit 1bb23bf

Browse files
crlonxpwoody-apple
authored andcommitted
Cancel the subscription in destructor to avoid the use-after-free issue
Signed-off-by: Lo,Chin-Ran <chin-ran.lo@nxp.com>
1 parent d63bd30 commit 1bb23bf

6 files changed

+47
-101
lines changed

src/controller/CHIPDeviceController.cpp

+1-72
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ DeviceCommissioner::DeviceCommissioner() :
472472
DeviceCommissioner::~DeviceCommissioner()
473473
{
474474
#if CHIP_DEVICE_CONFIG_ENABLE_WIFIPAF
475-
SetChkObjValid((void *) this, ObjChkAction::Clear, nullptr);
475+
DeviceLayer::ConnectivityMgr().WiFiPAFCancelConnect();
476476
#endif
477477
}
478478

@@ -833,7 +833,6 @@ CHIP_ERROR DeviceCommissioner::EstablishPASEConnection(NodeId remoteDeviceId, Re
833833
ExitNow(CHIP_ERROR_INTERNAL);
834834
}
835835
mRendezvousParametersForDeviceDiscoveredOverWiFiPAF = params;
836-
SetChkObjValid((void *) this, ObjChkAction::Set, nullptr);
837836
DeviceLayer::ConnectivityMgr().WiFiPAFConnect(params.GetSetupDiscriminator().value(), (void *) this,
838837
OnWiFiPAFSubscribeComplete, OnWiFiPAFSubscribeError);
839838
ExitNow(CHIP_NO_ERROR);
@@ -908,70 +907,8 @@ void DeviceCommissioner::OnDiscoveredDeviceOverBleError(void * appState, CHIP_ER
908907
#endif // CONFIG_NETWORK_LAYER_BLE
909908

910909
#if CHIP_DEVICE_CONFIG_ENABLE_WIFIPAF
911-
void DeviceCommissioner::SetChkObjValid(void * appObj, ObjChkAction action, bool * pIsObjValid)
912-
{
913-
static std::vector<void *> ObjVector;
914-
bool IsObjValid = false;
915-
916-
switch (action)
917-
{
918-
case ObjChkAction::Set: {
919-
for (auto lt = ObjVector.begin(); lt != ObjVector.end(); lt++)
920-
{
921-
if (*lt == appObj)
922-
{
923-
IsObjValid = true;
924-
break;
925-
}
926-
}
927-
if (IsObjValid == false)
928-
{
929-
ObjVector.push_back(appObj);
930-
IsObjValid = true;
931-
}
932-
}
933-
break;
934-
case ObjChkAction::Check: {
935-
for (auto lt = ObjVector.begin(); lt != ObjVector.end(); lt++)
936-
{
937-
if (*lt == appObj)
938-
{
939-
IsObjValid = true;
940-
break;
941-
}
942-
}
943-
}
944-
break;
945-
case ObjChkAction::Clear: {
946-
for (auto lt = ObjVector.begin(); lt != ObjVector.end(); lt++)
947-
{
948-
if (*lt == appObj)
949-
{
950-
// Already existed in the list => Remove it
951-
ObjVector.erase(lt);
952-
break;
953-
}
954-
}
955-
}
956-
break;
957-
}
958-
if (pIsObjValid != nullptr)
959-
{
960-
*pIsObjValid = IsObjValid;
961-
}
962-
return;
963-
}
964-
965910
void DeviceCommissioner::OnWiFiPAFSubscribeComplete(void * appState)
966911
{
967-
bool isObjValid;
968-
SetChkObjValid(appState, ObjChkAction::Check, &isObjValid);
969-
if (isObjValid == false)
970-
{
971-
// The caller has been released.
972-
ChipLogError(Controller, "DeviceCommissioner has been destroyed!");
973-
return;
974-
}
975912
auto self = (DeviceCommissioner *) appState;
976913
auto device = self->mDeviceInPASEEstablishment;
977914

@@ -989,14 +926,6 @@ void DeviceCommissioner::OnWiFiPAFSubscribeComplete(void * appState)
989926

990927
void DeviceCommissioner::OnWiFiPAFSubscribeError(void * appState, CHIP_ERROR err)
991928
{
992-
bool isObjValid;
993-
SetChkObjValid(appState, ObjChkAction::Check, &isObjValid);
994-
if (isObjValid == false)
995-
{
996-
// The caller has been released.
997-
ChipLogError(Controller, "DeviceCommissioner has been destroyed!");
998-
return;
999-
}
1000929
auto self = (DeviceCommissioner *) appState;
1001930
auto device = self->mDeviceInPASEEstablishment;
1002931

src/controller/CHIPDeviceController.h

-9
Original file line numberDiff line numberDiff line change
@@ -821,15 +821,6 @@ class DLL_EXPORT DeviceCommissioner : public DeviceController,
821821
return ExtendArmFailSafeInternal(proxy, step, armFailSafeTimeout, commandTimeout, onSuccess, onFailure,
822822
/* fireAndForget = */ true);
823823
}
824-
#if CHIP_DEVICE_CONFIG_ENABLE_WIFIPAF
825-
enum ObjChkAction
826-
{
827-
Set,
828-
Check,
829-
Clear
830-
};
831-
static void SetChkObjValid(void * appState, ObjChkAction action, bool * pIsObjValid);
832-
#endif
833824

834825
private:
835826
DevicePairingDelegate * mPairingDelegate = nullptr;

src/controller/SetUpCodePairer.cpp

+1-19
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ CHIP_ERROR GetPayload(const char * setUpCode, SetupPayload & payload)
6363
SetUpCodePairer::~SetUpCodePairer()
6464
{
6565
#if CHIP_DEVICE_CONFIG_ENABLE_WIFIPAF
66-
DeviceCommissioner::SetChkObjValid((void *) this, DeviceCommissioner::ObjChkAction::Clear, nullptr);
66+
DeviceLayer::ConnectivityMgr().WiFiPAFCancelConnect();
6767
#endif
6868
}
6969

@@ -266,8 +266,6 @@ CHIP_ERROR SetUpCodePairer::StartDiscoverOverWiFiPAF(SetupPayload & payload)
266266
ChipLogProgress(Controller, "Starting commissioning discovery over WiFiPAF");
267267
VerifyOrReturnError(mCommissioner != nullptr, CHIP_ERROR_INCORRECT_STATE);
268268
mWaitingForDiscovery[kWiFiPAFTransport] = true;
269-
270-
DeviceCommissioner::SetChkObjValid((void *) this, DeviceCommissioner::ObjChkAction::Set, nullptr);
271269
CHIP_ERROR err = DeviceLayer::ConnectivityMgr().WiFiPAFConnect(payload.discriminator, (void *) this, OnWiFiPAFSubscribeComplete,
272270
OnWiFiPAFSubscribeError);
273271
if (err != CHIP_NO_ERROR)
@@ -399,28 +397,12 @@ void SetUpCodePairer::OnWifiPAFDiscoveryError(CHIP_ERROR err)
399397

400398
void SetUpCodePairer::OnWiFiPAFSubscribeComplete(void * appState)
401399
{
402-
bool isObjValid;
403-
DeviceCommissioner::SetChkObjValid(appState, DeviceCommissioner::ObjChkAction::Check, &isObjValid);
404-
if (isObjValid == false)
405-
{
406-
// The caller has been released.
407-
ChipLogError(Controller, "SetUpCodePairer has been destroyed!");
408-
return;
409-
}
410400
auto self = (SetUpCodePairer *) appState;
411401
self->OnDiscoveredDeviceOverWifiPAF();
412402
}
413403

414404
void SetUpCodePairer::OnWiFiPAFSubscribeError(void * appState, CHIP_ERROR err)
415405
{
416-
bool isObjValid;
417-
DeviceCommissioner::SetChkObjValid(appState, DeviceCommissioner::ObjChkAction::Check, &isObjValid);
418-
if (isObjValid == false)
419-
{
420-
// The caller has been released.
421-
ChipLogError(Controller, "SetUpCodePairer has been destroyed!");
422-
return;
423-
}
424406
auto self = (SetUpCodePairer *) appState;
425407
self->OnWifiPAFDiscoveryError(err);
426408
}

src/include/platform/ConnectivityManager.h

+6
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ class ConnectivityManager
182182
typedef void (*OnConnectionErrorFunct)(void * appState, CHIP_ERROR err);
183183
CHIP_ERROR WiFiPAFConnect(const SetupDiscriminator & connDiscriminator, void * appState, OnConnectionCompleteFunct onSuccess,
184184
OnConnectionErrorFunct onError);
185+
CHIP_ERROR WiFiPAFCancelConnect();
185186
CHIP_ERROR WiFiPAFSend(System::PacketBufferHandle && msgBuf);
186187
Transport::WiFiPAFBase * GetWiFiPAF();
187188
void SetWiFiPAF(Transport::WiFiPAFBase * pmWiFiPAF);
@@ -444,6 +445,11 @@ inline CHIP_ERROR ConnectivityManager::WiFiPAFConnect(const SetupDiscriminator &
444445
return static_cast<ImplClass *>(this)->_WiFiPAFConnect(connDiscriminator, appState, onSuccess, onError);
445446
}
446447

448+
inline CHIP_ERROR ConnectivityManager::WiFiPAFCancelConnect()
449+
{
450+
return static_cast<ImplClass *>(this)->_WiFiPAFCancelConnect();
451+
}
452+
447453
inline CHIP_ERROR ConnectivityManager::WiFiPAFSend(chip::System::PacketBufferHandle && msgBuf)
448454
{
449455
return static_cast<ImplClass *>(this)->_WiFiPAFSend(std::move(msgBuf));

src/platform/Linux/ConnectivityManagerImpl.cpp

+36
Original file line numberDiff line numberDiff line change
@@ -1444,6 +1444,20 @@ void ConnectivityManagerImpl::OnNanReceive(GVariant * obj)
14441444
return;
14451445
}
14461446

1447+
void ConnectivityManagerImpl::OnNanSubscribeTerminated(gint term_subscribe_id, gint reason)
1448+
{
1449+
ChipLogProgress(Controller, "WiFi-PAF: Subscription terminated (%d, %d)", term_subscribe_id, reason);
1450+
if (mpresubscribe_id == (uint32_t) term_subscribe_id)
1451+
{
1452+
mpresubscribe_id = 0;
1453+
}
1454+
if (mpaf_info.subscribe_id == (uint32_t) term_subscribe_id)
1455+
{
1456+
mpaf_info.subscribe_id = 0;
1457+
}
1458+
return;
1459+
}
1460+
14471461
CHIP_ERROR ConnectivityManagerImpl::_WiFiPAFConnect(const SetupDiscriminator & connDiscriminator, void * appState,
14481462
OnConnectionCompleteFunct onSuccess, OnConnectionErrorFunct onError)
14491463
{
@@ -1478,6 +1492,7 @@ CHIP_ERROR ConnectivityManagerImpl::_WiFiPAFConnect(const SetupDiscriminator & c
14781492
wpa_fi_w1_wpa_supplicant1_interface_call_nansubscribe_sync(mWpaSupplicant.iface, args, &subscribe_id, nullptr,
14791493
&err.GetReceiver());
14801494
ChipLogProgress(DeviceLayer, "WiFi-PAF: subscribe_id: [%d]", subscribe_id);
1495+
mpresubscribe_id = subscribe_id;
14811496
mOnPafSubscribeComplete = onSuccess;
14821497
mOnPafSubscribeError = onError;
14831498
g_signal_connect(mWpaSupplicant.iface, "nan-discoveryresult",
@@ -1491,6 +1506,27 @@ CHIP_ERROR ConnectivityManagerImpl::_WiFiPAFConnect(const SetupDiscriminator & c
14911506
}),
14921507
this);
14931508

1509+
g_signal_connect(mWpaSupplicant.iface, "nan-subscribeterminated",
1510+
G_CALLBACK(+[](WpaFiW1Wpa_supplicant1Interface * proxy, gint term_subscribe_id, gint reason,
1511+
ConnectivityManagerImpl * self) {
1512+
return self->OnNanSubscribeTerminated(term_subscribe_id, reason);
1513+
}),
1514+
this);
1515+
1516+
return CHIP_NO_ERROR;
1517+
}
1518+
1519+
CHIP_ERROR ConnectivityManagerImpl::_WiFiPAFCancelConnect()
1520+
{
1521+
if (mpresubscribe_id == 0)
1522+
{
1523+
return CHIP_NO_ERROR;
1524+
}
1525+
GAutoPtr<GError> err;
1526+
gchar args[MAX_PAF_PUBLISH_SSI_BUFLEN];
1527+
1528+
snprintf(args, sizeof(args), "subscribe_id=%d", mpresubscribe_id);
1529+
wpa_fi_w1_wpa_supplicant1_interface_call_nancancel_subscribe_sync(mWpaSupplicant.iface, args, nullptr, &err.GetReceiver());
14941530
return CHIP_NO_ERROR;
14951531
}
14961532

src/platform/Linux/ConnectivityManagerImpl.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,10 @@ class ConnectivityManagerImpl final : public ConnectivityManager,
143143
#if CHIP_DEVICE_CONFIG_ENABLE_WIFIPAF
144144
CHIP_ERROR _WiFiPAFConnect(const SetupDiscriminator & connDiscriminator, void * appState, OnConnectionCompleteFunct onSuccess,
145145
OnConnectionErrorFunct onError);
146+
CHIP_ERROR _WiFiPAFCancelConnect();
146147
void OnDiscoveryResult(gboolean success, GVariant * obj);
147148
void OnNanReceive(GVariant * obj);
148-
149+
void OnNanSubscribeTerminated(gint term_subscribe_id, gint reason);
149150
CHIP_ERROR _WiFiPAFSend(chip::System::PacketBufferHandle && msgBuf);
150151
Transport::WiFiPAFBase * _GetWiFiPAF();
151152
void _SetWiFiPAF(Transport::WiFiPAFBase * pWiFiPAF);
@@ -236,6 +237,7 @@ class ConnectivityManagerImpl final : public ConnectivityManager,
236237
uint8_t peer_addr[6];
237238
uint32_t ssi_len;
238239
};
240+
uint32_t mpresubscribe_id;
239241
struct wpa_dbus_discov_info mpaf_info;
240242
struct wpa_dbus_nanrx_info
241243
{

0 commit comments

Comments
 (0)