summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2023-04-13 23:41:07 +0200
committerMarco Trevisan (Treviño) <mail@3v1n0.net>2023-04-13 23:41:07 +0200
commit2e6864cbacb204239464c199eeced0e487471f0e (patch)
treeefe1c9bfb8cc88394a7e502a8e288672d5115b9d
parentd603f80cc2374204c5e7f4aed6e9db6fa5879f13 (diff)
downloadaccountsservice-2e6864cbacb204239464c199eeced0e487471f0e.tar.gz
act-user-manager: Disconnect from manager signals when freeing a request
Requests may be pending when we destroy them, in such case we should disconnect them from the manager "is-loaded" changes, so that we don't risk deferencing free'd requests when the manager is loaded again. Closes: #113
-rw-r--r--src/libaccountsservice/act-user-manager.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/libaccountsservice/act-user-manager.c b/src/libaccountsservice/act-user-manager.c
index 3bbd480..96ff723 100644
--- a/src/libaccountsservice/act-user-manager.c
+++ b/src/libaccountsservice/act-user-manager.c
@@ -153,6 +153,7 @@ typedef struct
};
char *object_path;
char *description;
+ gulong ready_id;
} ActUserManagerFetchUserRequest;
typedef struct
@@ -1782,6 +1783,7 @@ free_fetch_user_request (ActUserManagerFetchUserRequest *request)
g_cancellable_cancel (request->cancellable);
g_object_unref (request->cancellable);
+ g_clear_signal_handler (&request->ready_id, manager);
g_debug ("ActUserManager: unrefing manager owned by fetch user request");
g_object_unref (manager);
@@ -1824,7 +1826,7 @@ on_user_manager_maybe_ready_for_request (ActUserManager *manager
g_debug ("ActUserManager: user manager now loaded, proceeding with fetch user request for %s",
request->description);
- g_signal_handlers_disconnect_by_func (manager, on_user_manager_maybe_ready_for_request, request);
+ g_clear_signal_handler (&request->ready_id, manager);
request->state++;
fetch_user_incrementally (request);
@@ -1846,8 +1848,10 @@ fetch_user_incrementally (ActUserManagerFetchUserRequest *request)
} else {
g_debug ("ActUserManager: waiting for user manager to load before finding %s",
request->description);
- g_signal_connect (manager, "notify::is-loaded",
- G_CALLBACK (on_user_manager_maybe_ready_for_request), request);
+ g_assert (request->ready_id == 0);
+ request->ready_id =
+ g_signal_connect (manager, "notify::is-loaded",
+ G_CALLBACK (on_user_manager_maybe_ready_for_request), request);
}
break;