diff options
author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2021-02-08 11:05:01 +0000 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2021-02-08 11:05:01 +0000 |
commit | d8fe3646c5334ded52c2a2ee14d344ca8389180b (patch) | |
tree | 90a702f8e33b4e3ae7ca60f6f7cbcea293a6d415 | |
parent | fa248f7f71cf4e1658374acb8351efd4cc8d108c (diff) | |
parent | df4501316ca3903072400504a5ea76498db19538 (diff) | |
download | glib-d8fe3646c5334ded52c2a2ee14d344ca8389180b.tar.gz |
Merge branch 'wip/tlspassword' into 'master'
gtlspassword: Fix inverted assertion
See merge request GNOME/glib!1932
-rw-r--r-- | gio/gtlspassword.c | 2 | ||||
-rw-r--r-- | gio/tests/tls-interaction.c | 55 |
2 files changed, 56 insertions, 1 deletions
diff --git a/gio/gtlspassword.c b/gio/gtlspassword.c index f5e02a1a8..948e812df 100644 --- a/gio/gtlspassword.c +++ b/gio/gtlspassword.c @@ -290,7 +290,7 @@ g_tls_password_set_value (GTlsPassword *password, { /* FIXME: g_tls_password_set_value_full() doesn’t support unsigned gsize */ gsize length_unsigned = strlen ((gchar *) value); - g_return_if_fail (length_unsigned > G_MAXSSIZE); + g_return_if_fail (length_unsigned <= G_MAXSSIZE); length = (gssize) length_unsigned; } diff --git a/gio/tests/tls-interaction.c b/gio/tests/tls-interaction.c index 4f0737d7e..5661e8e0d 100644 --- a/gio/tests/tls-interaction.c +++ b/gio/tests/tls-interaction.c @@ -174,6 +174,38 @@ test_interaction_ask_password_finish_failure (GTlsInteraction *interaction, } +/* Return a copy of @str that is allocated in a silly way, to exercise + * custom free-functions. The returned pointer points to a copy of @str + * in a buffer of the form "BEFORE \0 str \0 AFTER". */ +static guchar * +special_dup (const char *str) +{ + GString *buf = g_string_new ("BEFORE"); + guchar *ret; + + g_string_append_c (buf, '\0'); + g_string_append (buf, str); + g_string_append_c (buf, '\0'); + g_string_append (buf, "AFTER"); + ret = (guchar *) g_string_free (buf, FALSE); + return ret + strlen ("BEFORE") + 1; +} + + +/* Free a copy of @str that was made with special_dup(), after asserting + * that it has not been corrupted. */ +static void +special_free (gpointer p) +{ + gchar *s = p; + gchar *buf = s - strlen ("BEFORE") - 1; + + g_assert_cmpstr (buf, ==, "BEFORE"); + g_assert_cmpstr (s + strlen (s) + 1, ==, "AFTER"); + g_free (buf); +} + + static GTlsInteractionResult test_interaction_ask_password_sync_success (GTlsInteraction *interaction, GTlsPassword *password, @@ -181,6 +213,8 @@ test_interaction_ask_password_sync_success (GTlsInteraction *interaction, GError **error) { TestInteraction *self; + const guchar *value; + gsize len; g_assert (TEST_IS_INTERACTION (interaction)); self = TEST_INTERACTION (interaction); @@ -192,6 +226,27 @@ test_interaction_ask_password_sync_success (GTlsInteraction *interaction, g_assert (error != NULL); g_assert (*error == NULL); + /* Exercise different ways to set the value */ + g_tls_password_set_value (password, (const guchar *) "foo", 4); + len = 0; + value = g_tls_password_get_value (password, &len); + g_assert_cmpmem (value, len, "foo", 4); + + g_tls_password_set_value (password, (const guchar *) "bar", -1); + len = 0; + value = g_tls_password_get_value (password, &len); + g_assert_cmpmem (value, len, "bar", 3); + + g_tls_password_set_value_full (password, special_dup ("baa"), 4, special_free); + len = 0; + value = g_tls_password_get_value (password, &len); + g_assert_cmpmem (value, len, "baa", 4); + + g_tls_password_set_value_full (password, special_dup ("baz"), -1, special_free); + len = 0; + value = g_tls_password_get_value (password, &len); + g_assert_cmpmem (value, len, "baz", 3); + /* Don't do this in real life. Include a null terminator for testing */ g_tls_password_set_value (password, (const guchar *)"the password", 13); return G_TLS_INTERACTION_HANDLED; |