summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Wu <lekensteyn@gmail.com>2013-08-22 17:37:31 +0200
committerPeter Wu <lekensteyn@gmail.com>2013-09-02 11:45:18 +0200
commited501335778dada8bedd7cb2b6db3c227517d630 (patch)
treed5c66bc6af81a87949a848f9806df58e63854a56
parentab75c60b1e678518983be1558c9a4de2008871cb (diff)
downloadupower-ed501335778dada8bedd7cb2b6db3c227517d630.tar.gz
hidpp: fix memleak while coldplugging
The device returned by g_udev_device_get_parent must be freed by the caller. Signed-off-by: Peter Wu <lekensteyn@gmail.com>
-rw-r--r--src/linux/up-device-unifying.c32
1 files changed, 21 insertions, 11 deletions
diff --git a/src/linux/up-device-unifying.c b/src/linux/up-device-unifying.c
index 8ebf946..830fa32 100644
--- a/src/linux/up-device-unifying.c
+++ b/src/linux/up-device-unifying.c
@@ -188,13 +188,19 @@ up_device_unifying_coldplug (UpDevice *device)
client = g_udev_client_new (NULL);
hidraw_list = g_udev_client_query_by_subsystem (client, "hidraw");
for (l = hidraw_list; l != NULL; l = l->next) {
+ gboolean receiver_found = FALSE;
+
if (g_strcmp0 (type, "lg-wireless") == 0) {
- gboolean receiver_found = FALSE;
const gchar *filename;
GDir* dir;
+ GUdevDevice *parent_dev;
+
+ parent_dev = g_udev_device_get_parent(l->data);
+ receiver_found = g_strcmp0 (g_udev_device_get_sysfs_path (native),
+ g_udev_device_get_sysfs_path(parent_dev)) == 0;
+ g_object_unref (parent_dev);
- if (g_strcmp0 (g_udev_device_get_sysfs_path (native),
- g_udev_device_get_sysfs_path(g_udev_device_get_parent(l->data))) != 0)
+ if (!receiver_found)
continue;
/* hidraw device which exposes hiddev interface is our receiver */
@@ -213,16 +219,20 @@ up_device_unifying_coldplug (UpDevice *device)
}
}
g_dir_close(dir);
-
- if (!receiver_found)
- continue;
} else {
- if (g_strcmp0 (g_udev_device_get_sysfs_path (parent),
- g_udev_device_get_sysfs_path(g_udev_device_get_parent(l->data))) != 0)
- continue;
+ GUdevDevice *parent_dev;
+
+ /* Unifying devices are located under their receiver */
+ parent_dev = g_udev_device_get_parent(l->data);
+ receiver_found = g_strcmp0 (g_udev_device_get_sysfs_path (parent),
+ g_udev_device_get_sysfs_path(parent_dev)) == 0;
+ g_object_unref (parent_dev);
+ }
+
+ if (receiver_found) {
+ receiver = g_object_ref (l->data);
+ break;
}
- receiver = g_object_ref (l->data);
- break;
}
if (receiver == NULL) {
g_debug ("Unable to find an hidraw device for Unifying receiver");