Blob Blame History Raw
From e45ebf1af2a29f861a9aec367981492688692a72 Mon Sep 17 00:00:00 2001
From: Benjamin Berg <bberg@redhat.com>
Date: Mon, 13 Jan 2020 13:25:48 +0100
Subject: [PATCH 174/181] device: Better define ownership passing for results

Some things were odd with regard to the ownership of passed objects. Try
to make things sane overall, in particular with the possible floating
FpPrint reference.
---
 libfprint/fpi-device.c       | 20 ++++++++++++++++----
 libfprint/fpi-image-device.c |  2 +-
 tests/test-fpi-device.c      | 24 ++++++++++++------------
 3 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/libfprint/fpi-device.c b/libfprint/fpi-device.c
index 51dbee1..8b2ef9d 100644
--- a/libfprint/fpi-device.c
+++ b/libfprint/fpi-device.c
@@ -908,7 +908,7 @@ fpi_device_enroll_complete (FpDevice *device, FpPrint *print, GError *error)
  * fpi_device_verify_complete:
  * @device: The #FpDevice
  * @result: The #FpiMatchResult of the operation
- * @print: The scanned #FpPrint
+ * @print: (transfer floating) The scanned #FpPrint
  * @error: A #GError if result is %FPI_MATCH_ERROR
  *
  * Finish an ongoing verify operation. The returned print should be
@@ -929,6 +929,9 @@ fpi_device_verify_complete (FpDevice      *device,
 
   clear_device_cancel_action (device);
 
+  if (print)
+    g_object_ref_sink (print);
+
   g_object_set_data_full (G_OBJECT (priv->current_task),
                           "print",
                           print,
@@ -963,8 +966,8 @@ fpi_device_verify_complete (FpDevice      *device,
 /**
  * fpi_device_identify_complete:
  * @device: The #FpDevice
- * @match: The matching #FpPrint from the passed gallery, or %NULL if none matched
- * @print: The scanned #FpPrint, may be %NULL
+ * @match: (transfer none): The matching #FpPrint from the passed gallery, or %NULL if none matched
+ * @print: (transfer floating): The scanned #FpPrint, may be %NULL
  * @error: The #GError or %NULL on success
  *
  * Finish an ongoing identify operation. The match that was identified is
@@ -986,6 +989,12 @@ fpi_device_identify_complete (FpDevice *device,
 
   clear_device_cancel_action (device);
 
+  if (match)
+    g_object_ref (match);
+
+  if (print)
+    g_object_ref_sink (print);
+
   g_object_set_data_full (G_OBJECT (priv->current_task),
                           "print",
                           print,
@@ -1134,7 +1143,7 @@ fpi_device_list_complete (FpDevice  *device,
  * fpi_device_enroll_progress:
  * @device: The #FpDevice
  * @completed_stages: The number of stages that are completed at this point
- * @print: (transfer full): The #FpPrint for the newly completed stage or %NULL on failure
+ * @print: (transfer floating): The #FpPrint for the newly completed stage or %NULL on failure
  * @error: (transfer full): The #GError or %NULL on success
  *
  * Notify about the progress of the enroll operation. This is important for UI interaction.
@@ -1155,6 +1164,9 @@ fpi_device_enroll_progress (FpDevice *device,
 
   g_debug ("Device reported enroll progress, reported %i of %i have been completed", completed_stages, priv->nr_enroll_stages);
 
+  if (print)
+    g_object_ref_sink (print);
+
   if (error && print)
     {
       g_warning ("Driver passed an error and also provided a print, returning error!");
diff --git a/libfprint/fpi-image-device.c b/libfprint/fpi-image-device.c
index efdbb53..f962b8a 100644
--- a/libfprint/fpi-image-device.c
+++ b/libfprint/fpi-image-device.c
@@ -226,7 +226,7 @@ fpi_image_device_minutiae_detected (GObject *source_object, GAsyncResult *res, g
 
           if (fpi_print_bz3_match (template, print, priv->bz3_threshold, &error) == FPI_MATCH_SUCCESS)
             {
-              result = g_object_ref (template);
+              result = template;
               break;
             }
         }
diff --git a/tests/test-fpi-device.c b/tests/test-fpi-device.c
index 3fa800c..3d1e81c 100644
--- a/tests/test-fpi-device.c
+++ b/tests/test-fpi-device.c
@@ -548,10 +548,10 @@ test_driver_verify (void)
 {
   g_autoptr(GError) error = NULL;
   g_autoptr(FpAutoCloseDevice) device = auto_close_fake_device_new ();
-  g_autoptr(FpPrint) enrolled_print = fp_print_new (device);
+  g_autoptr(FpPrint) enrolled_print = g_object_ref_sink (fp_print_new (device));
+  g_autoptr(FpPrint) out_print = NULL;
   FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
   FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device);
-  FpPrint *out_print = NULL;
   gboolean match;
 
   fake_dev->ret_result = FPI_MATCH_SUCCESS;
@@ -570,10 +570,10 @@ test_driver_verify_fail (void)
 {
   g_autoptr(GError) error = NULL;
   g_autoptr(FpAutoCloseDevice) device = auto_close_fake_device_new ();
-  g_autoptr(FpPrint) enrolled_print = fp_print_new (device);
+  g_autoptr(FpPrint) enrolled_print = g_object_ref_sink (fp_print_new (device));
+  g_autoptr(FpPrint) out_print = NULL;
   FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
   FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device);
-  FpPrint *out_print = NULL;
   gboolean match;
 
   fake_dev->ret_result = FPI_MATCH_FAIL;
@@ -591,10 +591,10 @@ test_driver_verify_error (void)
 {
   g_autoptr(GError) error = NULL;
   g_autoptr(FpAutoCloseDevice) device = auto_close_fake_device_new ();
-  g_autoptr(FpPrint) enrolled_print = fp_print_new (device);
+  g_autoptr(FpPrint) enrolled_print = g_object_ref_sink (fp_print_new (device));
+  g_autoptr(FpPrint) out_print = NULL;
   FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
   FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device);
-  FpPrint *out_print = NULL;
   gboolean match;
 
   fake_dev->ret_result = FPI_MATCH_ERROR;
@@ -641,16 +641,16 @@ test_driver_identify (void)
 {
   g_autoptr(GError) error = NULL;
   g_autoptr(FpPrint) print = NULL;
+  g_autoptr(FpPrint) matched_print = NULL;
   g_autoptr(FpAutoCloseDevice) device = auto_close_fake_device_new ();
   g_autoptr(GPtrArray) prints = g_ptr_array_new_with_free_func (g_object_unref);
   FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
   FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device);
-  FpPrint *matched_print;
   FpPrint *expected_matched;
   unsigned int i;
 
   for (i = 0; i < 500; ++i)
-    g_ptr_array_add (prints, fp_print_new (device));
+    g_ptr_array_add (prints, g_object_ref_sink (fp_print_new (device)));
 
   expected_matched = g_ptr_array_index (prints, g_random_int_range (0, 499));
   fp_print_set_description (expected_matched, "fake-verified");
@@ -673,15 +673,15 @@ test_driver_identify_fail (void)
 {
   g_autoptr(GError) error = NULL;
   g_autoptr(FpPrint) print = NULL;
+  g_autoptr(FpPrint) matched_print = NULL;
   g_autoptr(FpAutoCloseDevice) device = auto_close_fake_device_new ();
   g_autoptr(GPtrArray) prints = g_ptr_array_new_with_free_func (g_object_unref);
   FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
   FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device);
-  FpPrint *matched_print;
   unsigned int i;
 
   for (i = 0; i < 500; ++i)
-    g_ptr_array_add (prints, fp_print_new (device));
+    g_ptr_array_add (prints, g_object_ref_sink (fp_print_new (device)));
 
   g_assert_true (fp_device_supports_identify (device));
 
@@ -700,16 +700,16 @@ test_driver_identify_error (void)
 {
   g_autoptr(GError) error = NULL;
   g_autoptr(FpPrint) print = NULL;
+  g_autoptr(FpPrint) matched_print = NULL;
   g_autoptr(FpAutoCloseDevice) device = auto_close_fake_device_new ();
   g_autoptr(GPtrArray) prints = g_ptr_array_new_with_free_func (g_object_unref);
   FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
   FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device);
-  FpPrint *matched_print;
   FpPrint *expected_matched;
   unsigned int i;
 
   for (i = 0; i < 500; ++i)
-    g_ptr_array_add (prints, fp_print_new (device));
+    g_ptr_array_add (prints, g_object_ref_sink (fp_print_new (device)));
 
   expected_matched = g_ptr_array_index (prints, g_random_int_range (0, 499));
   fp_print_set_description (expected_matched, "fake-verified");
-- 
2.24.1