From e21ab81ce039eab1992b5741e3b14ea785124a5f Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Tue, 23 Jun 2020 10:30:55 +0000 Subject: [PATCH] gvalue: Do copy non-interned strings The G_VALUE_NOCOPY_CONTENTS for strings can only be used when collecting them and not when copying them. Instead only avoid copies for strings that are interned. Fixes #2141 --- gobject/gvalue.h | 3 ++- gobject/gvaluetypes.c | 4 ++-- gobject/tests/value.c | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/gobject/gvalue.h b/gobject/gvalue.h index 1c6d7377c..dc6e5ac3b 100644 --- a/gobject/gvalue.h +++ b/gobject/gvalue.h @@ -171,7 +171,8 @@ void g_value_register_transform_func (GType src_type, * * If passed to G_VALUE_COLLECT(), allocated data won't be copied * but used verbatim. This does not affect ref-counted types like - * objects. + * objects. This does not affect usage of g_value_copy(), the data will + * be copied if it is not ref-counted. */ #define G_VALUE_NOCOPY_CONTENTS (1 << 27) diff --git a/gobject/gvaluetypes.c b/gobject/gvaluetypes.c index 9eaba43ce..732ea2b08 100644 --- a/gobject/gvaluetypes.c +++ b/gobject/gvaluetypes.c @@ -264,7 +264,7 @@ static void value_copy_string (const GValue *src_value, GValue *dest_value) { - if (src_value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS) + if (src_value->data[1].v_uint & G_VALUE_INTERNED_STRING) { dest_value->data[0].v_pointer = src_value->data[0].v_pointer; dest_value->data[1].v_uint = src_value->data[1].v_uint; @@ -272,7 +272,7 @@ value_copy_string (const GValue *src_value, else { dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer); - dest_value->data[1].v_uint = src_value->data[1].v_uint; + /* Don't copy over *any* flags, we're restarting from scratch */ } } diff --git a/gobject/tests/value.c b/gobject/tests/value.c index af918dde9..e21b23445 100644 --- a/gobject/tests/value.c +++ b/gobject/tests/value.c @@ -148,11 +148,11 @@ test_value_string (void) g_assert_cmpstr (str2, ==, static1); g_free (str2); - /* Copying a static string gvalue should *not* copy the contents */ + /* Copying a static string gvalue should *actually* copy the contents */ g_value_init (©, G_TYPE_STRING); g_value_copy (&value, ©); copystr = g_value_get_string (©); - g_assert_true (copystr == static1); + g_assert_true (copystr != static1); g_value_unset (©); /* Setting a new string should change the contents */