[gnome-flashback] screensaver: keep auth object alive long enough
- From: Alberts MuktupÄvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-flashback] screensaver: keep auth object alive long enough
- Date: Thu, 23 Apr 2020 12:56:00 +0000 (UTC)
commit 236fffc5a0b4327d6d4cafc4046f2fee13fcbdcb
Author: Alberts MuktupÄvels <alberts muktupavels gmail com>
Date: Thu Apr 23 14:53:50 2020 +0300
screensaver: keep auth object alive long enough
Otherwise bad things can happen...
gnome-flashback/libscreensaver/gf-auth.c | 30 +++++++++++++++++------
gnome-flashback/libscreensaver/gf-auth.h | 2 ++
gnome-flashback/libscreensaver/gf-unlock-dialog.c | 8 +++++-
3 files changed, 31 insertions(+), 9 deletions(-)
---
diff --git a/gnome-flashback/libscreensaver/gf-auth.c b/gnome-flashback/libscreensaver/gf-auth.c
index 739eb69..97a6450 100644
--- a/gnome-flashback/libscreensaver/gf-auth.c
+++ b/gnome-flashback/libscreensaver/gf-auth.c
@@ -403,9 +403,6 @@ verify_done_cb (GObject *object,
self = GF_AUTH (user_data);
- if (!verified)
- g_clear_object (&self->task);
-
message = "";
if (error != NULL)
{
@@ -440,6 +437,16 @@ verify_done_cb (GObject *object,
g_clear_error (&error);
}
+static void
+task_finalized_cb (gpointer data,
+ GObject *where_the_object_was)
+{
+ GfAuth *self;
+
+ self = GF_AUTH (data);
+ self->task = NULL;
+}
+
static void
gf_auth_dispose (GObject *object)
{
@@ -458,13 +465,10 @@ gf_auth_dispose (GObject *object)
self->message_id = 0;
}
- if (self->awaits_response)
- g_cond_signal (&self->cond);
+ g_assert (!self->awaits_response);
g_mutex_unlock (&self->mutex);
- g_clear_object (&self->task);
-
G_OBJECT_CLASS (gf_auth_parent_class)->dispose (object);
}
@@ -630,7 +634,17 @@ gf_auth_verify (GfAuth *self)
return;
self->task = g_task_new (NULL, self->cancellable, verify_done_cb, self);
- g_task_set_task_data (self->task, self, NULL);
+ g_task_set_task_data (self->task, g_object_ref (self), g_object_unref);
+
+ g_object_weak_ref (G_OBJECT (self->task), task_finalized_cb, self);
g_task_run_in_thread (self->task, verify_in_thread_cb);
+ g_object_unref (self->task);
+}
+
+void
+gf_auth_cancel (GfAuth *self)
+{
+ g_cancellable_cancel (self->cancellable);
+ gf_auth_set_response (self, NULL);
}
diff --git a/gnome-flashback/libscreensaver/gf-auth.h b/gnome-flashback/libscreensaver/gf-auth.h
index 008db6a..176bedc 100644
--- a/gnome-flashback/libscreensaver/gf-auth.h
+++ b/gnome-flashback/libscreensaver/gf-auth.h
@@ -52,6 +52,8 @@ void gf_auth_set_response (GfAuth *self,
void gf_auth_verify (GfAuth *self);
+void gf_auth_cancel (GfAuth *self);
+
G_END_DECLS
#endif
diff --git a/gnome-flashback/libscreensaver/gf-unlock-dialog.c
b/gnome-flashback/libscreensaver/gf-unlock-dialog.c
index ed23c1e..5e07bbd 100644
--- a/gnome-flashback/libscreensaver/gf-unlock-dialog.c
+++ b/gnome-flashback/libscreensaver/gf-unlock-dialog.c
@@ -818,7 +818,13 @@ gf_unlock_dialog_dispose (GObject *object)
g_clear_object (&self->dm_seat);
g_clear_object (&self->login_seat);
- g_clear_object (&self->auth);
+ if (self->auth != NULL)
+ {
+ gf_auth_cancel (self->auth);
+
+ g_object_unref (self->auth);
+ self->auth = NULL;
+ }
G_OBJECT_CLASS (gf_unlock_dialog_parent_class)->dispose (object);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]