Blob Blame History Raw
From 460e58128fdbcc1035dc1368003c1e4692dfa55e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= <mail@3v1n0.net>
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