diff options
author | Peter Wu <lekensteyn@gmail.com> | 2013-08-22 17:37:31 +0200 |
---|---|---|
committer | Peter Wu <lekensteyn@gmail.com> | 2013-09-02 11:45:18 +0200 |
commit | ed501335778dada8bedd7cb2b6db3c227517d630 (patch) | |
tree | d5c66bc6af81a87949a848f9806df58e63854a56 | |
parent | ab75c60b1e678518983be1558c9a4de2008871cb (diff) | |
download | upower-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.c | 32 |
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"); |