mirror of https://github.com/labapart/gattlib
adapter: Add support to avoid double free of BLE adapter
parent
ea1fe15857
commit
6e718253b0
|
@ -6,6 +6,11 @@
|
||||||
|
|
||||||
#include "gattlib_internal.h"
|
#include "gattlib_internal.h"
|
||||||
|
|
||||||
|
// Keep track of the allocated adapters to avoid an adapter to be freed twice.
|
||||||
|
// It could happen when using Python wrapper.
|
||||||
|
static GSList *m_adapter_list;
|
||||||
|
static GMutex m_adapter_list_mutex;
|
||||||
|
|
||||||
|
|
||||||
int gattlib_adapter_open(const char* adapter_name, void** adapter) {
|
int gattlib_adapter_open(const char* adapter_name, void** adapter) {
|
||||||
char object_path[20];
|
char object_path[20];
|
||||||
|
@ -52,6 +57,10 @@ int gattlib_adapter_open(const char* adapter_name, void** adapter) {
|
||||||
gattlib_adapter->adapter_name = strdup(adapter_name);
|
gattlib_adapter->adapter_name = strdup(adapter_name);
|
||||||
gattlib_adapter->adapter_proxy = adapter_proxy;
|
gattlib_adapter->adapter_proxy = adapter_proxy;
|
||||||
|
|
||||||
|
g_mutex_lock(&m_adapter_list_mutex);
|
||||||
|
m_adapter_list = g_slist_append(m_adapter_list, gattlib_adapter);
|
||||||
|
g_mutex_unlock(&m_adapter_list_mutex);
|
||||||
|
|
||||||
*adapter = gattlib_adapter;
|
*adapter = gattlib_adapter;
|
||||||
return GATTLIB_SUCCESS;
|
return GATTLIB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -523,6 +532,13 @@ int gattlib_adapter_close(void* adapter)
|
||||||
{
|
{
|
||||||
struct gattlib_adapter *gattlib_adapter = adapter;
|
struct gattlib_adapter *gattlib_adapter = adapter;
|
||||||
|
|
||||||
|
g_mutex_lock(&m_adapter_list_mutex);
|
||||||
|
GSList *adapter_entry = g_slist_find(m_adapter_list, adapter);
|
||||||
|
if (adapter_entry == NULL) {
|
||||||
|
GATTLIB_LOG(GATTLIB_WARNING, "Adapter has already been closed");
|
||||||
|
goto EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
if (gattlib_adapter->ble_scan.is_scanning) {
|
if (gattlib_adapter->ble_scan.is_scanning) {
|
||||||
gattlib_adapter_scan_disable(gattlib_adapter);
|
gattlib_adapter_scan_disable(gattlib_adapter);
|
||||||
|
|
||||||
|
@ -546,10 +562,20 @@ int gattlib_adapter_close(void* adapter)
|
||||||
g_object_unref(gattlib_adapter->adapter_proxy);
|
g_object_unref(gattlib_adapter->adapter_proxy);
|
||||||
gattlib_adapter->adapter_proxy = NULL;
|
gattlib_adapter->adapter_proxy = NULL;
|
||||||
}
|
}
|
||||||
free(gattlib_adapter->adapter_name);
|
|
||||||
gattlib_adapter->adapter_name = NULL;
|
if (gattlib_adapter->adapter_name != NULL) {
|
||||||
|
free(gattlib_adapter->adapter_name);
|
||||||
|
gattlib_adapter->adapter_name = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
free(gattlib_adapter);
|
free(gattlib_adapter);
|
||||||
|
|
||||||
|
// Remove adapter from the global list
|
||||||
|
m_adapter_list = g_slist_remove(m_adapter_list, gattlib_adapter);
|
||||||
|
|
||||||
gattlib_adapter = NULL;
|
gattlib_adapter = NULL;
|
||||||
|
|
||||||
|
EXIT:
|
||||||
|
g_mutex_unlock(&m_adapter_list_mutex);
|
||||||
return GATTLIB_SUCCESS;
|
return GATTLIB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue