diff options
Diffstat (limited to 'libsecret/secret-value.c')
-rw-r--r-- | libsecret/secret-value.c | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/libsecret/secret-value.c b/libsecret/secret-value.c index ca891cb..63464cd 100644 --- a/libsecret/secret-value.c +++ b/libsecret/secret-value.c @@ -256,39 +256,67 @@ is_password_value (SecretValue *value) return FALSE; } +/** + * secret_value_unref_to_password: + * @value: the value + * @length: the length of the secret + * + * Unreference a #SecretValue and steal the secret data in + * #SecretValue as nonpageable memory. + * + * Returns: (transfer full): a new password string stored in nonpageable memory + * which must be freed with secret_password_free() when done + * + * Since: 0.19.0 + */ gchar * -_secret_value_unref_to_password (SecretValue *value) +secret_value_unref_to_password (SecretValue *value, + gsize *length) { SecretValue *val = value; gchar *result; g_return_val_if_fail (value != NULL, NULL); - if (!is_password_value (value)) { - secret_value_unref (value); - return NULL; - } - if (g_atomic_int_dec_and_test (&val->refs)) { if (val->destroy == egg_secure_free) { result = val->secret; + if (length) + *length = val->length; } else { result = egg_secure_strndup (val->secret, val->length); if (val->destroy) (val->destroy) (val->secret); + if (length) + *length = val->length; } g_free (val->content_type); g_slice_free (SecretValue, val); } else { result = egg_secure_strndup (val->secret, val->length); + if (length) + *length = val->length; } return result; } gchar * +_secret_value_unref_to_password (SecretValue *value) +{ + g_return_val_if_fail (value != NULL, NULL); + + if (!is_password_value (value)) { + secret_value_unref (value); + return NULL; + } + + return secret_value_unref_to_password (value, NULL); +} + +gchar * _secret_value_unref_to_string (SecretValue *value) { SecretValue *val = value; |