summaryrefslogtreecommitdiff
path: root/plugins/smartcard
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2016-04-18 17:18:02 +0200
committerBastien Nocera <hadess@hadess.net>2016-04-19 11:34:38 +0200
commit0e0ce100ac682b5096a29f89701da9944a80eaa4 (patch)
tree91bb1c01b1dfbb7714e6a20d2526b584790e77f8 /plugins/smartcard
parent2e2057671d591358df977e0a3bbc42b666873a01 (diff)
downloadgnome-settings-daemon-0e0ce100ac682b5096a29f89701da9944a80eaa4.tar.gz
smartcard: Fix crash on startup
A number of async helpers were using the gsd_smartcard_utils_finish_boolean_task() function, that would unref the GTask when the _finish() function was called. The idiomatic way (and the way the GTask examples show) to unref the GTask is after calling g_task_return_*(). The g_task_return_*() call will take care of holding a reference to the GTask until the _finish() call is made and done. https://bugzilla.gnome.org/show_bug.cgi?id=765203
Diffstat (limited to 'plugins/smartcard')
-rw-r--r--plugins/smartcard/gsd-smartcard-manager.c16
-rw-r--r--plugins/smartcard/gsd-smartcard-service.c6
-rw-r--r--plugins/smartcard/gsd-smartcard-utils.c16
-rw-r--r--plugins/smartcard/gsd-smartcard-utils.h4
4 files changed, 12 insertions, 30 deletions
diff --git a/plugins/smartcard/gsd-smartcard-manager.c b/plugins/smartcard/gsd-smartcard-manager.c
index fada4cc6..53009659 100644
--- a/plugins/smartcard/gsd-smartcard-manager.c
+++ b/plugins/smartcard/gsd-smartcard-manager.c
@@ -344,8 +344,6 @@ watch_smartcards_from_driver_async (GsdSmartcardManager *self,
G_UNLOCK (gsd_smartcards_watch_tasks);
g_task_run_in_thread (task, (GTaskThreadFunc) watch_smartcards_from_driver);
-
- g_object_unref (task);
}
static gboolean
@@ -353,7 +351,7 @@ register_driver_finish (GsdSmartcardManager *self,
GAsyncResult *result,
GError **error)
{
- return gsd_smartcard_utils_finish_boolean_task (G_OBJECT (self), result, error);
+ return g_task_propagate_boolean (G_TASK (result), error);
}
static void
@@ -365,10 +363,13 @@ on_driver_registered (GsdSmartcardManager *self,
if (!register_driver_finish (self, result, &error)) {
g_task_return_error (task, error);
+ g_object_unref (task);
return;
}
g_task_return_boolean (task, TRUE);
+
+ g_object_unref (task);
}
static void
@@ -487,7 +488,7 @@ activate_driver_async_finish (GsdSmartcardManager *self,
GAsyncResult *result,
GError **error)
{
- return gsd_smartcard_utils_finish_boolean_task (G_OBJECT (self), result, error);
+ return g_task_propagate_boolean (G_TASK (result), error);
}
static void
@@ -578,7 +579,7 @@ activate_all_drivers_async_finish (GsdSmartcardManager *self,
GAsyncResult *result,
GError **error)
{
- return gsd_smartcard_utils_finish_boolean_task (G_OBJECT (self), result, error);
+ return g_task_propagate_boolean (G_TASK (result), error);
}
static void
@@ -608,6 +609,7 @@ on_all_drivers_activated (GsdSmartcardManager *self,
}
g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
}
static void
@@ -647,8 +649,6 @@ watch_smartcards_async (GsdSmartcardManager *self,
task = g_task_new (self, cancellable, callback, user_data);
g_task_run_in_thread (task, (GTaskThreadFunc) watch_smartcards);
-
- g_object_unref (task);
}
static gboolean
@@ -656,7 +656,7 @@ watch_smartcards_async_finish (GsdSmartcardManager *self,
GAsyncResult *result,
GError **error)
{
- return gsd_smartcard_utils_finish_boolean_task (G_OBJECT (self), result, error);
+ return g_task_propagate_boolean (G_TASK (result), error);
}
static void
diff --git a/plugins/smartcard/gsd-smartcard-service.c b/plugins/smartcard/gsd-smartcard-service.c
index fc46d037..24982a27 100644
--- a/plugins/smartcard/gsd-smartcard-service.c
+++ b/plugins/smartcard/gsd-smartcard-service.c
@@ -587,6 +587,7 @@ on_main_thread_to_register_new_token (GTask *task)
G_UNLOCK (gsd_smartcard_tokens);
g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
return G_SOURCE_REMOVE;
}
@@ -637,7 +638,7 @@ register_new_token_in_main_thread_finish (GsdSmartcardService *self,
GAsyncResult *result,
GError **error)
{
- return gsd_smartcard_utils_finish_boolean_task (G_OBJECT (self), result, error);
+ return g_task_propagate_boolean (G_TASK (result), error);
}
static void
@@ -692,6 +693,7 @@ on_main_thread_to_synchronize_token (GTask *task)
synchronize_token_now (self, operation->card_slot);
g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
return G_SOURCE_REMOVE;
}
@@ -701,7 +703,7 @@ synchronize_token_in_main_thread_finish (GsdSmartcardService *self,
GAsyncResult *result,
GError **error)
{
- return gsd_smartcard_utils_finish_boolean_task (G_OBJECT (self), result, error);
+ return g_task_propagate_boolean (G_TASK (result), error);
}
static void
diff --git a/plugins/smartcard/gsd-smartcard-utils.c b/plugins/smartcard/gsd-smartcard-utils.c
index 096276e9..6b9461be 100644
--- a/plugins/smartcard/gsd-smartcard-utils.c
+++ b/plugins/smartcard/gsd-smartcard-utils.c
@@ -172,19 +172,3 @@ gsd_smartcard_utils_escape_object_path (const char *unescaped_string)
return object_path;
}
-
-gboolean
-gsd_smartcard_utils_finish_boolean_task (GObject *object,
- GAsyncResult *result,
- GError **error)
-{
- gboolean return_value;
-
- g_return_val_if_fail (g_task_is_valid (result, object), FALSE);
-
- return_value = g_task_propagate_boolean (G_TASK (result), error);
-
- g_object_unref (G_OBJECT (result));
-
- return return_value;
-}
diff --git a/plugins/smartcard/gsd-smartcard-utils.h b/plugins/smartcard/gsd-smartcard-utils.h
index 85590724..c7822bf3 100644
--- a/plugins/smartcard/gsd-smartcard-utils.h
+++ b/plugins/smartcard/gsd-smartcard-utils.h
@@ -28,10 +28,6 @@ void gsd_smartcard_utils_register_error_domain (GQuark e
GType error_enum);
char * gsd_smartcard_utils_escape_object_path (const char *unescaped_string);
-gboolean gsd_smartcard_utils_finish_boolean_task (GObject *object,
- GAsyncResult *result,
- GError **error);
-
G_END_DECLS
#endif /* __GSD_SMARTCARD_MANAGER_H */