diff options
author | Miloslav Trmač <mitr@redhat.com> | 2017-02-08 22:26:37 +0100 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2018-04-03 13:13:32 -0400 |
commit | fd6b3a5db140749c3e5077fa8e266065002295b7 (patch) | |
tree | 9494a5acc4db80781286a1b4ab968ccfb7fbca73 /src/polkit | |
parent | 59d2fde33cf65e252f153545ee8a3083ee545948 (diff) | |
download | polkit-fd6b3a5db140749c3e5077fa8e266065002295b7.tar.gz |
Simplify GVariant reference counting
For (non-public-API) *_to_gvariant, explicitly document that they return
a floating value, and rely on it in callers to avoid a
variable/sink/unref combo.
This should not change behavior.
https://bugs.freedesktop.org/show_bug.cgi?id=99741
Signed-off-by: Miloslav Trmač <mitr@redhat.com>
Diffstat (limited to 'src/polkit')
-rw-r--r-- | src/polkit/polkitactiondescription.c | 26 | ||||
-rw-r--r-- | src/polkit/polkitauthority.c | 47 | ||||
-rw-r--r-- | src/polkit/polkitauthorizationresult.c | 18 | ||||
-rw-r--r-- | src/polkit/polkitdetails.c | 5 | ||||
-rw-r--r-- | src/polkit/polkitidentity.c | 5 | ||||
-rw-r--r-- | src/polkit/polkitsubject.c | 5 | ||||
-rw-r--r-- | src/polkit/polkittemporaryauthorization.c | 21 |
7 files changed, 39 insertions, 88 deletions
diff --git a/src/polkit/polkitactiondescription.c b/src/polkit/polkitactiondescription.c index 4bd9604..ed0655e 100644 --- a/src/polkit/polkitactiondescription.c +++ b/src/polkit/polkitactiondescription.c @@ -352,10 +352,10 @@ polkit_action_description_new_for_gvariant (GVariant *value) return action_description; } +/* Note that this returns a floating value. */ GVariant * polkit_action_description_to_gvariant (PolkitActionDescription *action_description) { - GVariant *value; GVariantBuilder builder; GHashTableIter iter; const gchar *a_key; @@ -368,17 +368,15 @@ polkit_action_description_to_gvariant (PolkitActionDescription *action_descripti g_variant_builder_add (&builder, "{ss}", a_key, a_value); /* TODO: note 'foo ? : ""' is a gcc specific extension (it's a short-hand for 'foo ? foo : ""') */ - value = g_variant_new ("(ssssssuuua{ss})", - action_description->action_id ? : "", - action_description->description ? : "", - action_description->message ? : "", - action_description->vendor_name ? : "", - action_description->vendor_url ? : "", - action_description->icon_name ? : "", - action_description->implicit_any, - action_description->implicit_inactive, - action_description->implicit_active, - &builder); - - return value; + return g_variant_new ("(ssssssuuua{ss})", + action_description->action_id ? : "", + action_description->description ? : "", + action_description->message ? : "", + action_description->vendor_name ? : "", + action_description->vendor_url ? : "", + action_description->icon_name ? : "", + action_description->implicit_any, + action_description->implicit_inactive, + action_description->implicit_active, + &builder); } diff --git a/src/polkit/polkitauthority.c b/src/polkit/polkitauthority.c index 7c4db7b..15a81ac 100644 --- a/src/polkit/polkitauthority.c +++ b/src/polkit/polkitauthority.c @@ -886,8 +886,6 @@ polkit_authority_check_authorization (PolkitAuthority *authority, GAsyncReadyCallback callback, gpointer user_data) { - GVariant *subject_value; - GVariant *details_value; CheckAuthData *data; g_return_if_fail (POLKIT_IS_AUTHORITY (authority)); @@ -896,11 +894,6 @@ polkit_authority_check_authorization (PolkitAuthority *authority, g_return_if_fail (details == NULL || POLKIT_IS_DETAILS (details)); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); - subject_value = polkit_subject_to_gvariant (subject); - details_value = polkit_details_to_gvariant (details); - g_variant_ref_sink (subject_value); - g_variant_ref_sink (details_value); - data = g_new0 (CheckAuthData, 1); data->authority = g_object_ref (authority); data->simple = g_simple_async_result_new (G_OBJECT (authority), @@ -915,9 +908,9 @@ polkit_authority_check_authorization (PolkitAuthority *authority, g_dbus_proxy_call (authority->proxy, "CheckAuthorization", g_variant_new ("(@(sa{sv})s@a{ss}us)", - subject_value, + polkit_subject_to_gvariant (subject), /* A floating value */ action_id, - details_value, + polkit_details_to_gvariant (details), /* A floating value */ flags, data->cancellation_id != NULL ? data->cancellation_id : ""), G_DBUS_CALL_FLAGS_NONE, @@ -925,8 +918,6 @@ polkit_authority_check_authorization (PolkitAuthority *authority, cancellable, (GAsyncReadyCallback) check_authorization_cb, data); - g_variant_unref (subject_value); - g_variant_unref (details_value); } /** @@ -1058,20 +1049,16 @@ polkit_authority_register_authentication_agent (PolkitAuthority *authority, GAsyncReadyCallback callback, gpointer user_data) { - GVariant *subject_value; - g_return_if_fail (POLKIT_IS_AUTHORITY (authority)); g_return_if_fail (POLKIT_IS_SUBJECT (subject)); g_return_if_fail (locale != NULL); g_return_if_fail (g_variant_is_object_path (object_path)); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); - subject_value = polkit_subject_to_gvariant (subject); - g_variant_ref_sink (subject_value); g_dbus_proxy_call (authority->proxy, "RegisterAuthenticationAgent", g_variant_new ("(@(sa{sv})ss)", - subject_value, + polkit_subject_to_gvariant (subject), /* A floating value */ locale, object_path), G_DBUS_CALL_FLAGS_NONE, @@ -1082,7 +1069,6 @@ polkit_authority_register_authentication_agent (PolkitAuthority *authority, callback, user_data, polkit_authority_register_authentication_agent)); - g_variant_unref (subject_value); } /** @@ -1375,19 +1361,15 @@ polkit_authority_unregister_authentication_agent (PolkitAuthority *authorit GAsyncReadyCallback callback, gpointer user_data) { - GVariant *subject_value; - g_return_if_fail (POLKIT_IS_AUTHORITY (authority)); g_return_if_fail (POLKIT_IS_SUBJECT (subject)); g_return_if_fail (g_variant_is_object_path (object_path)); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); - subject_value = polkit_subject_to_gvariant (subject); - g_variant_ref_sink (subject_value); g_dbus_proxy_call (authority->proxy, "UnregisterAuthenticationAgent", g_variant_new ("(@(sa{sv})s)", - subject_value, + polkit_subject_to_gvariant (subject), /* A floating value */ object_path), G_DBUS_CALL_FLAGS_NONE, -1, @@ -1397,7 +1379,6 @@ polkit_authority_unregister_authentication_agent (PolkitAuthority *authorit callback, user_data, polkit_authority_unregister_authentication_agent)); - g_variant_unref (subject_value); } /** @@ -1511,7 +1492,6 @@ polkit_authority_authentication_agent_response (PolkitAuthority *authority, GAsyncReadyCallback callback, gpointer user_data) { - GVariant *identity_value; /* Note that in reality, this API is only accessible to root, and * only called from the setuid helper `polkit-agent-helper-1`. * @@ -1526,14 +1506,12 @@ polkit_authority_authentication_agent_response (PolkitAuthority *authority, g_return_if_fail (POLKIT_IS_IDENTITY (identity)); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); - identity_value = polkit_identity_to_gvariant (identity); - g_variant_ref_sink (identity_value); g_dbus_proxy_call (authority->proxy, "AuthenticationAgentResponse2", g_variant_new ("(us@(sa{sv}))", (guint32)uid, cookie, - identity_value), + polkit_identity_to_gvariant (identity)), /* A floating value */ G_DBUS_CALL_FLAGS_NONE, -1, cancellable, @@ -1542,7 +1520,6 @@ polkit_authority_authentication_agent_response (PolkitAuthority *authority, callback, user_data, polkit_authority_authentication_agent_response)); - g_variant_unref (identity_value); } /** @@ -1653,18 +1630,14 @@ polkit_authority_enumerate_temporary_authorizations (PolkitAuthority *author GAsyncReadyCallback callback, gpointer user_data) { - GVariant *subject_value; - g_return_if_fail (POLKIT_IS_AUTHORITY (authority)); g_return_if_fail (POLKIT_IS_SUBJECT (subject)); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); - subject_value = polkit_subject_to_gvariant (subject); - g_variant_ref_sink (subject_value); g_dbus_proxy_call (authority->proxy, "EnumerateTemporaryAuthorizations", g_variant_new ("(@(sa{sv}))", - subject_value), + polkit_subject_to_gvariant (subject)), /* A floating value */ G_DBUS_CALL_FLAGS_NONE, -1, cancellable, @@ -1673,7 +1646,6 @@ polkit_authority_enumerate_temporary_authorizations (PolkitAuthority *author callback, user_data, polkit_authority_enumerate_temporary_authorizations)); - g_variant_unref (subject_value); } /** @@ -1805,18 +1777,14 @@ polkit_authority_revoke_temporary_authorizations (PolkitAuthority *authority GAsyncReadyCallback callback, gpointer user_data) { - GVariant *subject_value; - g_return_if_fail (POLKIT_IS_AUTHORITY (authority)); g_return_if_fail (POLKIT_IS_SUBJECT (subject)); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); - subject_value = polkit_subject_to_gvariant (subject); - g_variant_ref_sink (subject_value); g_dbus_proxy_call (authority->proxy, "RevokeTemporaryAuthorizations", g_variant_new ("(@(sa{sv}))", - subject_value), + polkit_subject_to_gvariant (subject)), /* A floating value */ G_DBUS_CALL_FLAGS_NONE, -1, cancellable, @@ -1825,7 +1793,6 @@ polkit_authority_revoke_temporary_authorizations (PolkitAuthority *authority callback, user_data, polkit_authority_revoke_temporary_authorizations)); - g_variant_unref (subject_value); } /** diff --git a/src/polkit/polkitauthorizationresult.c b/src/polkit/polkitauthorizationresult.c index dd3d761..877a9a6 100644 --- a/src/polkit/polkitauthorizationresult.c +++ b/src/polkit/polkitauthorizationresult.c @@ -290,19 +290,15 @@ polkit_authorization_result_new_for_gvariant (GVariant *value) return ret; } +/* Note that this returns a floating value. */ GVariant * polkit_authorization_result_to_gvariant (PolkitAuthorizationResult *authorization_result) { - GVariant *ret; - GVariant *details_gvariant; - - details_gvariant = polkit_details_to_gvariant (polkit_authorization_result_get_details (authorization_result)); - g_variant_ref_sink (details_gvariant); - ret = g_variant_new ("(bb@a{ss})", - polkit_authorization_result_get_is_authorized (authorization_result), - polkit_authorization_result_get_is_challenge (authorization_result), - details_gvariant); - g_variant_unref (details_gvariant); + PolkitDetails *details; - return ret; + details = polkit_authorization_result_get_details (authorization_result); + return g_variant_new ("(bb@a{ss})", + polkit_authorization_result_get_is_authorized (authorization_result), + polkit_authorization_result_get_is_challenge (authorization_result), + polkit_details_to_gvariant (details)); /* A floating value */ } diff --git a/src/polkit/polkitdetails.c b/src/polkit/polkitdetails.c index 07a6f63..b16aadc 100644 --- a/src/polkit/polkitdetails.c +++ b/src/polkit/polkitdetails.c @@ -195,10 +195,10 @@ polkit_details_get_keys (PolkitDetails *details) return ret; } +/* Note that this returns a floating value. */ GVariant * polkit_details_to_gvariant (PolkitDetails *details) { - GVariant *ret; GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{ss}")); @@ -212,8 +212,7 @@ polkit_details_to_gvariant (PolkitDetails *details) while (g_hash_table_iter_next (&hash_iter, (gpointer) &key, (gpointer) &value)) g_variant_builder_add (&builder, "{ss}", key, value); } - ret = g_variant_builder_end (&builder); - return ret; + return g_variant_builder_end (&builder); } PolkitDetails * diff --git a/src/polkit/polkitidentity.c b/src/polkit/polkitidentity.c index 7813c2c..b0b46bf 100644 --- a/src/polkit/polkitidentity.c +++ b/src/polkit/polkitidentity.c @@ -198,12 +198,12 @@ polkit_identity_from_string (const gchar *str, return identity; } +/* Note that this returns a floating value. */ GVariant * polkit_identity_to_gvariant (PolkitIdentity *identity) { GVariantBuilder builder; GVariant *dict; - GVariant *ret; const gchar *kind; kind = ""; @@ -233,8 +233,7 @@ polkit_identity_to_gvariant (PolkitIdentity *identity) } dict = g_variant_builder_end (&builder); - ret = g_variant_new ("(s@a{sv})", kind, dict); - return ret; + return g_variant_new ("(s@a{sv})", kind, dict); } static GVariant * diff --git a/src/polkit/polkitsubject.c b/src/polkit/polkitsubject.c index df8e1aa..4a36941 100644 --- a/src/polkit/polkitsubject.c +++ b/src/polkit/polkitsubject.c @@ -290,12 +290,12 @@ polkit_subject_from_string (const gchar *str, return subject; } +/* Note that this returns a floating value. */ GVariant * polkit_subject_to_gvariant (PolkitSubject *subject) { GVariantBuilder builder; GVariant *dict; - GVariant *ret; const gchar *kind; kind = ""; @@ -329,8 +329,7 @@ polkit_subject_to_gvariant (PolkitSubject *subject) } dict = g_variant_builder_end (&builder); - ret = g_variant_new ("(s@a{sv})", kind, dict); - return ret; + return g_variant_new ("(s@a{sv})", kind, dict); } static GVariant * diff --git a/src/polkit/polkittemporaryauthorization.c b/src/polkit/polkittemporaryauthorization.c index b2c6003..5e07678 100644 --- a/src/polkit/polkittemporaryauthorization.c +++ b/src/polkit/polkittemporaryauthorization.c @@ -212,22 +212,15 @@ polkit_temporary_authorization_new_for_gvariant (GVariant *value, return authorization; } +/* Note that this returns a floating value. */ GVariant * polkit_temporary_authorization_to_gvariant (PolkitTemporaryAuthorization *authorization) { - GVariant *ret; - GVariant *subject_gvariant; - - subject_gvariant = polkit_subject_to_gvariant (authorization->subject); - g_variant_ref_sink (subject_gvariant); - ret = g_variant_new ("(ss@(sa{sv})tt)", - authorization->id, - authorization->action_id, - subject_gvariant, - authorization->time_obtained, - authorization->time_expires); - g_variant_unref (subject_gvariant); - - return ret; + return g_variant_new ("(ss@(sa{sv})tt)", + authorization->id, + authorization->action_id, + polkit_subject_to_gvariant (authorization->subject), /* A floating value */ + authorization->time_obtained, + authorization->time_expires); } |