From 1deacdd4e8e35a5cf1417918ca4f6b0afa6409b1 Mon Sep 17 00:00:00 2001 From: William Manley Date: Wed, 9 Aug 2023 10:04:49 +0000 Subject: [PATCH] gvariant-core: Consolidate construction of `GVariantSerialised` So I only need to change it in one place. This introduces no functional changes. Helps: #2121 CVE: CVE-2023-32665 Upstream-Status: Backport from [https://gitlab.gnome.org/GNOME/glib/-/commit/1deacdd4e8e35a5cf1417918ca4f6b0afa6409b1] Signed-off-by: Siddharth Doshi --- glib/gvariant.c | 8 +++++--- glib/tests/gvariant.c | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/glib/gvariant.c b/glib/gvariant.c index 8ba701e..4dbd9e8 100644 --- a/glib/gvariant.c +++ b/glib/gvariant.c @@ -5952,14 +5952,16 @@ g_variant_byteswap (GVariant *value) g_variant_serialised_byteswap (serialised); bytes = g_bytes_new_take (serialised.data, serialised.size); - new = g_variant_new_from_bytes (g_variant_get_type (value), bytes, TRUE); + new = g_variant_ref_sink (g_variant_new_from_bytes (g_variant_get_type (value), bytes, TRUE)); g_bytes_unref (bytes); } else /* contains no multi-byte data */ - new = value; + new = g_variant_get_normal_form (value); - return g_variant_ref_sink (new); + g_assert (g_variant_is_trusted (new)); + + return g_steal_pointer (&new); } /** diff --git a/glib/tests/gvariant.c b/glib/tests/gvariant.c index 4ce0e4f..3dda08e 100644 --- a/glib/tests/gvariant.c +++ b/glib/tests/gvariant.c @@ -3834,6 +3834,29 @@ test_gv_byteswap (void) g_free (string); } +static void +test_gv_byteswap_non_normal_non_aligned (void) +{ + const guint8 data[] = { 0x02 }; + GVariant *v = NULL; + GVariant *v_byteswapped = NULL; + + g_test_summary ("Test that calling g_variant_byteswap() on a variant which " + "is in non-normal form and doesn’t need byteswapping returns " + "the same variant in normal form."); + + v = g_variant_new_from_data (G_VARIANT_TYPE_BOOLEAN, data, sizeof (data), FALSE, NULL, NULL); + g_assert_false (g_variant_is_normal_form (v)); + + v_byteswapped = g_variant_byteswap (v); + g_assert_true (g_variant_is_normal_form (v_byteswapped)); + + g_assert_cmpvariant (v, v_byteswapped); + + g_variant_unref (v); + g_variant_unref (v_byteswapped); +} + static void test_parser (void) { @@ -5570,6 +5593,7 @@ main (int argc, char **argv) g_test_add_func ("/gvariant/builder-memory", test_builder_memory); g_test_add_func ("/gvariant/hashing", test_hashing); g_test_add_func ("/gvariant/byteswap", test_gv_byteswap); + g_test_add_func ("/gvariant/byteswap/non-normal-non-aligned", test_gv_byteswap_non_normal_non_aligned); g_test_add_func ("/gvariant/parser", test_parses); g_test_add_func ("/gvariant/parser/integer-bounds", test_parser_integer_bounds); g_test_add_func ("/gvariant/parser/recursion", test_parser_recursion); -- 2.24.4