!108 backport some patches from community
From: @han_hui_hui Reviewed-by: @yanan-rock Signed-off-by: @yanan-rock
This commit is contained in:
commit
76ffe0c841
@ -0,0 +1,68 @@
|
|||||||
|
From f43cf341511dd684a58c09e104e28c11987cbff1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rozhuk Ivan <rozhuk.im@gmail.com>
|
||||||
|
Date: Sat, 25 Jun 2022 18:46:08 +0300
|
||||||
|
Subject: [PATCH] [PATCH] Add lock in _g_get_unix_mount_points() around
|
||||||
|
*fsent() functions
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/f43cf341511dd684a58c09e104e28c11987cbff1
|
||||||
|
|
||||||
|
---
|
||||||
|
gio/gunixmounts.c | 22 +++++++++++++---------
|
||||||
|
1 file changed, 13 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/gio/gunixmounts.c b/gio/gunixmounts.c
|
||||||
|
index 563bdba3b2..3005aa7af3 100644
|
||||||
|
--- a/gio/gunixmounts.c
|
||||||
|
+++ b/gio/gunixmounts.c
|
||||||
|
@@ -1410,17 +1410,13 @@ _g_get_unix_mount_points (void)
|
||||||
|
{
|
||||||
|
struct fstab *fstab = NULL;
|
||||||
|
GUnixMountPoint *mount_point;
|
||||||
|
- GList *return_list;
|
||||||
|
+ GList *return_list = NULL;
|
||||||
|
+ G_LOCK_DEFINE_STATIC (fsent);
|
||||||
|
#ifdef HAVE_SYS_SYSCTL_H
|
||||||
|
int usermnt = 0;
|
||||||
|
struct stat sb;
|
||||||
|
#endif
|
||||||
|
-
|
||||||
|
- if (!setfsent ())
|
||||||
|
- return NULL;
|
||||||
|
|
||||||
|
- return_list = NULL;
|
||||||
|
-
|
||||||
|
#ifdef HAVE_SYS_SYSCTL_H
|
||||||
|
#if defined(HAVE_SYSCTLBYNAME)
|
||||||
|
{
|
||||||
|
@@ -1448,7 +1444,14 @@ _g_get_unix_mount_points (void)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
-
|
||||||
|
+
|
||||||
|
+ G_LOCK (fsent);
|
||||||
|
+ if (!setfsent ())
|
||||||
|
+ {
|
||||||
|
+ G_UNLOCK (fsent);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
while ((fstab = getfsent ()) != NULL)
|
||||||
|
{
|
||||||
|
gboolean is_read_only = FALSE;
|
||||||
|
@@ -1482,9 +1485,10 @@ _g_get_unix_mount_points (void)
|
||||||
|
|
||||||
|
return_list = g_list_prepend (return_list, mount_point);
|
||||||
|
}
|
||||||
|
-
|
||||||
|
+
|
||||||
|
endfsent ();
|
||||||
|
-
|
||||||
|
+ G_UNLOCK (fsent);
|
||||||
|
+
|
||||||
|
return g_list_reverse (return_list);
|
||||||
|
}
|
||||||
|
/* Interix {{{2 */
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
27
backport-Fix-memory-leak-in-gdbusauthmechanismsha1.patch
Normal file
27
backport-Fix-memory-leak-in-gdbusauthmechanismsha1.patch
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
From 6ec432386ef98e26e5079b060ad823277e10f41f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Loic Le Page <llepage@fluendo.com>
|
||||||
|
Date: Wed, 26 Jan 2022 14:20:08 +0100
|
||||||
|
Subject: [PATCH] Fix memory leak in gio/gdbusauthmechanismsha1.c
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/6ec432386ef98e26e5079b060ad823277e10f41f
|
||||||
|
|
||||||
|
---
|
||||||
|
gio/gdbusauthmechanismsha1.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/gio/gdbusauthmechanismsha1.c b/gio/gdbusauthmechanismsha1.c
|
||||||
|
index a82dddf839..8137b6352d 100644
|
||||||
|
--- a/gio/gdbusauthmechanismsha1.c
|
||||||
|
+++ b/gio/gdbusauthmechanismsha1.c
|
||||||
|
@@ -909,6 +909,7 @@ keyring_generate_entry (const gchar *cookie_context,
|
||||||
|
_("(Additionally, releasing the lock for “%s” also failed: %s) "),
|
||||||
|
path,
|
||||||
|
local_error->message);
|
||||||
|
+ g_error_free (local_error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
@ -0,0 +1,172 @@
|
|||||||
|
From 6499ad53567a64cb70f2fdc690ad405350fe1ce3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Sebastian Wilhelmi <wilhelmi@google.com>
|
||||||
|
Date: Thu, 6 Jan 2022 21:04:56 +0000
|
||||||
|
Subject: [PATCH] gdbusmessage: Disallow empty structures/tuples in D-Bus
|
||||||
|
messages
|
||||||
|
|
||||||
|
They are disallowed in the specification:
|
||||||
|
https://dbus.freedesktop.org/doc/dbus-specification.html#container-types
|
||||||
|
|
||||||
|
Helps: #2557
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/6499ad53567a64cb70f2fdc690ad405350fe1ce3
|
||||||
|
|
||||||
|
---
|
||||||
|
gio/gdbusmessage.c | 19 +++++++
|
||||||
|
gio/tests/gdbus-serialization.c | 88 +++++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 107 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/gio/gdbusmessage.c b/gio/gdbusmessage.c
|
||||||
|
index 6e3bd8b..0645b90 100644
|
||||||
|
--- a/gio/gdbusmessage.c
|
||||||
|
+++ b/gio/gdbusmessage.c
|
||||||
|
@@ -1833,6 +1833,16 @@ parse_value_from_blob (GMemoryBuffer *buf,
|
||||||
|
|
||||||
|
g_variant_builder_init (&builder, type);
|
||||||
|
element_type = g_variant_type_first (type);
|
||||||
|
+ if (!element_type)
|
||||||
|
+ {
|
||||||
|
+ g_variant_builder_clear (&builder);
|
||||||
|
+ g_set_error_literal (&local_error,
|
||||||
|
+ G_IO_ERROR,
|
||||||
|
+ G_IO_ERROR_INVALID_ARGUMENT,
|
||||||
|
+ _("Empty structures (tuples) are not allowed in D-Bus"));
|
||||||
|
+ goto fail;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
while (element_type != NULL)
|
||||||
|
{
|
||||||
|
GVariant *item;
|
||||||
|
@@ -2538,6 +2548,15 @@ append_value_to_blob (GVariant *value,
|
||||||
|
default:
|
||||||
|
if (g_variant_type_is_dict_entry (type) || g_variant_type_is_tuple (type))
|
||||||
|
{
|
||||||
|
+ if (!g_variant_type_first (type))
|
||||||
|
+ {
|
||||||
|
+ g_set_error_literal (error,
|
||||||
|
+ G_IO_ERROR,
|
||||||
|
+ G_IO_ERROR_INVALID_ARGUMENT,
|
||||||
|
+ _("Empty structures (tuples) are not allowed in D-Bus"));
|
||||||
|
+ goto fail;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
padding_added = ensure_output_padding (mbuf, 8);
|
||||||
|
if (value != NULL)
|
||||||
|
{
|
||||||
|
diff --git a/gio/tests/gdbus-serialization.c b/gio/tests/gdbus-serialization.c
|
||||||
|
index 2ca28d9..34df053 100644
|
||||||
|
--- a/gio/tests/gdbus-serialization.c
|
||||||
|
+++ b/gio/tests/gdbus-serialization.c
|
||||||
|
@@ -1411,6 +1411,90 @@ test_message_parse_deep_body_nesting (void)
|
||||||
|
g_clear_error (&local_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+test_message_parse_empty_structure (void)
|
||||||
|
+{
|
||||||
|
+ const guint8 data[] =
|
||||||
|
+ {
|
||||||
|
+ 'l', /* little-endian byte order */
|
||||||
|
+ 0x02, /* message type (method return) */
|
||||||
|
+ 0x00, /* message flags (none) */
|
||||||
|
+ 0x01, /* major protocol version */
|
||||||
|
+ 0x08, 0x00, 0x00, 0x00, /* body length (in bytes) */
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, /* message serial */
|
||||||
|
+ /* a{yv} of header fields */
|
||||||
|
+ 0x20, 0x00, 0x00, 0x00, /* array length (in bytes), must be a multiple of 8 */
|
||||||
|
+ 0x01, /* array key (PATH) */
|
||||||
|
+ 0x01, /* signature length */
|
||||||
|
+ 'o', /* type (OBJECT_PATH) */
|
||||||
|
+ 0x00, /* nul terminator */
|
||||||
|
+ 0x05, 0x00, 0x00, 0x00, /* length 5 */
|
||||||
|
+ '/', 'p', 'a', 't', 'h', 0x00, 0x00, 0x00, /* string '/path' and padding */
|
||||||
|
+ 0x03, /* array key (MEMBER) */
|
||||||
|
+ 0x01, /* signature length */
|
||||||
|
+ 's', /* type (STRING) */
|
||||||
|
+ 0x00, /* nul terminator */
|
||||||
|
+ 0x06, 0x00, 0x00, 0x00, /* length 6 */
|
||||||
|
+ 'M', 'e', 'm', 'b', 'e', 'r', 0x00, 0x00, /* string 'Member' and padding */
|
||||||
|
+ 0x08, /* array key (SIGNATURE) */
|
||||||
|
+ 0x01, /* signature length */
|
||||||
|
+ 'g', /* type (SIGNATURE) */
|
||||||
|
+ 0x00, /* nul terminator */
|
||||||
|
+ 0x03, /* length 3 */
|
||||||
|
+ 'a', '(', ')', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* type 'a()' and padding */
|
||||||
|
+ 0x08, 0x00, 0x00, 0x00, /* array length: 4 bytes */
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, /* padding to 8 bytes */
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* array data */
|
||||||
|
+ 0x00
|
||||||
|
+ };
|
||||||
|
+ gsize size = sizeof (data);
|
||||||
|
+ GDBusMessage *message = NULL;
|
||||||
|
+ GError *local_error = NULL;
|
||||||
|
+
|
||||||
|
+ g_test_summary ("Test that empty structures are rejected when parsing.");
|
||||||
|
+ g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2557");
|
||||||
|
+
|
||||||
|
+ message = g_dbus_message_new_from_blob ((guchar *) data, size,
|
||||||
|
+ G_DBUS_CAPABILITY_FLAGS_NONE,
|
||||||
|
+ &local_error);
|
||||||
|
+ g_assert_error (local_error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT);
|
||||||
|
+ g_assert_cmpstr (local_error->message, ==, "Empty structures (tuples) are not allowed in D-Bus");
|
||||||
|
+ g_assert_null (message);
|
||||||
|
+
|
||||||
|
+ g_clear_error (&local_error);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+test_message_serialize_empty_structure (void)
|
||||||
|
+{
|
||||||
|
+ GDBusMessage *message;
|
||||||
|
+ GVariantBuilder builder;
|
||||||
|
+ gsize size = 0;
|
||||||
|
+ GError *local_error = NULL;
|
||||||
|
+
|
||||||
|
+ g_test_summary ("Test that empty structures are rejected when serializing.");
|
||||||
|
+ g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2557");
|
||||||
|
+
|
||||||
|
+ message = g_dbus_message_new ();
|
||||||
|
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("(a())"));
|
||||||
|
+ g_variant_builder_open (&builder, G_VARIANT_TYPE ("a()"));
|
||||||
|
+ g_variant_builder_add (&builder, "()");
|
||||||
|
+ g_variant_builder_close (&builder);
|
||||||
|
+ g_dbus_message_set_message_type (message, G_DBUS_MESSAGE_TYPE_METHOD_CALL);
|
||||||
|
+ g_dbus_message_set_header (message, G_DBUS_MESSAGE_HEADER_FIELD_PATH,
|
||||||
|
+ g_variant_new_object_path ("/path"));
|
||||||
|
+ g_dbus_message_set_header (message, G_DBUS_MESSAGE_HEADER_FIELD_MEMBER,
|
||||||
|
+ g_variant_new_string ("Member"));
|
||||||
|
+ g_dbus_message_set_body (message, g_variant_builder_end (&builder));
|
||||||
|
+
|
||||||
|
+ g_dbus_message_to_blob (message, &size, G_DBUS_CAPABILITY_FLAGS_NONE, &local_error);
|
||||||
|
+ g_assert_error (local_error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT);
|
||||||
|
+ g_assert_cmpstr (local_error->message, ==, "Empty structures (tuples) are not allowed in D-Bus");
|
||||||
|
+
|
||||||
|
+ g_clear_error (&local_error);
|
||||||
|
+ g_clear_object (&message);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* ---------------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int
|
||||||
|
@@ -1433,6 +1517,8 @@ main (int argc,
|
||||||
|
test_message_serialize_header_checks);
|
||||||
|
g_test_add_func ("/gdbus/message-serialize/double-array",
|
||||||
|
test_message_serialize_double_array);
|
||||||
|
+ g_test_add_func ("/gdbus/message-serialize/empty-structure",
|
||||||
|
+ test_message_serialize_empty_structure);
|
||||||
|
|
||||||
|
g_test_add_func ("/gdbus/message-parse/empty-arrays-of-arrays",
|
||||||
|
test_message_parse_empty_arrays_of_arrays);
|
||||||
|
@@ -1448,6 +1534,8 @@ main (int argc,
|
||||||
|
test_message_parse_deep_header_nesting);
|
||||||
|
g_test_add_func ("/gdbus/message-parse/deep-body-nesting",
|
||||||
|
test_message_parse_deep_body_nesting);
|
||||||
|
+ g_test_add_func ("/gdbus/message-parse/empty-structure",
|
||||||
|
+ test_message_parse_empty_structure);
|
||||||
|
|
||||||
|
return g_test_run();
|
||||||
|
}
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
@ -0,0 +1,46 @@
|
|||||||
|
From 02d0d6497b92d05d1145d1077654ad2453938b6c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rozhuk Ivan <rozhuk.im@gmail.com>
|
||||||
|
Date: Sat, 25 Jun 2022 19:01:30 +0300
|
||||||
|
Subject: [PATCH] [PATCH] _g_get_unix_mount_points(): reduce syscalls inside
|
||||||
|
loop
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/02d0d6497b92d05d1145d1077654ad2453938b6c
|
||||||
|
|
||||||
|
---
|
||||||
|
gio/gunixmounts.c | 16 ++++++++--------
|
||||||
|
1 file changed, 8 insertions(+), 8 deletions(-)
|
||||||
|
diff --git a/gio/gunixmounts.c b/gio/gunixmounts.c
|
||||||
|
index ba08245..92ab163 100644
|
||||||
|
--- a/gio/gunixmounts.c
|
||||||
|
+++ b/gio/gunixmounts.c
|
||||||
|
@@ -1414,6 +1414,7 @@ _g_get_unix_mount_points (void)
|
||||||
|
GList *return_list = NULL;
|
||||||
|
G_LOCK_DEFINE_STATIC (fsent);
|
||||||
|
#ifdef HAVE_SYS_SYSCTL_H
|
||||||
|
+ uid_t uid = getuid ();
|
||||||
|
int usermnt = 0;
|
||||||
|
struct stat sb;
|
||||||
|
#endif
|
||||||
|
@@ -1466,14 +1467,13 @@ _g_get_unix_mount_points (void)
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_SYSCTL_H
|
||||||
|
if (usermnt != 0)
|
||||||
|
- {
|
||||||
|
- uid_t uid = getuid ();
|
||||||
|
- if (stat (fstab->fs_file, &sb) == 0)
|
||||||
|
- {
|
||||||
|
- if (uid == 0 || sb.st_uid == uid)
|
||||||
|
- is_user_mountable = TRUE;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
+ {
|
||||||
|
+ if (uid == 0 ||
|
||||||
|
+ (stat (fstab->fs_file, &sb) == 0 && sb.st_uid == uid))
|
||||||
|
+ {
|
||||||
|
+ is_user_mountable = TRUE;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
mount_point = create_unix_mount_point (fstab->fs_spec,
|
||||||
@ -0,0 +1,56 @@
|
|||||||
|
From 374a1895b62b2504d0b6ae1c404237802e73ddb6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Tobias Stoeckmann <tobias@stoeckmann.org>
|
||||||
|
Date: Tue, 18 Jan 2022 13:45:13 +0000
|
||||||
|
Subject: [PATCH] garray: Fix integer overflows in element capacity
|
||||||
|
calculations
|
||||||
|
|
||||||
|
Integer overflows in size calculations of buffers (GArray and GPtrArray)
|
||||||
|
allow subsequent buffer overflows. This happens due to conversions
|
||||||
|
between gsize and guint.
|
||||||
|
|
||||||
|
Proof of concept demonstrations of the overflows can be found in issue
|
||||||
|
2578. They are not being added as unit tests as they require too much
|
||||||
|
memory to test.
|
||||||
|
|
||||||
|
This will affect `GArray`s which are 4GB in size, or `GPtrArray`s which
|
||||||
|
are 48GB in size.
|
||||||
|
|
||||||
|
Fixes: #2578
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/374a1895b62b2504d0b6ae1c404237802e73ddb6
|
||||||
|
|
||||||
|
---
|
||||||
|
glib/garray.c | 9 +++++----
|
||||||
|
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/glib/garray.c b/glib/garray.c
|
||||||
|
index 3803fee037..b441562154 100644
|
||||||
|
--- a/glib/garray.c
|
||||||
|
+++ b/glib/garray.c
|
||||||
|
@@ -1001,7 +1001,7 @@ g_array_maybe_expand (GRealArray *array,
|
||||||
|
memset (g_array_elt_pos (array, array->elt_capacity), 0,
|
||||||
|
g_array_elt_len (array, want_len - array->elt_capacity));
|
||||||
|
|
||||||
|
- array->elt_capacity = want_alloc / array->elt_size;
|
||||||
|
+ array->elt_capacity = MIN (want_alloc / array->elt_size, G_MAXUINT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1518,9 +1518,10 @@ g_ptr_array_maybe_expand (GRealPtrArray *array,
|
||||||
|
if ((array->len + len) > array->alloc)
|
||||||
|
{
|
||||||
|
guint old_alloc = array->alloc;
|
||||||
|
- array->alloc = g_nearest_pow (array->len + len);
|
||||||
|
- array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE);
|
||||||
|
- array->pdata = g_realloc (array->pdata, sizeof (gpointer) * array->alloc);
|
||||||
|
+ gsize want_alloc = g_nearest_pow (sizeof (gpointer) * (array->len + len));
|
||||||
|
+ want_alloc = MAX (want_alloc, MIN_ARRAY_SIZE);
|
||||||
|
+ array->alloc = MIN (want_alloc / sizeof (gpointer), G_MAXUINT);
|
||||||
|
+ array->pdata = g_realloc (array->pdata, want_alloc);
|
||||||
|
if (G_UNLIKELY (g_mem_gc_friendly))
|
||||||
|
for ( ; old_alloc < array->alloc; old_alloc++)
|
||||||
|
array->pdata [old_alloc] = NULL;
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
280
backport-garray-buffer-overflow-fix.patch
Normal file
280
backport-garray-buffer-overflow-fix.patch
Normal file
@ -0,0 +1,280 @@
|
|||||||
|
From 3a877835389a5e094d2f5d8e7288cd715add4599 Mon Sep 17 00:00:00 2001
|
||||||
|
From: blushingpenguin <mark@blushingpenguin.com>
|
||||||
|
Date: Sat, 16 Oct 2021 16:45:00 +0100
|
||||||
|
Subject: [PATCH] #1331: buffer overflow fix
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/3a877835389a5e094d2f5d8e7288cd715add4599
|
||||||
|
|
||||||
|
---
|
||||||
|
glib/garray.c | 57 ++++++++++++++++++++-----------------
|
||||||
|
glib/tests/array-test.c | 62 +++++++++++++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 94 insertions(+), 25 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/glib/garray.c b/glib/garray.c
|
||||||
|
index 025747ee56..48b3c0c4b5 100644
|
||||||
|
--- a/glib/garray.c
|
||||||
|
+++ b/glib/garray.c
|
||||||
|
@@ -107,7 +107,7 @@ struct _GRealArray
|
||||||
|
{
|
||||||
|
guint8 *data;
|
||||||
|
guint len;
|
||||||
|
- guint alloc;
|
||||||
|
+ guint elt_capacity;
|
||||||
|
guint elt_size;
|
||||||
|
guint zero_terminated : 1;
|
||||||
|
guint clear : 1;
|
||||||
|
@@ -150,7 +150,7 @@ struct _GRealArray
|
||||||
|
* Returns: the element of the #GArray at the index given by @i
|
||||||
|
*/
|
||||||
|
|
||||||
|
-#define g_array_elt_len(array,i) ((array)->elt_size * (i))
|
||||||
|
+#define g_array_elt_len(array,i) ((gsize)(array)->elt_size * (i))
|
||||||
|
#define g_array_elt_pos(array,i) ((array)->data + g_array_elt_len((array),(i)))
|
||||||
|
#define g_array_elt_zero(array, pos, len) \
|
||||||
|
(memset (g_array_elt_pos ((array), pos), 0, g_array_elt_len ((array), len)))
|
||||||
|
@@ -159,7 +159,7 @@ struct _GRealArray
|
||||||
|
g_array_elt_zero ((array), (array)->len, 1); \
|
||||||
|
}G_STMT_END
|
||||||
|
|
||||||
|
-static guint g_nearest_pow (guint num) G_GNUC_CONST;
|
||||||
|
+static gsize g_nearest_pow (gsize num) G_GNUC_CONST;
|
||||||
|
static void g_array_maybe_expand (GRealArray *array,
|
||||||
|
guint len);
|
||||||
|
|
||||||
|
@@ -181,6 +181,7 @@ g_array_new (gboolean zero_terminated,
|
||||||
|
guint elt_size)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (elt_size > 0, NULL);
|
||||||
|
+ g_return_val_if_fail (elt_size <= G_MAXSIZE / 2 - 1, NULL);
|
||||||
|
|
||||||
|
return g_array_sized_new (zero_terminated, clear, elt_size, 0);
|
||||||
|
}
|
||||||
|
@@ -232,7 +233,7 @@ g_array_steal (GArray *array,
|
||||||
|
|
||||||
|
rarray->data = NULL;
|
||||||
|
rarray->len = 0;
|
||||||
|
- rarray->alloc = 0;
|
||||||
|
+ rarray->elt_capacity = 0;
|
||||||
|
return segment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -261,12 +262,13 @@ g_array_sized_new (gboolean zero_terminated,
|
||||||
|
GRealArray *array;
|
||||||
|
|
||||||
|
g_return_val_if_fail (elt_size > 0, NULL);
|
||||||
|
+ g_return_val_if_fail (elt_size <= G_MAXSIZE, NULL);
|
||||||
|
|
||||||
|
array = g_slice_new (GRealArray);
|
||||||
|
|
||||||
|
array->data = NULL;
|
||||||
|
array->len = 0;
|
||||||
|
- array->alloc = 0;
|
||||||
|
+ array->elt_capacity = 0;
|
||||||
|
array->zero_terminated = (zero_terminated ? 1 : 0);
|
||||||
|
array->clear = (clear ? 1 : 0);
|
||||||
|
array->elt_size = elt_size;
|
||||||
|
@@ -471,7 +473,7 @@ array_free (GRealArray *array,
|
||||||
|
{
|
||||||
|
array->data = NULL;
|
||||||
|
array->len = 0;
|
||||||
|
- array->alloc = 0;
|
||||||
|
+ array->elt_capacity = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@@ -966,22 +968,22 @@ g_array_binary_search (GArray *array,
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
-/* Returns the smallest power of 2 greater than n, or n if
|
||||||
|
- * such power does not fit in a guint
|
||||||
|
+/* Returns the smallest power of 2 greater than or equal to n,
|
||||||
|
+ * or 0 if such power does not fit in a gsize
|
||||||
|
*/
|
||||||
|
-static guint
|
||||||
|
-g_nearest_pow (guint num)
|
||||||
|
+static gsize
|
||||||
|
+g_nearest_pow (gsize num)
|
||||||
|
{
|
||||||
|
- guint n = num - 1;
|
||||||
|
+ gsize n = num - 1;
|
||||||
|
|
||||||
|
- g_assert (num > 0);
|
||||||
|
+ g_assert (num > 0 && num <= G_MAXSIZE / 2);
|
||||||
|
|
||||||
|
n |= n >> 1;
|
||||||
|
n |= n >> 2;
|
||||||
|
n |= n >> 4;
|
||||||
|
n |= n >> 8;
|
||||||
|
n |= n >> 16;
|
||||||
|
-#if SIZEOF_INT == 8
|
||||||
|
+#if GLIB_SIZEOF_SIZE_T == 8
|
||||||
|
n |= n >> 32;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@@ -992,26 +994,32 @@ static void
|
||||||
|
g_array_maybe_expand (GRealArray *array,
|
||||||
|
guint len)
|
||||||
|
{
|
||||||
|
- guint want_alloc;
|
||||||
|
+ guint max_len, want_len;
|
||||||
|
+
|
||||||
|
+ /* The maximum array length is derived from following constraints:
|
||||||
|
+ * - The number of bytes must fit into a gsize / 2.
|
||||||
|
+ * - The number of elements must fit into guint.
|
||||||
|
+ * - zero terminated arrays must leave space for the terminating element
|
||||||
|
+ */
|
||||||
|
+ max_len = MIN (G_MAXSIZE / 2 / array->elt_size, G_MAXUINT) - array->zero_terminated;
|
||||||
|
|
||||||
|
/* Detect potential overflow */
|
||||||
|
- if G_UNLIKELY ((G_MAXUINT - array->len) < len)
|
||||||
|
+ if G_UNLIKELY ((max_len - array->len) < len)
|
||||||
|
g_error ("adding %u to array would overflow", len);
|
||||||
|
|
||||||
|
- want_alloc = g_array_elt_len (array, array->len + len +
|
||||||
|
- array->zero_terminated);
|
||||||
|
-
|
||||||
|
- if (want_alloc > array->alloc)
|
||||||
|
+ want_len = array->len + len + array->zero_terminated;
|
||||||
|
+ if (want_len > array->elt_capacity)
|
||||||
|
{
|
||||||
|
- want_alloc = g_nearest_pow (want_alloc);
|
||||||
|
+ gsize want_alloc = g_nearest_pow(g_array_elt_len (array, want_len));
|
||||||
|
want_alloc = MAX (want_alloc, MIN_ARRAY_SIZE);
|
||||||
|
|
||||||
|
array->data = g_realloc (array->data, want_alloc);
|
||||||
|
|
||||||
|
if (G_UNLIKELY (g_mem_gc_friendly))
|
||||||
|
- memset (array->data + array->alloc, 0, want_alloc - array->alloc);
|
||||||
|
+ memset (g_array_elt_pos (array, array->elt_capacity), 0,
|
||||||
|
+ g_array_elt_len (array, want_len - array->elt_capacity));
|
||||||
|
|
||||||
|
- array->alloc = want_alloc;
|
||||||
|
+ array->elt_capacity = want_alloc / array->elt_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1297,7 +1305,7 @@ g_array_copy (GArray *array)
|
||||||
|
|
||||||
|
new_rarray =
|
||||||
|
(GRealArray *) g_array_sized_new (rarray->zero_terminated, rarray->clear,
|
||||||
|
- rarray->elt_size, rarray->alloc / rarray->elt_size);
|
||||||
|
+ rarray->elt_size, rarray->elt_capacity);
|
||||||
|
new_rarray->len = rarray->len;
|
||||||
|
if (rarray->len > 0)
|
||||||
|
memcpy (new_rarray->data, rarray->data, rarray->len * rarray->elt_size);
|
||||||
|
@@ -2298,7 +2306,6 @@ g_byte_array_new_take (guint8 *data,
|
||||||
|
GRealArray *real;
|
||||||
|
|
||||||
|
g_return_val_if_fail (len <= G_MAXUINT, NULL);
|
||||||
|
-
|
||||||
|
array = g_byte_array_new ();
|
||||||
|
real = (GRealArray *)array;
|
||||||
|
g_assert (real->data == NULL);
|
||||||
|
@@ -2306,7 +2313,7 @@ g_byte_array_new_take (guint8 *data,
|
||||||
|
|
||||||
|
real->data = data;
|
||||||
|
real->len = len;
|
||||||
|
- real->alloc = len;
|
||||||
|
+ real->elt_capacity = len;
|
||||||
|
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
diff --git a/glib/tests/array-test.c b/glib/tests/array-test.c
|
||||||
|
index 471f6171dc..fc9f56b45c 100644
|
||||||
|
--- a/glib/tests/array-test.c
|
||||||
|
+++ b/glib/tests/array-test.c
|
||||||
|
@@ -845,6 +845,45 @@ test_array_copy_sized (void)
|
||||||
|
g_array_unref (array1);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+array_overflow_append_vals (void)
|
||||||
|
+{
|
||||||
|
+ if (!g_test_undefined ())
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ if (g_test_subprocess ())
|
||||||
|
+ {
|
||||||
|
+ GArray *array = g_array_new (TRUE, FALSE, 1);
|
||||||
|
+ /* Check for overflow should happen before data is accessed. */
|
||||||
|
+ g_array_append_vals (array, NULL, G_MAXUINT);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ g_test_trap_subprocess (NULL, 0, 0);
|
||||||
|
+ g_test_trap_assert_failed ();
|
||||||
|
+ g_test_trap_assert_stderr ("*adding 4294967295 to array would overflow*");
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+array_overflow_set_size (void)
|
||||||
|
+{
|
||||||
|
+ if (!g_test_undefined ())
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ if (g_test_subprocess ())
|
||||||
|
+ {
|
||||||
|
+ GArray *array = g_array_new (TRUE, FALSE, 1);
|
||||||
|
+ g_array_set_size (array, G_MAXUINT);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ g_test_trap_subprocess (NULL, 0, 0);
|
||||||
|
+ g_test_trap_assert_failed ();
|
||||||
|
+ g_test_trap_assert_stderr ("*adding 4294967295 to array would overflow*");
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* Check g_ptr_array_steal() function */
|
||||||
|
static void
|
||||||
|
pointer_array_steal (void)
|
||||||
|
@@ -1643,6 +1682,26 @@ pointer_array_steal_index (void)
|
||||||
|
g_assert_cmpuint (i4, ==, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+byte_array_new_take_overflow (void)
|
||||||
|
+{
|
||||||
|
+#if G_MAXSIZE <= G_MAXUINT
|
||||||
|
+ g_test_skip ("Overflow test requires G_MAXSIZE > G_MAXUINT.");
|
||||||
|
+#else
|
||||||
|
+ GByteArray* arr;
|
||||||
|
+
|
||||||
|
+ if (!g_test_undefined ())
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ /* Check for overflow should happen before data is accessed. */
|
||||||
|
+ g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
|
||||||
|
+ "*assertion 'len <= G_MAXUINT' failed");
|
||||||
|
+ arr = g_byte_array_new_take (NULL, (gsize)G_MAXUINT + 1);
|
||||||
|
+ g_assert(!arr);
|
||||||
|
+ g_test_assert_expected_messages ();
|
||||||
|
+#endif
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
byte_array_steal (void)
|
||||||
|
{
|
||||||
|
@@ -1998,6 +2057,8 @@ main (int argc, char *argv[])
|
||||||
|
g_test_add_func ("/array/clear-func", array_clear_func);
|
||||||
|
g_test_add_func ("/array/binary-search", test_array_binary_search);
|
||||||
|
g_test_add_func ("/array/copy-sized", test_array_copy_sized);
|
||||||
|
+ g_test_add_func ("/array/overflow-append-vals", array_overflow_append_vals);
|
||||||
|
+ g_test_add_func ("/array/overflow-set-size", array_overflow_set_size);
|
||||||
|
|
||||||
|
for (i = 0; i < G_N_ELEMENTS (array_configurations); i++)
|
||||||
|
{
|
||||||
|
@@ -2043,6 +2104,7 @@ main (int argc, char *argv[])
|
||||||
|
g_test_add_func ("/bytearray/sort", byte_array_sort);
|
||||||
|
g_test_add_func ("/bytearray/sort-with-data", byte_array_sort_with_data);
|
||||||
|
g_test_add_func ("/bytearray/new-take", byte_array_new_take);
|
||||||
|
+ g_test_add_func ("/bytearray/new-take-overflow", byte_array_new_take_overflow);
|
||||||
|
g_test_add_func ("/bytearray/free-to-bytes", byte_array_free_to_bytes);
|
||||||
|
|
||||||
|
return g_test_run ();
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
@ -0,0 +1,54 @@
|
|||||||
|
From c74177337dae7b06383261b2bedabf1f12d816b5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Sebastian Wilhelmi <wilhelmi@google.com>
|
||||||
|
Date: Thu, 6 Jan 2022 20:57:49 +0000
|
||||||
|
Subject: [PATCH] gdbusmessage: Disallow zero-length elements in arrays
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
They are not allowed in the specification, and can lead to infinite
|
||||||
|
loops when parsing.
|
||||||
|
|
||||||
|
That鈥檚 a security issue if your application is accepting D-Bus messages
|
||||||
|
from untrusted peers (perhaps in a peer-to-peer connection). It鈥檚 not
|
||||||
|
exploitable when your application is connected to a bus (such as the
|
||||||
|
system or session buses), as the bus daemons (dbus-daemon or
|
||||||
|
dbus-broker) filter out such broken messages and don鈥檛 forward them.
|
||||||
|
|
||||||
|
Arrays of zero-length elements are disallowed in the D-Bus
|
||||||
|
specification: https://dbus.freedesktop.org/doc/dbus-specification.html#container-types
|
||||||
|
|
||||||
|
oss-fuzz#41428, #41435
|
||||||
|
Fixes: #2557
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/c74177337dae7b06383261b2bedabf1f12d816b5
|
||||||
|
|
||||||
|
---
|
||||||
|
gio/gdbusmessage.c | 10 ++++++++++
|
||||||
|
1 file changed, 10 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/gio/gdbusmessage.c b/gio/gdbusmessage.c
|
||||||
|
index 4056bc2c4a..ecef6cd3c5 100644
|
||||||
|
--- a/gio/gdbusmessage.c
|
||||||
|
+++ b/gio/gdbusmessage.c
|
||||||
|
@@ -1839,6 +1839,16 @@ parse_value_from_blob (GMemoryBuffer *buf,
|
||||||
|
}
|
||||||
|
g_variant_builder_add_value (&builder, item);
|
||||||
|
g_variant_unref (item);
|
||||||
|
+
|
||||||
|
+ /* Array elements must not be zero-length. There are no
|
||||||
|
+ * valid zero-length serialisations of any types which
|
||||||
|
+ * can be array elements in the D-Bus wire format, so this
|
||||||
|
+ * assertion should always hold.
|
||||||
|
+ *
|
||||||
|
+ * See https://gitlab.gnome.org/GNOME/glib/-/issues/2557
|
||||||
|
+ */
|
||||||
|
+ g_assert (buf->pos > (gsize) offset);
|
||||||
|
+
|
||||||
|
offset = buf->pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
@ -0,0 +1,31 @@
|
|||||||
|
From 7143457076d6469f76185a2f1d7071aca40a591e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Philip Withnall <pwithnall@endlessos.org>
|
||||||
|
Date: Thu, 17 Mar 2022 19:03:15 +0000
|
||||||
|
Subject: [PATCH] gdbusmethodinvocation: Drop redundant quote from warning
|
||||||
|
message
|
||||||
|
|
||||||
|
Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/7143457076d6469f76185a2f1d7071aca40a591e
|
||||||
|
|
||||||
|
---
|
||||||
|
gio/gdbusmethodinvocation.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/gio/gdbusmethodinvocation.c b/gio/gdbusmethodinvocation.c
|
||||||
|
index 8e7abc83c4..705af079f4 100644
|
||||||
|
--- a/gio/gdbusmethodinvocation.c
|
||||||
|
+++ b/gio/gdbusmethodinvocation.c
|
||||||
|
@@ -413,7 +413,7 @@ g_dbus_method_invocation_return_value_internal (GDBusMethodInvocation *invocatio
|
||||||
|
{
|
||||||
|
gchar *type_string = g_variant_type_dup_string (type);
|
||||||
|
|
||||||
|
- g_warning ("Type of return value is incorrect: expected '%s', got '%s''",
|
||||||
|
+ g_warning ("Type of return value is incorrect: expected '%s', got '%s'",
|
||||||
|
type_string, g_variant_get_type_string (parameters));
|
||||||
|
g_variant_type_free (type);
|
||||||
|
g_free (type_string);
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
@ -0,0 +1,67 @@
|
|||||||
|
From a3b8846e54c7132056411605f815b67e831833d2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Philip Withnall <pwithnall@endlessos.org>
|
||||||
|
Date: Thu, 17 Mar 2022 19:04:42 +0000
|
||||||
|
Subject: [PATCH] gdbusmethodinvocation: Fix a leak on an early return path
|
||||||
|
|
||||||
|
When doing an early return from `g_dbus_method_invocation_return_*()`
|
||||||
|
due to passing in the wrong type (or no return value when one was
|
||||||
|
expected), the parameters were not correctly sunk and were leaked.
|
||||||
|
|
||||||
|
Fix that. A unit test will be added in a following commit.
|
||||||
|
|
||||||
|
Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
|
||||||
|
|
||||||
|
Coverity CID: #1474536
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/a3b8846e54c7132056411605f815b67e831833d2
|
||||||
|
|
||||||
|
---
|
||||||
|
gio/gdbusmethodinvocation.c | 17 ++++++++---------
|
||||||
|
1 file changed, 8 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/gio/gdbusmethodinvocation.c b/gio/gdbusmethodinvocation.c
|
||||||
|
index c22e19ef0d..c15d83ec84 100644
|
||||||
|
--- a/gio/gdbusmethodinvocation.c
|
||||||
|
+++ b/gio/gdbusmethodinvocation.c
|
||||||
|
@@ -397,14 +397,7 @@ g_dbus_method_invocation_return_value_internal (GDBusMethodInvocation *invocatio
|
||||||
|
g_return_if_fail ((parameters == NULL) || g_variant_is_of_type (parameters, G_VARIANT_TYPE_TUPLE));
|
||||||
|
|
||||||
|
if (g_dbus_message_get_flags (invocation->message) & G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED)
|
||||||
|
- {
|
||||||
|
- if (parameters != NULL)
|
||||||
|
- {
|
||||||
|
- g_variant_ref_sink (parameters);
|
||||||
|
- g_variant_unref (parameters);
|
||||||
|
- }
|
||||||
|
- goto out;
|
||||||
|
- }
|
||||||
|
+ goto out;
|
||||||
|
|
||||||
|
if (parameters == NULL)
|
||||||
|
parameters = g_variant_new_tuple (NULL, 0);
|
||||||
|
@@ -508,7 +501,7 @@ g_dbus_method_invocation_return_value_internal (GDBusMethodInvocation *invocatio
|
||||||
|
}
|
||||||
|
|
||||||
|
reply = g_dbus_message_new_method_reply (invocation->message);
|
||||||
|
- g_dbus_message_set_body (reply, parameters);
|
||||||
|
+ g_dbus_message_set_body (reply, g_steal_pointer (¶meters));
|
||||||
|
|
||||||
|
#ifdef G_OS_UNIX
|
||||||
|
if (fd_list != NULL)
|
||||||
|
@@ -525,6 +518,12 @@ g_dbus_method_invocation_return_value_internal (GDBusMethodInvocation *invocatio
|
||||||
|
g_object_unref (reply);
|
||||||
|
|
||||||
|
out:
|
||||||
|
+ if (parameters != NULL)
|
||||||
|
+ {
|
||||||
|
+ g_variant_ref_sink (parameters);
|
||||||
|
+ g_variant_unref (parameters);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
g_object_unref (invocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
@ -0,0 +1,82 @@
|
|||||||
|
From 76f5460107c86a44be6387c159b34ae50aa1e623 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Philip Withnall <pwithnall@endlessos.org>
|
||||||
|
Date: Thu, 17 Mar 2022 18:32:46 +0000
|
||||||
|
Subject: [PATCH] gdbusmethodinvocation: Fix dead code for type checking GetAll
|
||||||
|
|
||||||
|
`property_info` is only ever set for `Get` and `Set` calls, not for
|
||||||
|
`GetAll`, as it only represents a single property. So this code was
|
||||||
|
never reachable.
|
||||||
|
|
||||||
|
Move it out so that it is reachable.
|
||||||
|
|
||||||
|
Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/76f5460107c86a44be6387c159b34ae50aa1e623
|
||||||
|
|
||||||
|
---
|
||||||
|
gio/gdbusmethodinvocation.c | 34 ++++++++++++++++++----------------
|
||||||
|
1 file changed, 18 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/gio/gdbusmethodinvocation.c b/gio/gdbusmethodinvocation.c
|
||||||
|
index c15d83ec84..8e7abc83c4 100644
|
||||||
|
--- a/gio/gdbusmethodinvocation.c
|
||||||
|
+++ b/gio/gdbusmethodinvocation.c
|
||||||
|
@@ -424,7 +424,9 @@ g_dbus_method_invocation_return_value_internal (GDBusMethodInvocation *invocatio
|
||||||
|
|
||||||
|
/* property_info is only non-NULL if set that way from
|
||||||
|
* GDBusConnection, so this must be the case of async property
|
||||||
|
- * handling on either 'Get', 'Set' or 'GetAll'.
|
||||||
|
+ * handling on either 'Get' or 'Set'.
|
||||||
|
+ *
|
||||||
|
+ * property_info is NULL for 'GetAll'.
|
||||||
|
*/
|
||||||
|
if (invocation->property_info != NULL)
|
||||||
|
{
|
||||||
|
@@ -454,21 +456,6 @@ g_dbus_method_invocation_return_value_internal (GDBusMethodInvocation *invocatio
|
||||||
|
g_variant_unref (nested);
|
||||||
|
}
|
||||||
|
|
||||||
|
- else if (g_str_equal (invocation->method_name, "GetAll"))
|
||||||
|
- {
|
||||||
|
- if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(a{sv})")))
|
||||||
|
- {
|
||||||
|
- g_warning ("Type of return value for property 'GetAll' call should be '(a{sv})' but got '%s'",
|
||||||
|
- g_variant_get_type_string (parameters));
|
||||||
|
- goto out;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /* Could iterate the list of properties and make sure that all
|
||||||
|
- * of them are actually on the interface and with the correct
|
||||||
|
- * types, but let's not do that for now...
|
||||||
|
- */
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
else if (g_str_equal (invocation->method_name, "Set"))
|
||||||
|
{
|
||||||
|
if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE_UNIT))
|
||||||
|
@@ -482,6 +469,21 @@ g_dbus_method_invocation_return_value_internal (GDBusMethodInvocation *invocatio
|
||||||
|
else
|
||||||
|
g_assert_not_reached ();
|
||||||
|
}
|
||||||
|
+ else if (g_str_equal (invocation->interface_name, "org.freedesktop.DBus.Properties") &&
|
||||||
|
+ g_str_equal (invocation->method_name, "GetAll"))
|
||||||
|
+ {
|
||||||
|
+ if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(a{sv})")))
|
||||||
|
+ {
|
||||||
|
+ g_warning ("Type of return value for property 'GetAll' call should be '(a{sv})' but got '%s'",
|
||||||
|
+ g_variant_get_type_string (parameters));
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Could iterate the list of properties and make sure that all
|
||||||
|
+ * of them are actually on the interface and with the correct
|
||||||
|
+ * types, but let's not do that for now...
|
||||||
|
+ */
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (G_UNLIKELY (_g_dbus_debug_return ()))
|
||||||
|
{
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
73
backport-gio-tool-Fix-a-minor-memory-leak.patch
Normal file
73
backport-gio-tool-Fix-a-minor-memory-leak.patch
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
From 49cc9b96f4c19a98ddf6e9b7417c7019ebc28ca3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Philip Withnall <pwithnall@endlessos.org>
|
||||||
|
Date: Wed, 27 Apr 2022 15:01:08 +0100
|
||||||
|
Subject: [PATCH] gio-tool: Fix a minor memory leak when using gio-set with
|
||||||
|
bytestrings
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Tested using:
|
||||||
|
```sh
|
||||||
|
touch ~/foo
|
||||||
|
gio set ~/foo -t bytestring user::test "\x00\x00"
|
||||||
|
```
|
||||||
|
(it doesn鈥檛 matter that this fails; the bytestring is still decoded)
|
||||||
|
|
||||||
|
Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
|
||||||
|
|
||||||
|
Coverity CID: #1474407
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/49cc9b96f4c19a98ddf6e9b7417c7019ebc28ca3
|
||||||
|
|
||||||
|
---
|
||||||
|
gio/gio-tool-set.c | 10 ++++++----
|
||||||
|
1 file changed, 6 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/gio/gio-tool-set.c b/gio/gio-tool-set.c
|
||||||
|
index 4dbe1214ff..c2a9431f61 100644
|
||||||
|
--- a/gio/gio-tool-set.c
|
||||||
|
+++ b/gio/gio-tool-set.c
|
||||||
|
@@ -76,12 +76,14 @@ handle_set (int argc, char *argv[], gboolean do_help)
|
||||||
|
const char *attribute;
|
||||||
|
GFileAttributeType type;
|
||||||
|
gpointer value;
|
||||||
|
+ gpointer value_allocated = NULL;
|
||||||
|
gboolean b;
|
||||||
|
guint32 uint32;
|
||||||
|
gint32 int32;
|
||||||
|
guint64 uint64;
|
||||||
|
gint64 int64;
|
||||||
|
gchar *param;
|
||||||
|
+ int retval = 0;
|
||||||
|
|
||||||
|
g_set_prgname ("gio set");
|
||||||
|
|
||||||
|
@@ -147,7 +149,7 @@ handle_set (int argc, char *argv[], gboolean do_help)
|
||||||
|
value = argv[3];
|
||||||
|
break;
|
||||||
|
case G_FILE_ATTRIBUTE_TYPE_BYTE_STRING:
|
||||||
|
- value = hex_unescape (argv[3]);
|
||||||
|
+ value = value_allocated = hex_unescape (argv[3]);
|
||||||
|
break;
|
||||||
|
case G_FILE_ATTRIBUTE_TYPE_BOOLEAN:
|
||||||
|
b = g_ascii_strcasecmp (argv[3], "true") == 0;
|
||||||
|
@@ -194,11 +196,11 @@ handle_set (int argc, char *argv[], gboolean do_help)
|
||||||
|
{
|
||||||
|
print_error ("%s", error->message);
|
||||||
|
g_error_free (error);
|
||||||
|
- g_object_unref (file);
|
||||||
|
- return 1;
|
||||||
|
+ retval = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ g_clear_pointer (&value_allocated, g_free);
|
||||||
|
g_object_unref (file);
|
||||||
|
|
||||||
|
- return 0;
|
||||||
|
+ return retval;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
@ -0,0 +1,39 @@
|
|||||||
|
From 969eb835dc2f07c34ae8ca45ddbc41590a2e2f8e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Philip Withnall <pwithnall@endlessos.org>
|
||||||
|
Date: Thu, 28 Apr 2022 10:56:10 +0100
|
||||||
|
Subject: [PATCH] gopenuriportal: Fix a use-after-free on an error path
|
||||||
|
|
||||||
|
`path` was used in building the error message after it had been freed.
|
||||||
|
Spotted by scan-build.
|
||||||
|
|
||||||
|
Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
|
||||||
|
|
||||||
|
Helps: #1767
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/969eb835dc2f07c34ae8ca45ddbc41590a2e2f8e
|
||||||
|
|
||||||
|
---
|
||||||
|
gio/gopenuriportal.c | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/gio/gopenuriportal.c b/gio/gopenuriportal.c
|
||||||
|
index 6ef8f037c3..2f527d8289 100644
|
||||||
|
--- a/gio/gopenuriportal.c
|
||||||
|
+++ b/gio/gopenuriportal.c
|
||||||
|
@@ -108,10 +108,10 @@ g_openuri_portal_open_uri (const char *uri,
|
||||||
|
errsv = errno;
|
||||||
|
if (fd == -1)
|
||||||
|
{
|
||||||
|
- g_free (path);
|
||||||
|
- g_variant_builder_clear (&opt_builder);
|
||||||
|
g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errsv),
|
||||||
|
"Failed to open '%s'", path);
|
||||||
|
+ g_free (path);
|
||||||
|
+ g_variant_builder_clear (&opt_builder);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
@ -0,0 +1,39 @@
|
|||||||
|
From 7329c6e09bf59ccae2d8d3e788ce43bb6af6c3db Mon Sep 17 00:00:00 2001
|
||||||
|
From: Philip Withnall <pwithnall@endlessos.org>
|
||||||
|
Date: Wed, 9 Mar 2022 14:07:34 +0000
|
||||||
|
Subject: [PATCH] gprintf: Fix a memory leak with an invalid format in
|
||||||
|
g_vasprintf()
|
||||||
|
|
||||||
|
If using the fallback implementation of `g_vasprintf()`.
|
||||||
|
|
||||||
|
Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
|
||||||
|
|
||||||
|
Coverity CID: #1474726
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/7329c6e09bf59ccae2d8d3e788ce43bb6af6c3db
|
||||||
|
|
||||||
|
---
|
||||||
|
glib/gprintf.c | 6 ++++++
|
||||||
|
1 file changed, 6 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/glib/gprintf.c b/glib/gprintf.c
|
||||||
|
index 555a630bc2..0e094f00fa 100644
|
||||||
|
--- a/glib/gprintf.c
|
||||||
|
+++ b/glib/gprintf.c
|
||||||
|
@@ -356,6 +356,12 @@ g_vasprintf (gchar **string,
|
||||||
|
|
||||||
|
len = _g_vsprintf (*string, format, args2);
|
||||||
|
va_end (args2);
|
||||||
|
+
|
||||||
|
+ if (len < 0)
|
||||||
|
+ {
|
||||||
|
+ g_free (*string);
|
||||||
|
+ *string = NULL;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
@ -0,0 +1,76 @@
|
|||||||
|
From 36f7684d56c5d6182398b5db992c1e81ef6cb2f5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rozhuk Ivan <rozhuk.im@gmail.com>
|
||||||
|
Date: Sun, 18 Oct 2020 03:06:46 +0300
|
||||||
|
Subject: [PATCH] gunixmounts: Add cache to g_unix_mount_points_get()
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
`_g_get_unix_mount_points()` parses `/etc/fstab` every time it’s called,
|
||||||
|
so caching the result can improve performance when mounts are queried
|
||||||
|
frequently.
|
||||||
|
|
||||||
|
The cache will remain in memory until `/etc/fstab` is next modified.
|
||||||
|
This means that the final copy of the cache will be deliberately
|
||||||
|
‘leaked’ on process exit.
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/36f7684d56c5d6182398b5db992c1e81ef6cb2f5
|
||||||
|
|
||||||
|
---
|
||||||
|
gio/gunixmounts.c | 31 +++++++++++++++++++++++++++++--
|
||||||
|
1 file changed, 29 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/gio/gunixmounts.c b/gio/gunixmounts.c
|
||||||
|
index ecfa61de86..9c8ef5d666 100644
|
||||||
|
--- a/gio/gunixmounts.c
|
||||||
|
+++ b/gio/gunixmounts.c
|
||||||
|
@@ -1666,6 +1666,14 @@ g_unix_mount_for (const char *file_path,
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static gpointer
|
||||||
|
+copy_mount_point_cb (gconstpointer src,
|
||||||
|
+ gpointer data)
|
||||||
|
+{
|
||||||
|
+ GUnixMountPoint *src_mount_point = (GUnixMountPoint *) src;
|
||||||
|
+ return g_unix_mount_point_copy (src_mount_point);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* g_unix_mount_points_get:
|
||||||
|
* @time_read: (out) (optional): guint64 to contain a timestamp.
|
||||||
|
@@ -1681,10 +1689,29 @@ g_unix_mount_for (const char *file_path,
|
||||||
|
GList *
|
||||||
|
g_unix_mount_points_get (guint64 *time_read)
|
||||||
|
{
|
||||||
|
+ static GList *mnt_pts_last = NULL;
|
||||||
|
+ static guint64 time_read_last = 0;
|
||||||
|
+ GList *mnt_pts = NULL;
|
||||||
|
+ guint64 time_read_now;
|
||||||
|
+ G_LOCK_DEFINE_STATIC (unix_mount_points);
|
||||||
|
+
|
||||||
|
+ G_LOCK (unix_mount_points);
|
||||||
|
+
|
||||||
|
+ time_read_now = get_mount_points_timestamp ();
|
||||||
|
+ if (time_read_now != time_read_last || mnt_pts_last == NULL)
|
||||||
|
+ {
|
||||||
|
+ time_read_last = time_read_now;
|
||||||
|
+ g_list_free_full (mnt_pts_last, (GDestroyNotify) g_unix_mount_point_free);
|
||||||
|
+ mnt_pts_last = _g_get_unix_mount_points ();
|
||||||
|
+ }
|
||||||
|
+ mnt_pts = g_list_copy_deep (mnt_pts_last, copy_mount_point_cb, NULL);
|
||||||
|
+
|
||||||
|
+ G_UNLOCK (unix_mount_points);
|
||||||
|
+
|
||||||
|
if (time_read)
|
||||||
|
- *time_read = get_mount_points_timestamp ();
|
||||||
|
+ *time_read = time_read_now;
|
||||||
|
|
||||||
|
- return _g_get_unix_mount_points ();
|
||||||
|
+ return mnt_pts;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
@ -0,0 +1,97 @@
|
|||||||
|
From 9adbdd45d7101405eb05487bdf6a2015af9f8afd Mon Sep 17 00:00:00 2001
|
||||||
|
From: Chen Guanqiao <chen.chenchacha@foxmail.com>
|
||||||
|
Date: Thu, 11 Nov 2021 01:04:38 +0800
|
||||||
|
Subject: [PATCH] gutf8: add string length check when ending character offset
|
||||||
|
is -1
|
||||||
|
|
||||||
|
Some function such as atk_text_get_text, use -1 to indicate the end of the
|
||||||
|
string. And an crash occurs when the -1 is passed to g_utf8_substring.
|
||||||
|
|
||||||
|
Call Trace:
|
||||||
|
0 __memmove_avx_unaligned_erms
|
||||||
|
1 memcpy
|
||||||
|
2 g_utf8_substring
|
||||||
|
3 impl_GetText
|
||||||
|
4 handle_other
|
||||||
|
5 handle_message
|
||||||
|
6 _dbus_object_tree_dispatch_and_unlock
|
||||||
|
7 dbus_connection_dispatch
|
||||||
|
8 dbus_connection_dispatch
|
||||||
|
9 ()
|
||||||
|
10 g_main_dispatch
|
||||||
|
11 g_main_context_dispatch
|
||||||
|
12 g_main_context_iterate
|
||||||
|
13 g_main_context_iteration
|
||||||
|
14 g_application_run
|
||||||
|
15 main
|
||||||
|
|
||||||
|
Signed-off-by: Chen Guanqiao <chen.chenchacha@foxmail.com>
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/9adbdd45d7101405eb05487bdf6a2015af9f8afd
|
||||||
|
|
||||||
|
---
|
||||||
|
glib/gutf8.c | 19 +++++++++++++++++--
|
||||||
|
glib/tests/utf8-misc.c | 4 ++++
|
||||||
|
2 files changed, 21 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/glib/gutf8.c b/glib/gutf8.c
|
||||||
|
index 7d053540d6..9097f690b3 100644
|
||||||
|
--- a/glib/gutf8.c
|
||||||
|
+++ b/glib/gutf8.c
|
||||||
|
@@ -271,11 +271,15 @@ g_utf8_strlen (const gchar *p,
|
||||||
|
* g_utf8_substring:
|
||||||
|
* @str: a UTF-8 encoded string
|
||||||
|
* @start_pos: a character offset within @str
|
||||||
|
- * @end_pos: another character offset within @str
|
||||||
|
+ * @end_pos: another character offset within @str,
|
||||||
|
+ * or `-1` to indicate the end of the string
|
||||||
|
*
|
||||||
|
* Copies a substring out of a UTF-8 encoded string.
|
||||||
|
* The substring will contain @end_pos - @start_pos characters.
|
||||||
|
*
|
||||||
|
+ * Since GLib 2.72, `-1` can be passed to @end_pos to indicate the
|
||||||
|
+ * end of the string.
|
||||||
|
+ *
|
||||||
|
* Returns: (transfer full): a newly allocated copy of the requested
|
||||||
|
* substring. Free with g_free() when no longer needed.
|
||||||
|
*
|
||||||
|
@@ -288,8 +292,19 @@ g_utf8_substring (const gchar *str,
|
||||||
|
{
|
||||||
|
gchar *start, *end, *out;
|
||||||
|
|
||||||
|
+ g_return_val_if_fail (end_pos >= start_pos || end_pos == -1, NULL);
|
||||||
|
+
|
||||||
|
start = g_utf8_offset_to_pointer (str, start_pos);
|
||||||
|
- end = g_utf8_offset_to_pointer (start, end_pos - start_pos);
|
||||||
|
+
|
||||||
|
+ if (end_pos == -1)
|
||||||
|
+ {
|
||||||
|
+ glong length = g_utf8_strlen (start, -1);
|
||||||
|
+ end = g_utf8_offset_to_pointer (start, length);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ end = g_utf8_offset_to_pointer (start, end_pos - start_pos);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
out = g_malloc (end - start + 1);
|
||||||
|
memcpy (out, start, end - start);
|
||||||
|
diff --git a/glib/tests/utf8-misc.c b/glib/tests/utf8-misc.c
|
||||||
|
index 7a8c37448b..c137294229 100644
|
||||||
|
--- a/glib/tests/utf8-misc.c
|
||||||
|
+++ b/glib/tests/utf8-misc.c
|
||||||
|
@@ -128,6 +128,10 @@ test_utf8_substring (void)
|
||||||
|
r = g_utf8_substring ("abc\xe2\x82\xa0gh\xe2\x82\xa4", 2, 5);
|
||||||
|
g_assert_cmpstr (r, ==, "c\xe2\x82\xa0g");
|
||||||
|
g_free (r);
|
||||||
|
+
|
||||||
|
+ r = g_utf8_substring ("abcd", 1, -1);
|
||||||
|
+ g_assert_cmpstr (r, ==, "bcd");
|
||||||
|
+ g_free (r);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
@ -0,0 +1,42 @@
|
|||||||
|
From 78dc1cc3cd669e9fb92ae7847bab2b308c0a8628 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christoph Niethammer <christoph.niethammer@gmail.com>
|
||||||
|
Date: Thu, 27 Jan 2022 03:54:01 +0100
|
||||||
|
Subject: [PATCH] gutils: Fix g_find_program_in_path() to return an absolute
|
||||||
|
path
|
||||||
|
|
||||||
|
Fix a possibility of returning a relative path, in case PATH contains
|
||||||
|
a relative path. According to the doc, the function should return an
|
||||||
|
absolute path.
|
||||||
|
|
||||||
|
Signed-off-by: Christoph Niethammer <christoph.niethammer@gmail.com>
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/78dc1cc3cd669e9fb92ae7847bab2b308c0a8628
|
||||||
|
|
||||||
|
---
|
||||||
|
glib/gutils.c | 9 ++++++++-
|
||||||
|
1 file changed, 8 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/glib/gutils.c b/glib/gutils.c
|
||||||
|
index 6652d0ba05..6cc4506073 100644
|
||||||
|
--- a/glib/gutils.c
|
||||||
|
+++ b/glib/gutils.c
|
||||||
|
@@ -456,7 +456,14 @@ g_find_program_in_path (const gchar *program)
|
||||||
|
!g_file_test (startp, G_FILE_TEST_IS_DIR))
|
||||||
|
{
|
||||||
|
gchar *ret;
|
||||||
|
- ret = g_strdup (startp);
|
||||||
|
+ if (g_path_is_absolute (startp)) {
|
||||||
|
+ ret = g_strdup (startp);
|
||||||
|
+ } else {
|
||||||
|
+ gchar *cwd = NULL;
|
||||||
|
+ cwd = g_get_current_dir ();
|
||||||
|
+ ret = g_build_filename (cwd, startp, NULL);
|
||||||
|
+ g_free (cwd);
|
||||||
|
+ }
|
||||||
|
g_free (freeme);
|
||||||
|
#ifdef G_OS_WIN32
|
||||||
|
g_free ((gchar *) path_copy);
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
@ -0,0 +1,55 @@
|
|||||||
|
From 77233f6f0779fe0c1cb48861d7deded4ae413567 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Sebastian Wilhelmi <wilhelmi@google.com>
|
||||||
|
Date: Thu, 6 Jan 2022 20:50:34 +0000
|
||||||
|
Subject: [PATCH] gvariant-serialiser: Prevent unbounded recursion in
|
||||||
|
is_normal()
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
This fixes a bug in 7c4e6e9fbe473de0401c778c6b0c4aad27d5145a.
|
||||||
|
|
||||||
|
The original approach in that commit accidentally only checked the depth
|
||||||
|
at the leaf nodes in the variant tree, whereas actually the depth should
|
||||||
|
be checked before recursing to avoid stack overflow.
|
||||||
|
|
||||||
|
It neglected to consider that `g_variant_serialised_is_normal()` would
|
||||||
|
be recursed into by some of the `DISPATCH(_is_normal)` cases. When that
|
||||||
|
happened, the depth check was after the recursion so couldn鈥檛 prevent a
|
||||||
|
stack overflow.
|
||||||
|
|
||||||
|
Fixes: #2572
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/77233f6f0779fe0c1cb48861d7deded4ae413567
|
||||||
|
|
||||||
|
---
|
||||||
|
glib/gvariant-serialiser.c | 5 +++--
|
||||||
|
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/glib/gvariant-serialiser.c b/glib/gvariant-serialiser.c
|
||||||
|
index 832a8fdc2a..7b13381b6f 100644
|
||||||
|
--- a/glib/gvariant-serialiser.c
|
||||||
|
+++ b/glib/gvariant-serialiser.c
|
||||||
|
@@ -1587,6 +1587,9 @@ g_variant_serialised_byteswap (GVariantSerialised serialised)
|
||||||
|
gboolean
|
||||||
|
g_variant_serialised_is_normal (GVariantSerialised serialised)
|
||||||
|
{
|
||||||
|
+ if (serialised.depth >= G_VARIANT_MAX_RECURSION_DEPTH)
|
||||||
|
+ return FALSE;
|
||||||
|
+
|
||||||
|
DISPATCH_CASES (serialised.type_info,
|
||||||
|
|
||||||
|
return gvs_/**/,/**/_is_normal (serialised);
|
||||||
|
@@ -1595,8 +1598,6 @@ g_variant_serialised_is_normal (GVariantSerialised serialised)
|
||||||
|
|
||||||
|
if (serialised.data == NULL)
|
||||||
|
return FALSE;
|
||||||
|
- if (serialised.depth >= G_VARIANT_MAX_RECURSION_DEPTH)
|
||||||
|
- return FALSE;
|
||||||
|
|
||||||
|
/* some hard-coded terminal cases */
|
||||||
|
switch (g_variant_type_info_get_type_char (serialised.type_info))
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
@ -0,0 +1,77 @@
|
|||||||
|
From d6ad10404f1d61d83803336ba5b64ec0bfd07da8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Philip Withnall <pwithnall@endlessos.org>
|
||||||
|
Date: Wed, 9 Mar 2022 14:09:57 +0000
|
||||||
|
Subject: [PATCH] tests: Add some tests for g_string_append_vprintf()
|
||||||
|
|
||||||
|
This adds coverage of one previously uncovered branch in `gstring.c`.
|
||||||
|
Real progress!
|
||||||
|
|
||||||
|
Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/d6ad10404f1d61d83803336ba5b64ec0bfd07da8
|
||||||
|
|
||||||
|
---
|
||||||
|
glib/tests/string.c | 39 +++++++++++++++++++++++++++++++++++++++
|
||||||
|
1 file changed, 39 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/glib/tests/string.c b/glib/tests/string.c
|
||||||
|
index 24098d1be6..0229099e79 100644
|
||||||
|
--- a/glib/tests/string.c
|
||||||
|
+++ b/glib/tests/string.c
|
||||||
|
@@ -215,6 +215,44 @@ test_string_append (void)
|
||||||
|
g_string_free (string, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void string_append_vprintf_va (GString *string,
|
||||||
|
+ const gchar *format,
|
||||||
|
+ ...) G_GNUC_PRINTF (2, 3);
|
||||||
|
+
|
||||||
|
+/* Wrapper around g_string_append_vprintf() which takes varargs */
|
||||||
|
+static void
|
||||||
|
+string_append_vprintf_va (GString *string,
|
||||||
|
+ const gchar *format,
|
||||||
|
+ ...)
|
||||||
|
+{
|
||||||
|
+ va_list args;
|
||||||
|
+
|
||||||
|
+ va_start (args, format);
|
||||||
|
+ g_string_append_vprintf (string, format, args);
|
||||||
|
+ va_end (args);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+test_string_append_vprintf (void)
|
||||||
|
+{
|
||||||
|
+ GString *string;
|
||||||
|
+
|
||||||
|
+ /* append */
|
||||||
|
+ string = g_string_new ("firsthalf");
|
||||||
|
+
|
||||||
|
+ string_append_vprintf_va (string, "some %s placeholders", "format");
|
||||||
|
+
|
||||||
|
+#pragma GCC diagnostic push
|
||||||
|
+#pragma GCC diagnostic ignored "-Wformat"
|
||||||
|
+#pragma GCC diagnostic ignored "-Wformat-extra-args"
|
||||||
|
+ string_append_vprintf_va (string, "%l", "invalid");
|
||||||
|
+#pragma GCC diagnostic pop
|
||||||
|
+
|
||||||
|
+ g_assert_cmpstr (string->str, ==, "firsthalfsome format placeholders");
|
||||||
|
+
|
||||||
|
+ g_string_free (string, TRUE);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
test_string_prepend_c (void)
|
||||||
|
{
|
||||||
|
@@ -571,6 +609,7 @@ main (int argc,
|
||||||
|
g_test_add_func ("/string/test-string-assign", test_string_assign);
|
||||||
|
g_test_add_func ("/string/test-string-append-c", test_string_append_c);
|
||||||
|
g_test_add_func ("/string/test-string-append", test_string_append);
|
||||||
|
+ g_test_add_func ("/string/test-string-append-vprintf", test_string_append_vprintf);
|
||||||
|
g_test_add_func ("/string/test-string-prepend-c", test_string_prepend_c);
|
||||||
|
g_test_add_func ("/string/test-string-prepend", test_string_prepend);
|
||||||
|
g_test_add_func ("/string/test-string-insert", test_string_insert);
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
@ -0,0 +1,75 @@
|
|||||||
|
From 27e1509cd68e58d9057091eadf97de96165c2bea Mon Sep 17 00:00:00 2001
|
||||||
|
From: Philip Withnall <pwithnall@endlessos.org>
|
||||||
|
Date: Wed, 9 Mar 2022 14:08:49 +0000
|
||||||
|
Subject: [PATCH] tests: Add some tests for g_vasprintf() invalid format
|
||||||
|
strings
|
||||||
|
|
||||||
|
Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/27e1509cd68e58d9057091eadf97de96165c2bea
|
||||||
|
|
||||||
|
---
|
||||||
|
glib/tests/test-printf.c | 40 ++++++++++++++++++++++++++++++++++++++++
|
||||||
|
1 file changed, 40 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/glib/tests/test-printf.c b/glib/tests/test-printf.c
|
||||||
|
index 59a461ddb0..77eb76a4ab 100644
|
||||||
|
--- a/glib/tests/test-printf.c
|
||||||
|
+++ b/glib/tests/test-printf.c
|
||||||
|
@@ -895,6 +895,44 @@ test_upper_bound (void)
|
||||||
|
g_assert_cmpint (res, ==, 20);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static gint test_vasprintf_va (gchar **string,
|
||||||
|
+ const gchar *format,
|
||||||
|
+ ...) G_GNUC_PRINTF (2, 3);
|
||||||
|
+
|
||||||
|
+/* Wrapper around g_vasprintf() which takes varargs */
|
||||||
|
+static gint
|
||||||
|
+test_vasprintf_va (gchar **string,
|
||||||
|
+ const gchar *format,
|
||||||
|
+ ...)
|
||||||
|
+{
|
||||||
|
+ va_list args;
|
||||||
|
+ gint len;
|
||||||
|
+
|
||||||
|
+ va_start (args, format);
|
||||||
|
+ len = g_vasprintf (string, format, args);
|
||||||
|
+ va_end (args);
|
||||||
|
+
|
||||||
|
+ return len;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+test_vasprintf_invalid_format_placeholder (void)
|
||||||
|
+{
|
||||||
|
+ gint len = 0;
|
||||||
|
+ gchar *buf = "some non-null string";
|
||||||
|
+
|
||||||
|
+ g_test_summary ("Test error handling for invalid format placeholder in g_vasprintf()");
|
||||||
|
+
|
||||||
|
+#pragma GCC diagnostic push
|
||||||
|
+#pragma GCC diagnostic ignored "-Wformat"
|
||||||
|
+#pragma GCC diagnostic ignored "-Wformat-extra-args"
|
||||||
|
+ len = test_vasprintf_va (&buf, "%l", "nope");
|
||||||
|
+#pragma GCC diagnostic pop
|
||||||
|
+
|
||||||
|
+ g_assert_cmpint (len, ==, -1);
|
||||||
|
+ g_assert_null (buf);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int
|
||||||
|
main (int argc,
|
||||||
|
char *argv[])
|
||||||
|
@@ -935,5 +973,7 @@ main (int argc,
|
||||||
|
g_test_add_func ("/sprintf/test-positional-params", test_positional_params3);
|
||||||
|
g_test_add_func ("/sprintf/upper-bound", test_upper_bound);
|
||||||
|
|
||||||
|
+ g_test_add_func ("/vasprintf/invalid-format-placeholder", test_vasprintf_invalid_format_placeholder);
|
||||||
|
+
|
||||||
|
return g_test_run();
|
||||||
|
}
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
442
backport-tests-Add-unit-tests-for-GDBusMethodInvocation.patch
Normal file
442
backport-tests-Add-unit-tests-for-GDBusMethodInvocation.patch
Normal file
@ -0,0 +1,442 @@
|
|||||||
|
From a7750cd02004d5e5f2660426b4d6728a604ef1e2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Philip Withnall <pwithnall@endlessos.org>
|
||||||
|
Date: Thu, 17 Mar 2022 19:05:14 +0000
|
||||||
|
Subject: [PATCH] tests: Add unit tests for GDBusMethodInvocation
|
||||||
|
|
||||||
|
These should cover everything to do with returning a value or error from
|
||||||
|
a `GDBusMethodInvocation` object.
|
||||||
|
|
||||||
|
Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/a7750cd02004d5e5f2660426b4d6728a604ef1e2
|
||||||
|
|
||||||
|
---
|
||||||
|
gio/tests/gdbus-method-invocation.c | 402 ++++++++++++++++++++++++++++
|
||||||
|
gio/tests/meson.build | 1 +
|
||||||
|
2 files changed, 403 insertions(+)
|
||||||
|
create mode 100644 gio/tests/gdbus-method-invocation.c
|
||||||
|
|
||||||
|
diff --git a/gio/tests/gdbus-method-invocation.c b/gio/tests/gdbus-method-invocation.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..985fd45ced
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gio/tests/gdbus-method-invocation.c
|
||||||
|
@@ -0,0 +1,402 @@
|
||||||
|
+/* GIO - GLib Input, Output and Streaming Library
|
||||||
|
+ *
|
||||||
|
+ * Copyright © 2022 Endless OS Foundation, LLC
|
||||||
|
+ *
|
||||||
|
+ * This library is free software; you can redistribute it and/or
|
||||||
|
+ * modify it under the terms of the GNU Lesser General Public
|
||||||
|
+ * License as published by the Free Software Foundation; either
|
||||||
|
+ * version 2.1 of the License, or (at your option) any later version.
|
||||||
|
+ *
|
||||||
|
+ * This library is distributed in the hope that it will be useful,
|
||||||
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
+ * Lesser General Public License for more details.
|
||||||
|
+ *
|
||||||
|
+ * You should have received a copy of the GNU Lesser General
|
||||||
|
+ * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
+ *
|
||||||
|
+ * SPDX-License-Identifier: LGPL-2.1-or-later
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <gio/gio.h>
|
||||||
|
+#include <gio/gunixfdlist.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+#include <unistd.h>
|
||||||
|
+
|
||||||
|
+#include "gdbus-tests.h"
|
||||||
|
+
|
||||||
|
+static const GDBusArgInfo foo_get_fds_in_args =
|
||||||
|
+{
|
||||||
|
+ -1,
|
||||||
|
+ "type",
|
||||||
|
+ "s",
|
||||||
|
+ NULL
|
||||||
|
+};
|
||||||
|
+static const GDBusArgInfo * const foo_get_fds_in_arg_pointers[] = {&foo_get_fds_in_args, NULL};
|
||||||
|
+
|
||||||
|
+static const GDBusArgInfo foo_get_fds_out_args =
|
||||||
|
+{
|
||||||
|
+ -1,
|
||||||
|
+ "some_fd",
|
||||||
|
+ "h",
|
||||||
|
+ NULL
|
||||||
|
+};
|
||||||
|
+static const GDBusArgInfo * const foo_get_fds_out_arg_pointers[] = {&foo_get_fds_out_args, NULL};
|
||||||
|
+
|
||||||
|
+static const GDBusMethodInfo foo_method_info_wrong_return_type =
|
||||||
|
+{
|
||||||
|
+ -1,
|
||||||
|
+ "WrongReturnType",
|
||||||
|
+ NULL, /* in args */
|
||||||
|
+ NULL, /* out args */
|
||||||
|
+ NULL /* annotations */
|
||||||
|
+};
|
||||||
|
+static const GDBusMethodInfo foo_method_info_close_before_returning =
|
||||||
|
+{
|
||||||
|
+ -1,
|
||||||
|
+ "CloseBeforeReturning",
|
||||||
|
+ NULL, /* in args */
|
||||||
|
+ NULL, /* out args */
|
||||||
|
+ NULL /* annotations */
|
||||||
|
+};
|
||||||
|
+static const GDBusMethodInfo foo_method_info_get_fds =
|
||||||
|
+{
|
||||||
|
+ -1,
|
||||||
|
+ "GetFDs",
|
||||||
|
+ (GDBusArgInfo **) foo_get_fds_in_arg_pointers,
|
||||||
|
+ (GDBusArgInfo **) foo_get_fds_out_arg_pointers,
|
||||||
|
+ NULL /* annotations */
|
||||||
|
+};
|
||||||
|
+static const GDBusMethodInfo foo_method_info_return_error =
|
||||||
|
+{
|
||||||
|
+ -1,
|
||||||
|
+ "ReturnError",
|
||||||
|
+ NULL, /* in args */
|
||||||
|
+ NULL, /* out args */
|
||||||
|
+ NULL /* annotations */
|
||||||
|
+};
|
||||||
|
+static const GDBusMethodInfo * const foo_method_info_pointers[] = {
|
||||||
|
+ &foo_method_info_wrong_return_type,
|
||||||
|
+ &foo_method_info_close_before_returning,
|
||||||
|
+ &foo_method_info_get_fds,
|
||||||
|
+ &foo_method_info_return_error,
|
||||||
|
+ NULL
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const GDBusPropertyInfo foo_property_info[] =
|
||||||
|
+{
|
||||||
|
+ {
|
||||||
|
+ -1,
|
||||||
|
+ "InvalidType",
|
||||||
|
+ "s",
|
||||||
|
+ G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
|
||||||
|
+ NULL
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ -1,
|
||||||
|
+ "InvalidTypeNull",
|
||||||
|
+ "s",
|
||||||
|
+ G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
|
||||||
|
+ NULL
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ -1,
|
||||||
|
+ "InvalidValueType",
|
||||||
|
+ "s",
|
||||||
|
+ G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
|
||||||
|
+ NULL
|
||||||
|
+ },
|
||||||
|
+};
|
||||||
|
+static const GDBusPropertyInfo * const foo_property_info_pointers[] =
|
||||||
|
+{
|
||||||
|
+ &foo_property_info[0],
|
||||||
|
+ &foo_property_info[1],
|
||||||
|
+ &foo_property_info[2],
|
||||||
|
+ NULL
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const GDBusInterfaceInfo foo_interface_info =
|
||||||
|
+{
|
||||||
|
+ -1,
|
||||||
|
+ "org.example.Foo",
|
||||||
|
+ (GDBusMethodInfo **) &foo_method_info_pointers,
|
||||||
|
+ NULL, /* signals */
|
||||||
|
+ (GDBusPropertyInfo **) &foo_property_info_pointers,
|
||||||
|
+ NULL, /* annotations */
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* ---------------------------------------------------------------------------------------------------- */
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+test_method_invocation_return_method_call (GDBusConnection *connection,
|
||||||
|
+ const gchar *sender,
|
||||||
|
+ const gchar *object_path,
|
||||||
|
+ const gchar *interface_name,
|
||||||
|
+ const gchar *method_name,
|
||||||
|
+ GVariant *parameters,
|
||||||
|
+ GDBusMethodInvocation *invocation,
|
||||||
|
+ gpointer user_data)
|
||||||
|
+{
|
||||||
|
+ gboolean no_reply = g_dbus_message_get_flags (g_dbus_method_invocation_get_message (invocation)) & G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED;
|
||||||
|
+
|
||||||
|
+ if (g_str_equal (interface_name, "org.freedesktop.DBus.Properties") &&
|
||||||
|
+ g_str_equal (method_name, "Get"))
|
||||||
|
+ {
|
||||||
|
+ const gchar *iface_name, *prop_name;
|
||||||
|
+
|
||||||
|
+ g_variant_get (parameters, "(&s&s)", &iface_name, &prop_name);
|
||||||
|
+ g_assert_cmpstr (iface_name, ==, "org.example.Foo");
|
||||||
|
+
|
||||||
|
+ /* Do different things depending on the property name. */
|
||||||
|
+ if (g_str_equal (prop_name, "InvalidType"))
|
||||||
|
+ {
|
||||||
|
+ if (!no_reply)
|
||||||
|
+ g_test_expect_message ("GLib-GIO", G_LOG_LEVEL_WARNING,
|
||||||
|
+ "Type of return value for property 'Get' call should be '(v)' but got '(s)'");
|
||||||
|
+ g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", "this type is invalid"));
|
||||||
|
+ }
|
||||||
|
+ else if (g_str_equal (prop_name, "InvalidTypeNull"))
|
||||||
|
+ {
|
||||||
|
+ if (!no_reply)
|
||||||
|
+ g_test_expect_message ("GLib-GIO", G_LOG_LEVEL_WARNING,
|
||||||
|
+ "Type of return value for property 'Get' call should be '(v)' but got '()'");
|
||||||
|
+ g_dbus_method_invocation_return_value (invocation, NULL);
|
||||||
|
+ }
|
||||||
|
+ else if (g_str_equal (prop_name, "InvalidValueType"))
|
||||||
|
+ {
|
||||||
|
+ if (!no_reply)
|
||||||
|
+ g_test_expect_message ("GLib-GIO", G_LOG_LEVEL_WARNING,
|
||||||
|
+ "Value returned from property 'Get' call for 'InvalidValueType' should be 's' but is 'u'");
|
||||||
|
+ g_dbus_method_invocation_return_value (invocation, g_variant_new ("(v)", g_variant_new_uint32 (123)));
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ g_assert_not_reached ();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ g_test_assert_expected_messages ();
|
||||||
|
+ }
|
||||||
|
+ else if (g_str_equal (interface_name, "org.freedesktop.DBus.Properties") &&
|
||||||
|
+ g_str_equal (method_name, "Set"))
|
||||||
|
+ {
|
||||||
|
+ const gchar *iface_name, *prop_name;
|
||||||
|
+ GVariant *value;
|
||||||
|
+
|
||||||
|
+ g_variant_get (parameters, "(&s&sv)", &iface_name, &prop_name, &value);
|
||||||
|
+ g_assert_cmpstr (iface_name, ==, "org.example.Foo");
|
||||||
|
+
|
||||||
|
+ if (g_str_equal (prop_name, "InvalidType"))
|
||||||
|
+ {
|
||||||
|
+ if (!no_reply)
|
||||||
|
+ g_test_expect_message ("GLib-GIO", G_LOG_LEVEL_WARNING,
|
||||||
|
+ "Type of return value for property 'Set' call should be '()' but got '(s)'");
|
||||||
|
+ g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", "should be unit"));
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ g_assert_not_reached ();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ g_test_assert_expected_messages ();
|
||||||
|
+ g_variant_unref (value);
|
||||||
|
+ }
|
||||||
|
+ else if (g_str_equal (interface_name, "org.freedesktop.DBus.Properties") &&
|
||||||
|
+ g_str_equal (method_name, "GetAll"))
|
||||||
|
+ {
|
||||||
|
+ const gchar *iface_name;
|
||||||
|
+
|
||||||
|
+ g_variant_get (parameters, "(&s)", &iface_name);
|
||||||
|
+ g_assert_cmpstr (iface_name, ==, "org.example.Foo");
|
||||||
|
+
|
||||||
|
+ if (!no_reply)
|
||||||
|
+ g_test_expect_message ("GLib-GIO", G_LOG_LEVEL_WARNING,
|
||||||
|
+ "Type of return value for property 'GetAll' call should be '(a{sv})' but got '(s)'");
|
||||||
|
+ g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", "should be a different type"));
|
||||||
|
+ }
|
||||||
|
+ else if (g_str_equal (interface_name, "org.example.Foo") &&
|
||||||
|
+ g_str_equal (method_name, "WrongReturnType"))
|
||||||
|
+ {
|
||||||
|
+ if (!no_reply)
|
||||||
|
+ g_test_expect_message ("GLib-GIO", G_LOG_LEVEL_WARNING,
|
||||||
|
+ "Type of return value is incorrect: expected '()', got '(s)'");
|
||||||
|
+ g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", "should be a different type"));
|
||||||
|
+ }
|
||||||
|
+ else if (g_str_equal (interface_name, "org.example.Foo") &&
|
||||||
|
+ g_str_equal (method_name, "CloseBeforeReturning"))
|
||||||
|
+ {
|
||||||
|
+ g_dbus_connection_close (connection, NULL, NULL, NULL);
|
||||||
|
+
|
||||||
|
+ g_dbus_method_invocation_return_value (invocation, NULL);
|
||||||
|
+ }
|
||||||
|
+ else if (g_str_equal (interface_name, "org.example.Foo") &&
|
||||||
|
+ g_str_equal (method_name, "GetFDs"))
|
||||||
|
+ {
|
||||||
|
+ const gchar *action;
|
||||||
|
+ GUnixFDList *list = NULL;
|
||||||
|
+ GError *local_error = NULL;
|
||||||
|
+
|
||||||
|
+ g_variant_get (parameters, "(&s)", &action);
|
||||||
|
+
|
||||||
|
+ list = g_unix_fd_list_new ();
|
||||||
|
+ g_unix_fd_list_append (list, 1, &local_error);
|
||||||
|
+ g_assert_no_error (local_error);
|
||||||
|
+
|
||||||
|
+ if (g_str_equal (action, "WrongNumber"))
|
||||||
|
+ {
|
||||||
|
+ g_unix_fd_list_append (list, 1, &local_error);
|
||||||
|
+ g_assert_no_error (local_error);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (g_str_equal (action, "Valid") ||
|
||||||
|
+ g_str_equal (action, "WrongNumber"))
|
||||||
|
+ g_dbus_method_invocation_return_value_with_unix_fd_list (invocation, g_variant_new ("(h)"), list);
|
||||||
|
+ else
|
||||||
|
+ g_assert_not_reached ();
|
||||||
|
+
|
||||||
|
+ g_object_unref (list);
|
||||||
|
+ }
|
||||||
|
+ else if (g_str_equal (interface_name, "org.example.Foo") &&
|
||||||
|
+ g_str_equal (method_name, "ReturnError"))
|
||||||
|
+ {
|
||||||
|
+ g_dbus_method_invocation_return_dbus_error (invocation, "org.example.Foo", "SomeError");
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ g_assert_not_reached ();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+ensure_result_cb (GObject *source,
|
||||||
|
+ GAsyncResult *result,
|
||||||
|
+ gpointer user_data)
|
||||||
|
+{
|
||||||
|
+ GDBusConnection *connection = G_DBUS_CONNECTION (source);
|
||||||
|
+ GVariant *reply;
|
||||||
|
+ guint *n_outstanding_calls = user_data;
|
||||||
|
+
|
||||||
|
+ reply = g_dbus_connection_call_finish (connection, result, NULL);
|
||||||
|
+
|
||||||
|
+ /* We don鈥檛 care what the reply is. */
|
||||||
|
+ g_clear_pointer (&reply, g_variant_unref);
|
||||||
|
+
|
||||||
|
+ g_assert_cmpint (*n_outstanding_calls, >, 0);
|
||||||
|
+ *n_outstanding_calls = *n_outstanding_calls - 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+test_method_invocation_return (void)
|
||||||
|
+{
|
||||||
|
+ GDBusConnection *connection = NULL;
|
||||||
|
+ GError *local_error = NULL;
|
||||||
|
+ guint registration_id;
|
||||||
|
+ const GDBusInterfaceVTable vtable = {
|
||||||
|
+ test_method_invocation_return_method_call, NULL, NULL, { 0 }
|
||||||
|
+ };
|
||||||
|
+ guint n_outstanding_calls = 0;
|
||||||
|
+
|
||||||
|
+ g_test_summary ("Test calling g_dbus_method_invocation_return_*() in various ways");
|
||||||
|
+
|
||||||
|
+ /* Connect to the bus. */
|
||||||
|
+ connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &local_error);
|
||||||
|
+ g_assert_no_error (local_error);
|
||||||
|
+ g_assert_nonnull (connection);
|
||||||
|
+
|
||||||
|
+ /* Register an object which we can call methods on. */
|
||||||
|
+ registration_id = g_dbus_connection_register_object (connection,
|
||||||
|
+ "/foo",
|
||||||
|
+ (GDBusInterfaceInfo *) &foo_interface_info,
|
||||||
|
+ &vtable, NULL, NULL, &local_error);
|
||||||
|
+ g_assert_no_error (local_error);
|
||||||
|
+ g_assert_cmpint (registration_id, !=, 0);
|
||||||
|
+
|
||||||
|
+ /* Test a variety of error cases */
|
||||||
|
+ {
|
||||||
|
+ const struct
|
||||||
|
+ {
|
||||||
|
+ const gchar *interface_name;
|
||||||
|
+ const gchar *method_name;
|
||||||
|
+ const gchar *parameters_string;
|
||||||
|
+ gboolean tests_undefined_behaviour;
|
||||||
|
+ }
|
||||||
|
+ calls[] =
|
||||||
|
+ {
|
||||||
|
+ { "org.freedesktop.DBus.Properties", "Get", "('org.example.Foo', 'InvalidType')", TRUE },
|
||||||
|
+ { "org.freedesktop.DBus.Properties", "Get", "('org.example.Foo', 'InvalidTypeNull')", TRUE },
|
||||||
|
+ { "org.freedesktop.DBus.Properties", "Get", "('org.example.Foo', 'InvalidValueType')", TRUE },
|
||||||
|
+ { "org.freedesktop.DBus.Properties", "Set", "('org.example.Foo', 'InvalidType', <'irrelevant'>)", TRUE },
|
||||||
|
+ { "org.freedesktop.DBus.Properties", "GetAll", "('org.example.Foo',)", TRUE },
|
||||||
|
+ { "org.example.Foo", "WrongReturnType", "()", TRUE },
|
||||||
|
+ { "org.example.Foo", "GetFDs", "('Valid',)", FALSE },
|
||||||
|
+ { "org.example.Foo", "GetFDs", "('WrongNumber',)", TRUE },
|
||||||
|
+ { "org.example.Foo", "ReturnError", "()", FALSE },
|
||||||
|
+ { "org.example.Foo", "CloseBeforeReturning", "()", FALSE },
|
||||||
|
+ };
|
||||||
|
+ gsize i;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < G_N_ELEMENTS (calls); i++)
|
||||||
|
+ {
|
||||||
|
+ if (calls[i].tests_undefined_behaviour && !g_test_undefined ())
|
||||||
|
+ {
|
||||||
|
+ g_test_message ("Skipping %s.%s", calls[i].interface_name, calls[i].method_name);
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ g_test_message ("Calling %s.%s", calls[i].interface_name, calls[i].method_name);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Call twice, once expecting a result and once not. Do the call which
|
||||||
|
+ * doesn鈥檛 expect a result first; message ordering should ensure that
|
||||||
|
+ * it鈥檚 completed by the time the second call completes, so we don鈥檛
|
||||||
|
+ * have to account for it separately.
|
||||||
|
+ *
|
||||||
|
+ * That鈥檚 good, because the only way to get g_dbus_connection_call()
|
||||||
|
+ * to set %G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED is to not provide
|
||||||
|
+ * a callback function. */
|
||||||
|
+ n_outstanding_calls++;
|
||||||
|
+
|
||||||
|
+ g_dbus_connection_call (connection,
|
||||||
|
+ g_dbus_connection_get_unique_name (connection),
|
||||||
|
+ "/foo",
|
||||||
|
+ calls[i].interface_name,
|
||||||
|
+ calls[i].method_name,
|
||||||
|
+ g_variant_new_parsed (calls[i].parameters_string),
|
||||||
|
+ NULL,
|
||||||
|
+ G_DBUS_CALL_FLAGS_NONE,
|
||||||
|
+ -1,
|
||||||
|
+ NULL,
|
||||||
|
+ NULL, /* no callback */
|
||||||
|
+ NULL);
|
||||||
|
+
|
||||||
|
+ g_dbus_connection_call (connection,
|
||||||
|
+ g_dbus_connection_get_unique_name (connection),
|
||||||
|
+ "/foo",
|
||||||
|
+ calls[i].interface_name,
|
||||||
|
+ calls[i].method_name,
|
||||||
|
+ g_variant_new_parsed (calls[i].parameters_string),
|
||||||
|
+ NULL,
|
||||||
|
+ G_DBUS_CALL_FLAGS_NONE,
|
||||||
|
+ -1,
|
||||||
|
+ NULL,
|
||||||
|
+ ensure_result_cb,
|
||||||
|
+ &n_outstanding_calls);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Wait until all the calls are complete. */
|
||||||
|
+ while (n_outstanding_calls > 0)
|
||||||
|
+ g_main_context_iteration (NULL, TRUE);
|
||||||
|
+
|
||||||
|
+ g_dbus_connection_unregister_object (connection, registration_id);
|
||||||
|
+ g_object_unref (connection);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int
|
||||||
|
+main (int argc,
|
||||||
|
+ char *argv[])
|
||||||
|
+{
|
||||||
|
+ g_test_init (&argc, &argv, G_TEST_OPTION_ISOLATE_DIRS, NULL);
|
||||||
|
+
|
||||||
|
+ g_test_add_func ("/gdbus/method-invocation/return", test_method_invocation_return);
|
||||||
|
+
|
||||||
|
+ return session_bus_run ();
|
||||||
|
+}
|
||||||
|
diff --git a/gio/tests/meson.build b/gio/tests/meson.build
|
||||||
|
index 81ff551dda..c825b0cd7a 100644
|
||||||
|
--- a/gio/tests/meson.build
|
||||||
|
+++ b/gio/tests/meson.build
|
||||||
|
@@ -333,6 +333,7 @@ if host_machine.system() != 'windows'
|
||||||
|
'suite' : ['slow'],
|
||||||
|
},
|
||||||
|
'gdbus-introspection' : {'extra_sources' : extra_sources},
|
||||||
|
+ 'gdbus-method-invocation' : {'extra_sources' : extra_sources},
|
||||||
|
'gdbus-names' : {'extra_sources' : extra_sources},
|
||||||
|
'gdbus-proxy' : {'extra_sources' : extra_sources},
|
||||||
|
'gdbus-proxy-threads' : {
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
35
backport-xdgmime-fix-double-free.patch
Normal file
35
backport-xdgmime-fix-double-free.patch
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
From f95ca6cb713383548f16f9a8ba2f6c51a4d25e25 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michael Catanzaro <mcatanzaro@redhat.com>
|
||||||
|
Date: Fri, 17 Jun 2022 08:48:10 -0500
|
||||||
|
Subject: [PATCH] xdgmime: fix double free
|
||||||
|
|
||||||
|
We free xdg_dirs[i] twice, but fail to free xdg_dirs itself.
|
||||||
|
|
||||||
|
Also, since free() is NULL-safe, there is no need for the second check
|
||||||
|
here.
|
||||||
|
|
||||||
|
Discovered in: https://gitlab.freedesktop.org/xdg/xdgmime/-/merge_requests/16#note_1432025
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/f95ca6cb713383548f16f9a8ba2f6c51a4d25e25
|
||||||
|
|
||||||
|
---
|
||||||
|
gio/xdgmime/xdgmime.c | 3 +--
|
||||||
|
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/gio/xdgmime/xdgmime.c b/gio/xdgmime/xdgmime.c
|
||||||
|
index 9ab6760486..c3c11625e8 100644
|
||||||
|
--- a/gio/xdgmime/xdgmime.c
|
||||||
|
+++ b/gio/xdgmime/xdgmime.c
|
||||||
|
@@ -350,8 +350,7 @@ xdg_mime_set_dirs (const char * const *dirs)
|
||||||
|
|
||||||
|
for (i = 0; xdg_dirs != NULL && xdg_dirs[i] != NULL; i++)
|
||||||
|
free (xdg_dirs[i]);
|
||||||
|
- if (xdg_dirs != NULL)
|
||||||
|
- free (xdg_dirs[i]);
|
||||||
|
+ free (xdg_dirs);
|
||||||
|
xdg_dirs = NULL;
|
||||||
|
|
||||||
|
if (dirs != NULL)
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
28
glib2.spec
28
glib2.spec
@ -1,6 +1,6 @@
|
|||||||
Name: glib2
|
Name: glib2
|
||||||
Version: 2.66.8
|
Version: 2.66.8
|
||||||
Release: 6
|
Release: 7
|
||||||
Summary: The core library that forms the basis for projects such as GTK+ and GNOME
|
Summary: The core library that forms the basis for projects such as GTK+ and GNOME
|
||||||
License: LGPLv2+
|
License: LGPLv2+
|
||||||
URL: http://www.gtk.org
|
URL: http://www.gtk.org
|
||||||
@ -20,7 +20,7 @@ Patch6009: backport-gdbusobjectmanagerservice-fix-leak-in-error-path.patch
|
|||||||
Patch6010: backport-gfileenumerator-fix-leak-in-error-path.patch
|
Patch6010: backport-gfileenumerator-fix-leak-in-error-path.patch
|
||||||
Patch6011: backport-gsettings-Fix-a-minor-memory-leak-when-getting-GSettingsAction-state.patch
|
Patch6011: backport-gsettings-Fix-a-minor-memory-leak-when-getting-GSettingsAction-state.patch
|
||||||
Patch6012: backport-fix-a-memory-leak.patch
|
Patch6012: backport-fix-a-memory-leak.patch
|
||||||
Patch6013: backport-fix-expectations-when-running-as-root.patch
|
Patch6013: backport-fix-expectations-when-running-as-root.patch
|
||||||
Patch6014: backport-gapplication-fix-arguments-leak-in-error-path.patch
|
Patch6014: backport-gapplication-fix-arguments-leak-in-error-path.patch
|
||||||
Patch6015: backport-gsocks5proxy-Handle-EOF-when-reading-from-a-stream.patch
|
Patch6015: backport-gsocks5proxy-Handle-EOF-when-reading-from-a-stream.patch
|
||||||
Patch6016: backport-application-Unset-the-registered-state-after-shutting-down.patch
|
Patch6016: backport-application-Unset-the-registered-state-after-shutting-down.patch
|
||||||
@ -35,6 +35,27 @@ Patch6024: backport-gvariant-Fix-memory-leak-on-a-TYPE-CHECK-failure.patch
|
|||||||
Patch6025: backport-gvariant-Fix-pointers-being-dereferenced-despite-NULL-checks.patch
|
Patch6025: backport-gvariant-Fix-pointers-being-dereferenced-despite-NULL-checks.patch
|
||||||
Patch6026: backport-gtype-Fix-pointer-being-dereferenced-despite-NULL-check.patch
|
Patch6026: backport-gtype-Fix-pointer-being-dereferenced-despite-NULL-check.patch
|
||||||
Patch6027: backport-add-OOM-handling-in-mimemagic.patch
|
Patch6027: backport-add-OOM-handling-in-mimemagic.patch
|
||||||
|
Patch6028: backport-garray-buffer-overflow-fix.patch
|
||||||
|
Patch6029: backport-gutf8-add-string-length-check-when-ending-character-offset-is-1.patch
|
||||||
|
Patch6030: backport-gvariant-serialiser-Prevent-unbounded-recursion.patch
|
||||||
|
Patch6031: backport-dbusmessage-Disallow-empty-structures-tuples-in-D-Bus-messages.patch
|
||||||
|
Patch6032: backport-gdbusmessage-Disallow-zero-length-elements-in-arrays.patch
|
||||||
|
Patch6033: backport-garray-Fix-integer-overflows-in-element-capacity-calculations.patch
|
||||||
|
Patch6034: backport-gutils-Fix-g_find_program_in_path-to-return-an-absolute-path.patch
|
||||||
|
Patch6035: backport-Fix-memory-leak-in-gdbusauthmechanismsha1.patch
|
||||||
|
Patch6036: backport-gprintf-Fix-a-memory-leak-with-an-invalid-format.patch
|
||||||
|
Patch6037: backport-tests-Add-some-tests-for-g_vasprintf-invalid-format-strings.patch
|
||||||
|
Patch6038: backport-tests-Add-some-tests-for-g_string_append_vprintf.patch
|
||||||
|
Patch6039: backport-gdbusmethodinvocation-Fix-a-leak-on-an-early-return-path.patch
|
||||||
|
Patch6040: backport-gdbusmethodinvocation-Fix-dead-code-for-type-checking-GetAll.patch
|
||||||
|
Patch6041: backport-gdbusmethodinvocation-Drop-redundant-quote-from-warning.patch
|
||||||
|
Patch6042: backport-tests-Add-unit-tests-for-GDBusMethodInvocation.patch
|
||||||
|
Patch6043: backport-gio-tool-Fix-a-minor-memory-leak.patch
|
||||||
|
Patch6044: backport-gopenuriportal-Fix-a-use-after-free-on-an-error-path.patch
|
||||||
|
Patch6045: backport-xdgmime-fix-double-free.patch
|
||||||
|
Patch6046: backport-gunixmounts-Add-cache-to-g_unix_mount_points_get.patch
|
||||||
|
Patch6047: backport-Add-lock-in-_g_get_unix_mount_points-around-fsent-functions.patch
|
||||||
|
Patch6048: backport-g_get_unix_mount_points-reduce-syscalls-inside-loop.patch
|
||||||
|
|
||||||
|
|
||||||
BuildRequires: chrpath gcc gcc-c++ gettext perl-interpreter
|
BuildRequires: chrpath gcc gcc-c++ gettext perl-interpreter
|
||||||
@ -208,6 +229,9 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Sat Oct 15 2022 hanhuihui <hanhuihui5@huawei.com> - 2.66.8-7
|
||||||
|
- backport some patches from community
|
||||||
|
|
||||||
* Mon May 09 2022 wangkerong <wangkerong@h-partners.com> - 2.66.8-6
|
* Mon May 09 2022 wangkerong <wangkerong@h-partners.com> - 2.66.8-6
|
||||||
- fix issues found by svace static code analyzer
|
- fix issues found by svace static code analyzer
|
||||||
fix segfault,memory leak,EOF,arguments leak
|
fix segfault,memory leak,EOF,arguments leak
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user