From cbab4ef2bfc87960d7af2757f094e2924d5f4101 Mon Sep 17 00:00:00 2001 From: shripad621git Date: Fri, 31 Jan 2025 15:03:17 +0530 Subject: [PATCH] [ESP32]: Fixed the crash due to ble_hs_is_enabled check bypass --- src/platform/ESP32/BLEManagerImpl.h | 1 + src/platform/ESP32/nimble/BLEManagerImpl.cpp | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/platform/ESP32/BLEManagerImpl.h b/src/platform/ESP32/BLEManagerImpl.h index 2a489420a055a1..6e71b1990adcdd 100644 --- a/src/platform/ESP32/BLEManagerImpl.h +++ b/src/platform/ESP32/BLEManagerImpl.h @@ -227,6 +227,7 @@ class BLEManagerImpl final : public BLEManager, kUseCustomDeviceName = 0x0400, /**< The application has configured a custom BLE device name. */ kAdvertisingRefreshNeeded = 0x0800, /**< The advertising configuration/state in ESP BLE layer needs to be updated. */ kExtAdvertisingEnabled = 0x1000, /**< The application has enabled Extended BLE announcement. */ + kBleDeinitAndMemReleased = 0x2000, /**< The ble is deinitialized and memory is reclaimed. */ }; enum diff --git a/src/platform/ESP32/nimble/BLEManagerImpl.cpp b/src/platform/ESP32/nimble/BLEManagerImpl.cpp index 5ce08f1d727ca8..8dd143cc86bd2a 100644 --- a/src/platform/ESP32/nimble/BLEManagerImpl.cpp +++ b/src/platform/ESP32/nimble/BLEManagerImpl.cpp @@ -244,6 +244,12 @@ CHIP_ERROR BLEManagerImpl::_Init() void BLEManagerImpl::_Shutdown() { + if (mFlags.Has(Flags::kBleDeinitAndMemReleased)) + { + ChipLogProgress(DeviceLayer, "Ble already deinitialized, returning from ShutDown flow"); + return; + } + CancelBleAdvTimeoutTimer(); BleLayer::Shutdown(); @@ -712,6 +718,7 @@ CHIP_ERROR BLEManagerImpl::MapBLEError(int bleErr) return CHIP_ERROR(ChipError::Range::kPlatform, CHIP_DEVICE_CONFIG_ESP32_BLE_ERROR_MIN + bleErr); } } + void BLEManagerImpl::CancelBleAdvTimeoutTimer(void) { if (SystemLayer().IsTimerActive(BleAdvTimeoutHandler, nullptr)) @@ -719,6 +726,7 @@ void BLEManagerImpl::CancelBleAdvTimeoutTimer(void) SystemLayer().CancelTimer(BleAdvTimeoutHandler, nullptr); } } + void BLEManagerImpl::StartBleAdvTimeoutTimer(uint32_t aTimeoutInMs) { CancelBleAdvTimeoutTimer(); @@ -729,6 +737,7 @@ void BLEManagerImpl::StartBleAdvTimeoutTimer(uint32_t aTimeoutInMs) ChipLogError(DeviceLayer, "Failed to start BledAdv timeout timer"); } } + void BLEManagerImpl::DriveBLEState(void) { CHIP_ERROR err = CHIP_NO_ERROR; @@ -739,6 +748,11 @@ void BLEManagerImpl::DriveBLEState(void) mFlags.Set(Flags::kAsyncInitCompleted); } + if (mFlags.Has(Flags::kBleDeinitAndMemReleased)) + { + return; + } + // Initializes the ESP BLE layer if needed. if (mServiceMode == ConnectivityManager::kCHIPoBLEServiceMode_Enabled && !mFlags.Has(Flags::kESPBLELayerInitialized)) { @@ -844,7 +858,7 @@ void BLEManagerImpl::DriveBLEState(void) if (mServiceMode != ConnectivityManager::kCHIPoBLEServiceMode_Enabled && mFlags.Has(Flags::kGATTServiceStarted)) { DeinitESPBleLayer(); - mFlags.ClearAll(); + mFlags.ClearAll().Set(Flags::kBleDeinitAndMemReleased); } exit: