PolicyKit: Branch 'gvariant-audit' - 12 commits

Miloslav Trmac mitr at kemper.freedesktop.org
Wed Jun 21 20:29:03 UTC 2017


Rebased ref, commits from common ancestor:
commit bc3832b9de44a4a7e64411b35c53c19472135dcd
Author: Miloslav Trmač <mitr at redhat.com>
Date:   Thu Feb 9 19:58:12 2017 +0100

    Fix a memory leak on agent authentication cancellation
    
    (This is cancellation by the daemon, possibly requested by the client, not by the agent.)
    
    https://bugs.freedesktop.org/show_bug.cgi?id=99741
    
    Signed-off-by: Miloslav Trmač <mitr at redhat.com>

diff --git a/src/polkitbackend/polkitbackendinteractiveauthority.c b/src/polkitbackend/polkitbackendinteractiveauthority.c
index b8096b3..e595bd5 100644
--- a/src/polkitbackend/polkitbackendinteractiveauthority.c
+++ b/src/polkitbackend/polkitbackendinteractiveauthority.c
@@ -2437,13 +2437,18 @@ authentication_agent_cancel_cb (GDBusProxy   *proxy,
                                 GAsyncResult *res,
                                 gpointer      user_data)
 {
+  GVariant *result;
   GError *error;
+
   error = NULL;
-  if (!g_dbus_proxy_call_finish (proxy, res, &error))
+  result = g_dbus_proxy_call_finish (proxy, res, &error);
+  if (result == NULL)
     {
       g_printerr ("Error cancelling authentication: %s\n", error->message);
       g_error_free (error);
     }
+  else
+    g_variant_unref (result);
 }
 
 static void
commit ec86d73c1dbbe1e0413ae172ad4fa49a4cbd2dce
Author: Miloslav Trmač <mitr at redhat.com>
Date:   Thu Feb 9 19:53:54 2017 +0100

    Fix a memory leak per agent authentication
    
    https://bugs.freedesktop.org/show_bug.cgi?id=99741
    
    Signed-off-by: Miloslav Trmač <mitr at redhat.com>

diff --git a/src/polkitbackend/polkitbackendinteractiveauthority.c b/src/polkitbackend/polkitbackendinteractiveauthority.c
index bf0ee48..b8096b3 100644
--- a/src/polkitbackend/polkitbackendinteractiveauthority.c
+++ b/src/polkitbackend/polkitbackendinteractiveauthority.c
@@ -1906,15 +1906,15 @@ authentication_agent_begin_cb (GDBusProxy   *proxy,
   AuthenticationSession *session = user_data;
   gboolean gained_authorization;
   gboolean was_dismissed;
+  GVariant *result;
   GError *error;
 
   was_dismissed = FALSE;
   gained_authorization = FALSE;
 
   error = NULL;
-  if (!g_dbus_proxy_call_finish (proxy,
-                                 res,
-                                 &error))
+  result = g_dbus_proxy_call_finish (proxy, res, &error);
+  if (result == NULL)
     {
       g_printerr ("Error performing authentication: %s (%s %d)\n",
                   error->message,
@@ -1926,6 +1926,7 @@ authentication_agent_begin_cb (GDBusProxy   *proxy,
     }
   else
     {
+      g_variant_unref (result);
       gained_authorization = session->is_authenticated;
       g_debug ("Authentication complete, is_authenticated = %d", session->is_authenticated);
     }
commit dc09ea5b5fdf764adcdd2986a3ea36be6316eabc
Author: Miloslav Trmač <mitr at redhat.com>
Date:   Thu Feb 9 19:38:17 2017 +0100

    Fix error handling in polkit_authority_enumerate_temporary_authorizations_finish
    
    Fix memory leaks, and don't return a pointer to freed memory.
    
    https://bugs.freedesktop.org/show_bug.cgi?id=99741
    
    Signed-off-by: Miloslav Trmač <mitr at redhat.com>

diff --git a/src/polkit/polkitauthority.c b/src/polkit/polkitauthority.c
index b783c0e..404954f 100644
--- a/src/polkit/polkitauthority.c
+++ b/src/polkit/polkitauthority.c
@@ -1698,11 +1698,13 @@ polkit_authority_enumerate_temporary_authorizations_finish (PolkitAuthority *aut
           g_prefix_error (error, "Error serializing return value of EnumerateTemporaryAuthorizations: ");
           g_list_foreach (ret, (GFunc) g_object_unref, NULL);
           g_list_free (ret);
-          goto out;
+          ret = NULL;
+          goto out_array;
         }
       ret = g_list_prepend (ret, auth);
     }
   ret = g_list_reverse (ret);
+ out_array:
   g_variant_unref (array);
   g_variant_unref (value);
 
commit fdc8c54ca53bbded93d1ec19cacd4dd3028b1ac3
Author: Miloslav Trmač <mitr at redhat.com>
Date:   Wed Feb 8 23:03:06 2017 +0100

    Fix memory leaks in server_handle_*_temporary_authorizations
    
    https://bugs.freedesktop.org/show_bug.cgi?id=99741
    
    Signed-off-by: Miloslav Trmač <mitr at redhat.com>

diff --git a/src/polkitbackend/polkitbackendauthority.c b/src/polkitbackend/polkitbackendauthority.c
index cad3f74..148e152 100644
--- a/src/polkitbackend/polkitbackendauthority.c
+++ b/src/polkitbackend/polkitbackendauthority.c
@@ -1165,6 +1165,7 @@ server_handle_enumerate_temporary_authorizations (Server                 *server
   g_dbus_method_invocation_return_value (invocation, g_variant_new ("(a(ss(sa{sv})tt))", &builder));
 
  out:
+  g_variant_unref (subject_gvariant);
   if (subject != NULL)
     g_object_unref (subject);
 }
@@ -1211,6 +1212,7 @@ server_handle_revoke_temporary_authorizations (Server                 *server,
   g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
 
  out:
+  g_variant_unref (subject_gvariant);
   if (subject != NULL)
     g_object_unref (subject);
 }
commit ae1adecfd788aea35540fc49244b75bbb4740c5d
Author: Miloslav Trmač <mitr at redhat.com>
Date:   Wed Feb 8 22:57:21 2017 +0100

    Fix a memory leak in server_handle_authentication_agent_response{,2}
    
    https://bugs.freedesktop.org/show_bug.cgi?id=99741
    
    Signed-off-by: Miloslav Trmač <mitr at redhat.com>

diff --git a/src/polkitbackend/polkitbackendauthority.c b/src/polkitbackend/polkitbackendauthority.c
index 2bcad62..cad3f74 100644
--- a/src/polkitbackend/polkitbackendauthority.c
+++ b/src/polkitbackend/polkitbackendauthority.c
@@ -1054,6 +1054,7 @@ server_handle_authentication_agent_response (Server                 *server,
   g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
 
  out:
+  g_variant_unref (identity_gvariant);
   if (identity != NULL)
     g_object_unref (identity);
 }
@@ -1104,6 +1105,7 @@ server_handle_authentication_agent_response2 (Server                 *server,
   g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
 
  out:
+  g_variant_unref (identity_gvariant);
   if (identity != NULL)
     g_object_unref (identity);
 }
commit bce6ed9b6dea624e39151a7e9622068e8276ffc0
Author: Miloslav Trmač <mitr at redhat.com>
Date:   Wed Feb 8 22:55:10 2017 +0100

    Fix a memory leak in server_handle_unregister_authentication_agent
    
    https://bugs.freedesktop.org/show_bug.cgi?id=99741
    
    Signed-off-by: Miloslav Trmač <mitr at redhat.com>

diff --git a/src/polkitbackend/polkitbackendauthority.c b/src/polkitbackend/polkitbackendauthority.c
index 7e08e57..2bcad62 100644
--- a/src/polkitbackend/polkitbackendauthority.c
+++ b/src/polkitbackend/polkitbackendauthority.c
@@ -1003,6 +1003,7 @@ server_handle_unregister_authentication_agent (Server                 *server,
   g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
 
  out:
+  g_variant_unref (subject_gvariant);
   if (subject != NULL)
     g_object_unref (subject);
 }
commit 94aa3fc7cc0ae5a943b886a7787fa076454a0f1b
Author: Miloslav Trmač <mitr at redhat.com>
Date:   Wed Feb 8 22:53:58 2017 +0100

    Fix a memory leak in server_handle_register_authentication_agent_with_options
    
    https://bugs.freedesktop.org/show_bug.cgi?id=99741
    
    Signed-off-by: Miloslav Trmač <mitr at redhat.com>

diff --git a/src/polkitbackend/polkitbackendauthority.c b/src/polkitbackend/polkitbackendauthority.c
index 86dad02..7e08e57 100644
--- a/src/polkitbackend/polkitbackendauthority.c
+++ b/src/polkitbackend/polkitbackendauthority.c
@@ -951,6 +951,7 @@ server_handle_register_authentication_agent_with_options (Server
   g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
 
  out:
+  g_variant_unref (subject_gvariant);
   if (options != NULL)
       g_variant_unref (options);
   if (subject != NULL)
commit 184a79cba7f460575289eaa94484faa88cb7be0c
Author: Miloslav Trmač <mitr at redhat.com>
Date:   Wed Feb 8 22:27:11 2017 +0100

    Fix a memory leak on an error path of lookup_asv (twice)
    
    https://bugs.freedesktop.org/show_bug.cgi?id=99741
    
    Signed-off-by: Miloslav Trmač <mitr at redhat.com>

diff --git a/src/polkit/polkitidentity.c b/src/polkit/polkitidentity.c
index b0b46bf..3aa1f7f 100644
--- a/src/polkit/polkitidentity.c
+++ b/src/polkit/polkitidentity.c
@@ -266,6 +266,7 @@ lookup_asv (GVariant            *dict,
                            g_variant_get_type_string (value),
                            type_string);
               g_free (type_string);
+              g_variant_unref (value);
               goto out;
             }
           ret = value;
diff --git a/src/polkit/polkitsubject.c b/src/polkit/polkitsubject.c
index 4a36941..d4c1182 100644
--- a/src/polkit/polkitsubject.c
+++ b/src/polkit/polkitsubject.c
@@ -362,6 +362,7 @@ lookup_asv (GVariant            *dict,
                            g_variant_get_type_string (value),
                            type_string);
               g_free (type_string);
+              g_variant_unref (value);
               goto out;
             }
           ret = value;
commit 4b3afca2bfecd220beec5e9cae152cf90b290dae
Author: Miloslav Trmač <mitr at redhat.com>
Date:   Wed Feb 8 22:26:37 2017 +0100

    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 at redhat.com>

diff --git a/src/polkit/polkitactiondescription.c b/src/polkit/polkitactiondescription.c
index 4bd9604..9c820e7 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..b783c0e 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 at 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..95855d4 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 at 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 at 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 at a{sv})", kind, dict);
-  return ret;
+  return g_variant_new ("(s at 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 at a{sv})", kind, dict);
-  return ret;
+  return g_variant_new ("(s at a{sv})", kind, dict);
 }
 
 static GVariant *
diff --git a/src/polkit/polkittemporaryauthorization.c b/src/polkit/polkittemporaryauthorization.c
index b2c6003..ae71259 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);
 }
 
diff --git a/src/polkitbackend/polkitbackendauthority.c b/src/polkitbackend/polkitbackendauthority.c
index 64560e1..86dad02 100644
--- a/src/polkitbackend/polkitbackendauthority.c
+++ b/src/polkitbackend/polkitbackendauthority.c
@@ -645,11 +645,8 @@ server_handle_enumerate_actions (Server                 *server,
   for (l = actions; l != NULL; l = l->next)
     {
       PolkitActionDescription *ad = POLKIT_ACTION_DESCRIPTION (l->data);
-      GVariant *value;
-      value = polkit_action_description_to_gvariant (ad);
-      g_variant_ref_sink (value);
-      g_variant_builder_add_value (&builder, value);
-      g_variant_unref (value);
+      g_variant_builder_add_value (&builder,
+				   polkit_action_description_to_gvariant (ad)); /* A floating value */
     }
   g_dbus_method_invocation_return_value (invocation, g_variant_new ("(a(ssssssuuua{ss}))", &builder));
 
@@ -709,11 +706,9 @@ check_auth_cb (GObject      *source_object,
     }
   else
     {
-      GVariant *value;
-      value = polkit_authorization_result_to_gvariant (result);
-      g_variant_ref_sink (value);
-      g_dbus_method_invocation_return_value (data->invocation, g_variant_new ("(@(bba{ss}))", value));
-      g_variant_unref (value);
+      g_dbus_method_invocation_return_value (data->invocation,
+					     g_variant_new ("(@(bba{ss}))",
+							    polkit_authorization_result_to_gvariant (result))); /* A floating value */
       g_object_unref (result);
     }
 
@@ -1158,11 +1153,8 @@ server_handle_enumerate_temporary_authorizations (Server                 *server
   for (l = authorizations; l != NULL; l = l->next)
     {
       PolkitTemporaryAuthorization *a = POLKIT_TEMPORARY_AUTHORIZATION (l->data);
-      GVariant *value;
-      value = polkit_temporary_authorization_to_gvariant (a);
-      g_variant_ref_sink (value);
-      g_variant_builder_add_value (&builder, value);
-      g_variant_unref (value);
+      g_variant_builder_add_value (&builder,
+				   polkit_temporary_authorization_to_gvariant (a)); /* A floating value */
     }
   g_list_foreach (authorizations, (GFunc) g_object_unref, NULL);
   g_list_free (authorizations);
diff --git a/src/polkitbackend/polkitbackendinteractiveauthority.c b/src/polkitbackend/polkitbackendinteractiveauthority.c
index ccfd608..bf0ee48 100644
--- a/src/polkitbackend/polkitbackendinteractiveauthority.c
+++ b/src/polkitbackend/polkitbackendinteractiveauthority.c
@@ -2299,7 +2299,6 @@ authentication_agent_initiate_challenge (AuthenticationAgent         *agent,
   gchar *localized_message;
   gchar *localized_icon_name;
   PolkitDetails *localized_details;
-  GVariant *details_gvariant;
   GList *user_identities = NULL;
   GVariantBuilder identities_builder;
   GVariant *parameters;
@@ -2397,28 +2396,21 @@ authentication_agent_initiate_challenge (AuthenticationAgent         *agent,
   add_pid (localized_details, caller, "polkit.caller-pid");
   add_pid (localized_details, subject, "polkit.subject-pid");
 
-  details_gvariant = polkit_details_to_gvariant (localized_details);
-  g_variant_ref_sink (details_gvariant);
-
   g_variant_builder_init (&identities_builder, G_VARIANT_TYPE ("a(sa{sv})"));
   for (l = user_identities; l != NULL; l = l->next)
     {
       PolkitIdentity *identity = POLKIT_IDENTITY (l->data);
-      GVariant *value;
-      value = polkit_identity_to_gvariant (identity);
-      g_variant_ref_sink (value);
-      g_variant_builder_add_value (&identities_builder, value);
-      g_variant_unref (value);
+      g_variant_builder_add_value (&identities_builder,
+				   polkit_identity_to_gvariant (identity)); /* A floating value */
     }
 
   parameters = g_variant_new ("(sss at a{ss}sa(sa{sv}))",
                               action_id,
                               localized_message,
                               localized_icon_name,
-                              details_gvariant,
+			      polkit_details_to_gvariant (localized_details), /* A floating value */
                               session->cookie,
                               &identities_builder);
-  g_variant_unref (details_gvariant);
 
   g_dbus_proxy_call (agent->proxy,
                      "BeginAuthentication",
commit 766a2eab6bfedc9df00b0509bc34ccdee9fe0a76
Author: muzena <trebelnik2 at gmail.com>
Date:   Sun Apr 23 21:40:48 2017 +0200

    Add hr.po
    
    https://bugs.freedesktop.org/show_bug.cgi?id=100764

diff --git a/po/LINGUAS b/po/LINGUAS
index f6a4926..44ca744 100644
--- a/po/LINGUAS
+++ b/po/LINGUAS
@@ -3,6 +3,7 @@
 cs
 da
 de
+hr
 hu
 id
 pl
diff --git a/po/hr.po b/po/hr.po
new file mode 100644
index 0000000..6aa23d0
--- /dev/null
+++ b/po/hr.po
@@ -0,0 +1,204 @@
+# Croatian translation for polkit.
+# Copyright (C) 2017 polkit's COPYRIGHT HOLDER
+# This file is distributed under the same license as the polkit package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: polkit master\n"
+"Report-Msgid-Bugs-To: https://bugs.freedesktop.org/enter_bug.cgi?"
+"product=PolicyKit&keywords=I18N+L10N&component=libpolkit\n"
+"POT-Creation-Date: 2017-04-23 15:27+0000\n"
+"PO-Revision-Date: 2017-04-23 19:27+0200\n"
+"Language-Team: Croatian <hr at li.org>\n"
+"Language: hr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Last-Translator: gogo <trebelnik2 at gmail.com>\n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#: ../actions/org.freedesktop.policykit.policy.in.h:1
+msgid "Run a program as another user"
+msgstr "Pokreni programe kao drugi korisnik"
+
+#: ../actions/org.freedesktop.policykit.policy.in.h:2
+msgid "Authentication is required to run a program as another user"
+msgstr "Potrebna je ovjera za pokretanje programa kao drugog korisnika"
+
+#: ../src/examples/org.freedesktop.policykit.examples.pkexec.policy.in.h:1
+msgid "Run the polkit example program Frobnicate"
+msgstr "Pokreni primjer PolicyKit programa Frobnicate"
+
+#: ../src/examples/org.freedesktop.policykit.examples.pkexec.policy.in.h:2
+msgid ""
+"Authentication is required to run the polkit example program Frobnicate "
+"(user=$(user), user.gecos=$(user.gecos), user.display=$(user.display), "
+"program=$(program), command_line=$(command_line))"
+msgstr ""
+"Potrebna je ovjera za pokretanje PolicyKit programa Frobnicate (user="
+"$(korisnik), program=$(program), command_line=$(naredbeni_redak))"
+
+#: ../src/programs/pkaction.c:101
+msgid "Only output information about ACTION"
+msgstr "Samo izlazne informacije o RADNJAMA"
+
+#: ../src/programs/pkaction.c:101
+msgid "ACTION"
+msgstr "RADNJA"
+
+#: ../src/programs/pkaction.c:105
+msgid "Output detailed action information"
+msgstr "Opširnije izlazne informacije radnje"
+
+#: ../src/programs/pkaction.c:109 ../src/programs/pkttyagent.c:62
+msgid "Show version"
+msgstr "Prikaži inačicu"
+
+#: ../src/programs/pkaction.c:134
+msgid "[--action-id ACTION]"
+msgstr "[--action-id RADNJA]"
+
+#: ../src/programs/pkaction.c:135 ../src/programs/pkttyagent.c:85
+#, c-format
+msgid ""
+"Report bugs to: %s\n"
+"%s home page: <%s>"
+msgstr ""
+"Prijavite greške na: %s\n"
+"%s početna stranica: <%s>"
+
+#: ../src/programs/pkaction.c:149 ../src/programs/pkcheck.c:495
+#: ../src/programs/pkttyagent.c:99
+#, c-format
+msgid "%s: Unexpected argument `%s'\n"
+msgstr "%s: Neočekivani argument '%s'\n"
+
+#: ../src/programs/pkcheck.c:36
+#, c-format
+msgid ""
+"Usage:\n"
+"  pkcheck [OPTION...]\n"
+"\n"
+"Help Options:\n"
+"  -h, --help                         Show help options\n"
+"\n"
+"Application Options:\n"
+"  -a, --action-id=ACTION             Check authorization to perform ACTION\n"
+"  -u, --allow-user-interaction       Interact with the user if necessary\n"
+"  -d, --details=KEY VALUE            Add (KEY, VALUE) to information about "
+"the action\n"
+"  --enable-internal-agent            Use an internal authentication agent if "
+"necessary\n"
+"  --list-temp                        List temporary authorizations for "
+"current session\n"
+"  -p, --process=PID[,START_TIME,UID] Check authorization of specified "
+"process\n"
+"  --revoke-temp                      Revoke all temporary authorizations for "
+"current session\n"
+"  -s, --system-bus-name=BUS_NAME     Check authorization of owner of "
+"BUS_NAME\n"
+"  --version                          Show version\n"
+"\n"
+"Report bugs to: %s\n"
+"%s home page: <%s>\n"
+msgstr ""
+"Upotreba:\n"
+"  pkcheck [MOGUĆNOST...]\n"
+"\n"
+"Mogućnosti pomoći:\n"
+"  -h, --help                         Prikaži mogućnosti pomoći\n"
+"\n"
+"Mogućnosti aplikacije:\n"
+"  -a, --action-id=RADNJA             Provjeri ovjeru za pokretanje RADNJE\n"
+"  -u, --allow-user-interaction       Djeluj s korisnikom ako je  potrebno\n"
+"  -d, --details=KLJUČ VRIJEDNOST            Dodaj (KLJUČ, VRIJEDNOST) u "
+"informaciju o radnji\n"
+"  --enable-internal-agent            Koristi unutrašnjeg agenta ovjere ako "
+"je potrebno\n"
+"  --list-temp                        Prikaži privremena ovlaštenja za "
+"trenutnu sesiju\n"
+"  -p, --process=PID[,POČETNO_VRIJEME,UID] Provjeri ovlaštenja za određeni "
+"proces\n"
+"  --revoke-temp                      Opozovi sva privremena ovlaštenja za "
+"trenutnu sesiju\n"
+"  -s, --system-bus-name=BUS_NAZIV     Provjeri ovlaštenja vlasnika od "
+"BUS_NAZIVA\n"
+"  --version                          Prikaži inačicu\n"
+"\n"
+"Prijavi greške na: %s\n"
+"%s početna stranica: <%s>\n"
+
+#: ../src/programs/pkcheck.c:395 ../src/programs/pkcheck.c:428
+#: ../src/programs/pkcheck.c:440
+#, c-format
+msgid "%s: Argument expected after `%s'\n"
+msgstr "%s: Očekivani argument nakon `%s'\n"
+
+#: ../src/programs/pkcheck.c:418
+#, c-format
+msgid "%s: Invalid --process value `%s'\n"
+msgstr "%s: Neispravna --process vrijednost `%s'\n"
+
+#: ../src/programs/pkcheck.c:455 ../src/programs/pkcheck.c:464
+#, c-format
+msgid "%s: Two arguments expected after `--detail'\n"
+msgstr "%s: Dva argumenta su očekivana nakon `--detail'\n"
+
+#: ../src/programs/pkcheck.c:525
+#, c-format
+msgid "%s: Subject not specified\n"
+msgstr "%s: Subjekt nije određen\n"
+
+#. Translators: message shown when trying to run a program as root. Do not
+#. * translate the $(program) fragment - it will be expanded to the path
+#. * of the program e.g.  /bin/bash.
+#.
+#: ../src/programs/pkexec.c:797
+msgid "Authentication is needed to run `$(program)' as the super user"
+msgstr "Potrebna je ovjera za pokretanje `$(program)' kao super korisnika"
+
+#. Translators: message shown when trying to run a program as another user.
+#. * Do not translate the $(program) or $(user) fragments - the former will
+#. * be expanded to the path of the program e.g. "/bin/bash" and the latter
+#. * to the user e.g. "John Doe (johndoe)" or "johndoe".
+#.
+#: ../src/programs/pkexec.c:807
+msgid "Authentication is needed to run `$(program)' as user $(user.display)"
+msgstr ""
+"Potrebna je ovjera za pokretanje `$(program)' kao korisnika $(user.display)"
+
+#: ../src/programs/pkttyagent.c:45
+msgid "Don't replace existing agent if any"
+msgstr "Ne zamjenjuj postojećeg agenta ako postoji"
+
+#: ../src/programs/pkttyagent.c:49
+msgid "Close FD when the agent is registered"
+msgstr "Zatvori FD kada je agent registriran"
+
+#: ../src/programs/pkttyagent.c:49
+msgid "FD"
+msgstr "FD"
+
+#: ../src/programs/pkttyagent.c:53
+msgid "Register the agent for the specified process"
+msgstr "Registriraj agenta za određeni proces"
+
+#: ../src/programs/pkttyagent.c:54
+msgid "PID[,START_TIME]"
+msgstr "PID[,POČETNO_VRIJEME]"
+
+#: ../src/programs/pkttyagent.c:58
+msgid "Register the agent owner of BUS_NAME"
+msgstr "Registriraj vlasnika agenta BUS_NAZIVA"
+
+#: ../src/programs/pkttyagent.c:58
+msgid "BUS_NAME"
+msgstr "BUS_NAZIV"
+
+#: ../src/programs/pkttyagent.c:131
+#, c-format
+msgid "%s: Invalid process specifier `%s'\n"
+msgstr "%s: Neispravan razvrstač procesa `%s'\n"
commit df6488c0a5b2a6c7a2d4f6a55008263635c5571b
Author: Rui Matos <tiagomatos at gmail.com>
Date:   Thu Mar 2 14:50:31 2017 +0100

    polkitpermission: Fix a memory leak on authority changes
    
    Signed-off-by: Rui Matos <tiagomatos at gmail.com>
    
    https://bugs.freedesktop.org/show_bug.cgi?id=99741

diff --git a/src/polkit/polkitpermission.c b/src/polkit/polkitpermission.c
index f8a666e..f264094 100644
--- a/src/polkit/polkitpermission.c
+++ b/src/polkit/polkitpermission.c
@@ -454,6 +454,7 @@ changed_check_cb (GObject       *source_object,
   if (result != NULL)
     {
       process_result (permission, result);
+      g_object_unref (result);
     }
   else
     {
commit 291992000dbde8cbd1f9e99b2a1769f12906fa19
Author: Miloslav Trmač <mitr at redhat.com>
Date:   Mon Feb 13 16:58:42 2017 +0100

    Add Indonesian translation by Andika Triwidada
    
    https://bugs.freedesktop.org/show_bug.cgi?id=99790

diff --git a/po/LINGUAS b/po/LINGUAS
index fef68d8..f6a4926 100644
--- a/po/LINGUAS
+++ b/po/LINGUAS
@@ -4,6 +4,7 @@ cs
 da
 de
 hu
+id
 pl
 pt_BR
 sk
diff --git a/po/id.po b/po/id.po
new file mode 100644
index 0000000..4029215
--- /dev/null
+++ b/po/id.po
@@ -0,0 +1,205 @@
+# Indonesian translation for polkit.
+# Copyright (C) 2016 polkit's COPYRIGHT HOLDER
+# This file is distributed under the same license as the polkit package.
+# Lorenz Adam Damara <lorenzadam at resolution-consulting.co.id>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: polkit master\n"
+"Report-Msgid-Bugs-To: https://bugs.freedesktop.org/enter_bug.cgi?"
+"product=PolicyKit&keywords=I18N+L10N&component=libpolkit\n"
+"POT-Creation-Date: 2016-07-10 02:28+0000\n"
+"PO-Revision-Date: 2016-07-10 17:27+0700\n"
+"Language-Team: Indonesian <gnome-l10n-id at googlegroups.com>\n"
+"Language: id\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Last-Translator: Lorenz Adam Damara <lorenzrenz at gmail.com>\n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#: ../actions/org.freedesktop.policykit.policy.in.h:1
+msgid "Run a program as another user"
+msgstr "Jalankan program sebagai pengguna lain"
+
+#: ../actions/org.freedesktop.policykit.policy.in.h:2
+msgid "Authentication is required to run a program as another user"
+msgstr "Otentikasi diperlukan untuk menjalankan program sebagai pengguna lain"
+
+#: ../src/examples/org.freedesktop.policykit.examples.pkexec.policy.in.h:1
+msgid "Run the polkit example program Frobnicate"
+msgstr "Jalankan contoh program polkit Frobnicate"
+
+#: ../src/examples/org.freedesktop.policykit.examples.pkexec.policy.in.h:2
+msgid ""
+"Authentication is required to run the polkit example program Frobnicate "
+"(user=$(user), user.gecos=$(user.gecos), user.display=$(user.display), "
+"program=$(program), command_line=$(command_line))"
+msgstr ""
+"Otentikasi dibutuhkan untuk menjalankan contoh program Frobnicate (user="
+"$(user), user.gecos=$(user.gecos), user.display=$(user.display), program="
+"$(program), command_line=$(command_line))"
+
+#: ../src/programs/pkaction.c:101
+msgid "Only output information about ACTION"
+msgstr "Hanya informasi keluaran tentang AKSI"
+
+#: ../src/programs/pkaction.c:101
+msgid "ACTION"
+msgstr "ACTION"
+
+#: ../src/programs/pkaction.c:105
+msgid "Output detailed action information"
+msgstr "Informasi detil aksi keluaran"
+
+#: ../src/programs/pkaction.c:109 ../src/programs/pkttyagent.c:62
+msgid "Show version"
+msgstr "Tampilkan versi"
+
+#: ../src/programs/pkaction.c:134
+msgid "[--action-id ACTION]"
+msgstr "[--action-id ACTION]"
+
+#: ../src/programs/pkaction.c:135 ../src/programs/pkttyagent.c:85
+#, c-format
+msgid ""
+"Report bugs to: %s\n"
+"%s home page: <%s>"
+msgstr ""
+"Laporkan kutu ke: %s\n"
+"halaman beranda %s: <%s>"
+
+#: ../src/programs/pkaction.c:149 ../src/programs/pkcheck.c:495
+#: ../src/programs/pkttyagent.c:99
+#, c-format
+msgid "%s: Unexpected argument `%s'\n"
+msgstr "%s: argumen yang tak terduga `%s'\n"
+
+#: ../src/programs/pkcheck.c:36
+#, c-format
+msgid ""
+"Usage:\n"
+"  pkcheck [OPTION...]\n"
+"\n"
+"Help Options:\n"
+"  -h, --help                         Show help options\n"
+"\n"
+"Application Options:\n"
+"  -a, --action-id=ACTION             Check authorization to perform ACTION\n"
+"  -u, --allow-user-interaction       Interact with the user if necessary\n"
+"  -d, --details=KEY VALUE            Add (KEY, VALUE) to information about "
+"the action\n"
+"  --enable-internal-agent            Use an internal authentication agent if "
+"necessary\n"
+"  --list-temp                        List temporary authorizations for "
+"current session\n"
+"  -p, --process=PID[,START_TIME,UID] Check authorization of specified "
+"process\n"
+"  --revoke-temp                      Revoke all temporary authorizations for "
+"current session\n"
+"  -s, --system-bus-name=BUS_NAME     Check authorization of owner of "
+"BUS_NAME\n"
+"  --version                          Show version\n"
+"\n"
+"Report bugs to: %s\n"
+"%s home page: <%s>\n"
+msgstr ""
+"Penggunaan:\n"
+" pkcheck [PILIHAN...]\n"
+"\n"
+"Bantuan Pilihan:\n"
+"  -h, --help                         Show help options\n"
+"Pilihan Aplikasi:\n"
+"-a, --action-id=ACTION             Periksa otorisasi untuk melakukan ACTION\n"
+"  -u, --allow-user-interaction       Berkomunikasi dengan pengguna jika "
+"dibutuhkan\n"
+"  -d, --details=KEY VALUE            Tambahkan (KEY, VALUE) untuk informasi "
+"mengenai aksi\n"
+"  --enable-internal-agent            Gunakan otentikasi agen internal jika "
+"dibutuhkan\n"
+"  --list-temp                        Daftar otorisasi sementara untuk sesi "
+"ini\n"
+"  -p, --process=PID[,START_TIME,UID] Periksa otorisasi untuk proses yang "
+"spesifik\n"
+"  --revoke-temp                      Cabut semua otorisasi sementara untuk "
+"sesi saat ini\n"
+"  -s, --system-bus-name=BUS_NAME     Periksa otorisasi bagi pemilik "
+"BUS_NAME\n"
+"  --version                          Tampilkan versi\n"
+"\n"
+"Laporkan kutu ke: %s\n"
+"halaman beranda %s: <%s>\n"
+
+#: ../src/programs/pkcheck.c:395 ../src/programs/pkcheck.c:428
+#: ../src/programs/pkcheck.c:440
+#, c-format
+msgid "%s: Argument expected after `%s'\n"
+msgstr "%s: Argumen diharapkan setelah `%s'\n"
+
+#: ../src/programs/pkcheck.c:418
+#, c-format
+msgid "%s: Invalid --process value `%s'\n"
+msgstr "%s: kesalahan nilai --process `%s'\n"
+
+#: ../src/programs/pkcheck.c:455 ../src/programs/pkcheck.c:464
+#, c-format
+msgid "%s: Two arguments expected after `--detail'\n"
+msgstr "%s: Dua argumen diharapkan setelah `--detail'\n"
+
+#: ../src/programs/pkcheck.c:525
+#, c-format
+msgid "%s: Subject not specified\n"
+msgstr "%s: Subyek tidak dispesifikasikan\n"
+
+#. Translators: message shown when trying to run a program as root. Do not
+#. * translate the $(program) fragment - it will be expanded to the path
+#. * of the program e.g.  /bin/bash.
+#.
+#: ../src/programs/pkexec.c:797
+msgid "Authentication is needed to run `$(program)' as the super user"
+msgstr ""
+"Otentikasi dibutuhkan untuk menjalankan `$(program)' sebagai super user"
+
+#. Translators: message shown when trying to run a program as another user.
+#. * Do not translate the $(program) or $(user) fragments - the former will
+#. * be expanded to the path of the program e.g. "/bin/bash" and the latter
+#. * to the user e.g. "John Doe (johndoe)" or "johndoe".
+#.
+#: ../src/programs/pkexec.c:807
+msgid "Authentication is needed to run `$(program)' as user $(user.display)"
+msgstr ""
+"Otentikasi dibutuhkan untuk menjalankan `$(program)' sebagai pengguna $(user."
+"display)"
+
+#: ../src/programs/pkttyagent.c:45
+msgid "Don't replace existing agent if any"
+msgstr "Jangan ganti agen yang sudah ada"
+
+#: ../src/programs/pkttyagent.c:49
+msgid "Close FD when the agent is registered"
+msgstr "Tutup FD ketika agen sudah terdaftar"
+
+#: ../src/programs/pkttyagent.c:49
+msgid "FD"
+msgstr "FD"
+
+#: ../src/programs/pkttyagent.c:53
+msgid "Register the agent for the specified process"
+msgstr "Daftarkan agen untuk proses yang spesifik"
+
+#: ../src/programs/pkttyagent.c:54
+msgid "PID[,START_TIME]"
+msgstr "PID,[,START_TIME]"
+
+#: ../src/programs/pkttyagent.c:58
+msgid "Register the agent owner of BUS_NAME"
+msgstr "Daftarkan agen pemilik BUS_NAME"
+
+#: ../src/programs/pkttyagent.c:58
+msgid "BUS_NAME"
+msgstr "BUS_NAME"
+
+#: ../src/programs/pkttyagent.c:131
+#, c-format
+msgid "%s: Invalid process specifier `%s'\n"
+msgstr "%s: Kesalahan spesifikasi proses `%s'\n"


More information about the hal-commit mailing list