[gnome-keyring] egg: Fix null termination behavior of egg_secure_strndup()



commit 8a2bee5b2ddb424a4b374f6baca4492c0679fed1
Author: Daiki Ueno <dueno src gnome org>
Date:   Wed Feb 21 16:42:16 2018 +0100

    egg: Fix null termination behavior of egg_secure_strndup()
    
    Even if the given string is shorter than n, the result should be null
    terminated.  This matches the behavior of strndup().

 egg/egg-secure-memory.c |    1 +
 egg/test-secmem.c       |   25 +++++++++++++++++++++++++
 2 files changed, 26 insertions(+), 0 deletions(-)
---
diff --git a/egg/egg-secure-memory.c b/egg/egg-secure-memory.c
index ac4ce06..4d8b3cc 100644
--- a/egg/egg-secure-memory.c
+++ b/egg/egg-secure-memory.c
@@ -1344,6 +1344,7 @@ egg_secure_strndup_full (const char *tag,
        len = length + 1;
        res = (char *)egg_secure_alloc_full (tag, len, options);
        memcpy (res, str, len);
+       res[length] = '\0';
        return res;
 }
 
diff --git a/egg/test-secmem.c b/egg/test-secmem.c
index 58b0d35..54d8136 100644
--- a/egg/test-secmem.c
+++ b/egg/test-secmem.c
@@ -252,6 +252,30 @@ test_strclear (void)
        egg_secure_free_full (str, 0);
 }
 
+static void
+test_strndup (void)
+{
+       gchar *str;
+
+       str = egg_secure_strndup ("secret", 6);
+       g_assert (str != NULL);
+       g_assert_cmpuint (strlen (str), ==, 6);
+
+       egg_secure_free_full (str, 0);
+
+       str = egg_secure_strndup ("secret", 10);
+       g_assert (str != NULL);
+       g_assert_cmpuint (strlen (str), ==, 6);
+
+       egg_secure_free_full (str, 0);
+
+       str = egg_secure_strndup ("long secret", 6);
+       g_assert (str != NULL);
+       g_assert_cmpuint (strlen (str), ==, 6);
+
+       egg_secure_free_full (str, 0);
+}
+
 int
 main (int argc, char **argv)
 {
@@ -264,6 +288,7 @@ main (int argc, char **argv)
        g_test_add_func ("/secmem/multialloc", test_multialloc);
        g_test_add_func ("/secmem/clear", test_clear);
        g_test_add_func ("/secmem/strclear", test_strclear);
+       g_test_add_func ("/secmem/strndup", test_strndup);
 
        return g_test_run ();
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]