diff options
author | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2023-04-13 23:41:07 +0200 |
---|---|---|
committer | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2023-04-13 23:41:07 +0200 |
commit | 2e6864cbacb204239464c199eeced0e487471f0e (patch) | |
tree | efe1c9bfb8cc88394a7e502a8e288672d5115b9d | |
parent | d603f80cc2374204c5e7f4aed6e9db6fa5879f13 (diff) | |
download | accountsservice-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.c | 10 |
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; |