From 460e58128fdbcc1035dc1368003c1e4692dfa55e 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 100/181] 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); } -- 2.24.1