From ff0107fc0a9e4bc4e52bcd497573e7a26bfd8715 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 5 Dec 2019 13:16:11 +0100 Subject: [PATCH] fp-device: Use different pointers for device handlers A Fp-device use an union to track the handle to the lower-level device, and the value depends on the object type. So in case of using a virtual device, the priv->usb_device location matches the priv->virtual_env string location, and thus we'd end up unreffing a string location as it was a GObject, while we'd leak the string. To avoid such errors, instead of just checking the device type when we finalize the device, let's just use different pointers to avoid other possible clashes. --- libfprint/fp-device.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/libfprint/fp-device.c b/libfprint/fp-device.c index 2f706b3..08023f2 100644 --- a/libfprint/fp-device.c +++ b/libfprint/fp-device.c @@ -50,11 +50,8 @@ typedef struct { FpDeviceType type; - union - { - GUsbDevice *usb_device; - const gchar *virtual_env; - }; + GUsbDevice *usb_device; + const gchar *virtual_env; gboolean is_open; @@ -382,7 +379,9 @@ fp_device_finalize (GObject *object) g_clear_pointer (&priv->device_id, g_free); g_clear_pointer (&priv->device_name, g_free); + g_clear_object (&priv->usb_device); + g_clear_pointer (&priv->virtual_env, g_free); G_OBJECT_CLASS (fp_device_parent_class)->finalize (object); }