bluez5: fix memory leak on device battery path

This commit is contained in:
Huang-Huang Bao 2021-03-18 09:49:50 +08:00 committed by Wim Taymans
parent e9adb2844e
commit d0636875ee
2 changed files with 19 additions and 16 deletions

View file

@ -158,33 +158,35 @@ static int spa_bt_transport_start_release_timer(struct spa_bt_transport *transpo
// Developed using https://github.com/dgreid/adhd/commit/655b58f as an example of DBus calls. // Developed using https://github.com/dgreid/adhd/commit/655b58f as an example of DBus calls.
// Name of battery, formatted as /org/freedesktop/pipewire/battery/org/bluez/hciX/dev_XX_XX_XX_XX_XX_XX // Name of battery, formatted as /org/freedesktop/pipewire/battery/org/bluez/hciX/dev_XX_XX_XX_XX_XX_XX
static char *battery_get_name(struct spa_bt_device *device) static char *battery_get_name(const char *device_path)
{ {
char *path = malloc(strlen(PIPEWIRE_BATTERY_PROVIDER) + strlen(device->path) + 1); char *path = malloc(strlen(PIPEWIRE_BATTERY_PROVIDER) + strlen(device_path) + 1);
sprintf(path, PIPEWIRE_BATTERY_PROVIDER "%s", device->path); sprintf(path, PIPEWIRE_BATTERY_PROVIDER "%s", device_path);
return path; return path;
} }
// Unregister virtual battery of device // Unregister virtual battery of device
static void battery_remove(struct spa_bt_device *device) { static void battery_remove(struct spa_bt_device *device) {
if (!device->adapter->has_battery_provider) return; DBusMessageIter i, entry;
DBusMessage *m;
const char *interface;
spa_log_debug(device->monitor->log, NAME": Removing virtual battery: %s", battery_get_name(device)); if (!device->adapter->has_battery_provider || !device->has_battery)
return;
DBusMessage *m = dbus_message_new_signal(PIPEWIRE_BATTERY_PROVIDER, spa_log_debug(device->monitor->log, NAME": Removing virtual battery: %s", device->battery_path);
m = dbus_message_new_signal(PIPEWIRE_BATTERY_PROVIDER,
DBUS_INTERFACE_OBJECT_MANAGER, DBUS_INTERFACE_OBJECT_MANAGER,
DBUS_SIGNAL_INTERFACES_REMOVED); DBUS_SIGNAL_INTERFACES_REMOVED);
DBusMessageIter i, entry;
dbus_message_iter_init_append(m, &i); dbus_message_iter_init_append(m, &i);
const char *bat_name = battery_get_name(device);
dbus_message_iter_append_basic(&i, DBUS_TYPE_OBJECT_PATH, dbus_message_iter_append_basic(&i, DBUS_TYPE_OBJECT_PATH,
&bat_name); &device->battery_path);
dbus_message_iter_open_container(&i, DBUS_TYPE_ARRAY, dbus_message_iter_open_container(&i, DBUS_TYPE_ARRAY,
DBUS_TYPE_STRING_AS_STRING, &entry); DBUS_TYPE_STRING_AS_STRING, &entry);
const char *interface = BLUEZ_INTERFACE_BATTERY_PROVIDER; interface = BLUEZ_INTERFACE_BATTERY_PROVIDER;
dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING,
&interface); &interface);
dbus_message_iter_close_container(&i, &entry); dbus_message_iter_close_container(&i, &entry);
@ -231,13 +233,12 @@ static void battery_write_properties(DBusMessageIter *iter, struct spa_bt_device
// Send current percentage to BlueZ // Send current percentage to BlueZ
static void battery_update(struct spa_bt_device *device) static void battery_update(struct spa_bt_device *device)
{ {
const char *name = battery_get_name(device); spa_log_debug(device->monitor->log, NAME": updating battery: %s", device->battery_path);
spa_log_debug(device->monitor->log, NAME": updating battery: %s", name);
DBusMessage *msg; DBusMessage *msg;
DBusMessageIter iter; DBusMessageIter iter;
msg = dbus_message_new_signal(name, msg = dbus_message_new_signal(device->battery_path,
DBUS_INTERFACE_PROPERTIES, DBUS_INTERFACE_PROPERTIES,
DBUS_SIGNAL_PROPERTIES_CHANGED); DBUS_SIGNAL_PROPERTIES_CHANGED);
@ -263,9 +264,8 @@ static void battery_create(struct spa_bt_device *device) {
DBUS_SIGNAL_INTERFACES_ADDED); DBUS_SIGNAL_INTERFACES_ADDED);
dbus_message_iter_init_append(msg, &iter); dbus_message_iter_init_append(msg, &iter);
const char *bat_name = battery_get_name(device);
dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH, dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
&bat_name); &device->battery_path);
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sa{sv}}", &dict); dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sa{sv}}", &dict);
dbus_message_iter_open_container(&dict, DBUS_TYPE_DICT_ENTRY, NULL, &entry); dbus_message_iter_open_container(&dict, DBUS_TYPE_DICT_ENTRY, NULL, &entry);
const char *interface = BLUEZ_INTERFACE_BATTERY_PROVIDER; const char *interface = BLUEZ_INTERFACE_BATTERY_PROVIDER;
@ -637,6 +637,7 @@ static struct spa_bt_device *device_create(struct spa_bt_monitor *monitor, const
d->id = monitor->id++; d->id = monitor->id++;
d->monitor = monitor; d->monitor = monitor;
d->path = strdup(path); d->path = strdup(path);
d->battery_path = battery_get_name(d->path);
spa_list_init(&d->remote_endpoint_list); spa_list_init(&d->remote_endpoint_list);
spa_list_init(&d->transport_list); spa_list_init(&d->transport_list);
spa_list_init(&d->codec_switch_list); spa_list_init(&d->codec_switch_list);
@ -697,6 +698,7 @@ static void device_free(struct spa_bt_device *device)
free(device->alias); free(device->alias);
free(device->address); free(device->address);
free(device->adapter_path); free(device->adapter_path);
free(device->battery_path);
free(device->name); free(device->name);
free(device->icon); free(device->icon);
free(device); free(device);

View file

@ -394,6 +394,7 @@ struct spa_bt_device {
char *alias; char *alias;
char *address; char *address;
char *adapter_path; char *adapter_path;
char *battery_path;
char *name; char *name;
char *icon; char *icon;
uint32_t bluetooth_class; uint32_t bluetooth_class;