Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package glib2 for openSUSE:Factory checked in at 2023-09-06 18:56:15 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/glib2 (Old) and /work/SRC/openSUSE:Factory/.glib2.new.1766 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "glib2" Wed Sep 6 18:56:15 2023 rev:269 rq:1109058 version:2.76.5 Changes: -------- --- /work/SRC/openSUSE:Factory/glib2/glib2.changes 2023-07-11 15:56:29.120885887 +0200 +++ /work/SRC/openSUSE:Factory/.glib2.new.1766/glib2.changes 2023-09-06 18:57:30.830105461 +0200 @@ -1,0 +2,19 @@ +Mon Sep 4 14:23:48 UTC 2023 - Bjørn Lie <[email protected]> + +- Update to version 2.76.5: + + Bugs fixed: + - Possible SEGV (null pointer deref) in + distribute_method_call(). + - Possible SEGV (null pointer deref) in _g_resource_file_new(). + - Backport !3529 âgmenuexporter: synchronization in + org_gtk_Menus_get_interface.â to glib-2-76. + - Backport !3547 âglib/gfileutils.c: use 64 bits for value in + get_tmp_file()â to glib-2-76. + - Backport !3554 âgresourcefile: Fix crash if called with a + badly escaped URIâ to glib-2-76. + - Backport !3555 âgkeyfile: Fix overwriting of GErrorâ to + glib-2-76. + - Backport !3539 âgdbusmessage: Validate required headers have + the right typeâ to glib-2-76. + +------------------------------------------------------------------- Old: ---- glib-2.76.4.tar.xz New: ---- glib-2.76.5.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ glib2.spec ++++++ --- /var/tmp/diff_new_pack.PtabTa/_old 2023-09-06 18:57:32.966181607 +0200 +++ /var/tmp/diff_new_pack.PtabTa/_new 2023-09-06 18:57:32.970181750 +0200 @@ -30,7 +30,7 @@ %define libgthread libgthread-%{libver} %bcond_without systemtap Name: glib2%{psuffix} -Version: 2.76.4 +Version: 2.76.5 Release: 0 Summary: General-Purpose Utility Library License: LGPL-2.1-or-later ++++++ glib-2.76.4.tar.xz -> glib-2.76.5.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/glib-2.76.4/NEWS new/glib-2.76.5/NEWS --- old/glib-2.76.4/NEWS 2023-07-06 17:39:47.000000000 +0200 +++ new/glib-2.76.5/NEWS 2023-08-31 13:08:59.000000000 +0200 @@ -1,3 +1,22 @@ +Overview of changes in GLib 2.76.5, 2023-08-31 +============================================== + +* Bugs fixed: + - #3061 Possible SEGV (null pointer deref) in distribute_method_call() (Philip + Withnall) + - #3090 Possible SEGV (null pointer deref) in _g_resource_file_new() (Philip + Withnall) + - !3531 Backport !3529 âgmenuexporter: synchronization in + org_gtk_Menus_get_interface.â to glib-2-76 + - !3549 Backport !3547 âglib/gfileutils.c: use 64 bits for value in + get_tmp_file()â to glib-2-76 + - !3556 Backport !3554 âgresourcefile: Fix crash if called with a badly + escaped URIâ to glib-2-76 + - !3557 Backport !3555 âgkeyfile: Fix overwriting of GErrorâ to glib-2-76 + - !3558 Backport !3539 âgdbusmessage: Validate required headers have the right + typeâ to glib-2-76 + + Overview of changes in GLib 2.76.4, 2023-07-06 ============================================== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/glib-2.76.4/gio/gdbusconnection.c new/glib-2.76.5/gio/gdbusconnection.c --- old/glib-2.76.4/gio/gdbusconnection.c 2023-07-06 17:39:47.000000000 +0200 +++ new/glib-2.76.5/gio/gdbusconnection.c 2023-08-31 13:08:59.000000000 +0200 @@ -3966,10 +3966,22 @@ GDBusMessage *message) { GPtrArray *signal_data_array; - const gchar *sender; + const gchar *sender, *interface, *member, *path; + + g_assert (g_dbus_message_get_message_type (message) == G_DBUS_MESSAGE_TYPE_SIGNAL); sender = g_dbus_message_get_sender (message); + /* all three of these are required, but should have been validated already + * by validate_headers() in gdbusmessage.c */ + interface = g_dbus_message_get_interface (message); + member = g_dbus_message_get_member (message); + path = g_dbus_message_get_path (message); + + g_assert (interface != NULL); + g_assert (member != NULL); + g_assert (path != NULL); + if (G_UNLIKELY (_g_dbus_debug_signal ())) { _g_dbus_debug_print_lock (); @@ -3978,9 +3990,7 @@ " <<<< RECEIVED SIGNAL %s.%s\n" " on object %s\n" " sent by name %s\n", - g_dbus_message_get_interface (message), - g_dbus_message_get_member (message), - g_dbus_message_get_path (message), + interface, member, path, sender != NULL ? sender : "(none)"); _g_dbus_debug_print_unlock (); } @@ -7186,19 +7196,26 @@ GDBusMessage *reply; ExportedObject *eo; ExportedSubtree *es; - const gchar *object_path; + const gchar *path; const gchar *interface_name; const gchar *member; - const gchar *path; gchar *subtree_path; gchar *needle; gboolean object_found = FALSE; g_assert (g_dbus_message_get_message_type (message) == G_DBUS_MESSAGE_TYPE_METHOD_CALL); - interface_name = g_dbus_message_get_interface (message); + /* these are required, and should have been validated by validate_headers() + * in gdbusmessage.c already */ member = g_dbus_message_get_member (message); path = g_dbus_message_get_path (message); + + g_assert (member != NULL); + g_assert (path != NULL); + + /* this is optional */ + interface_name = g_dbus_message_get_interface (message); + subtree_path = g_strdup (path); needle = strrchr (subtree_path, '/'); if (needle != NULL && needle != subtree_path) @@ -7211,7 +7228,6 @@ subtree_path = NULL; } - if (G_UNLIKELY (_g_dbus_debug_incoming ())) { _g_dbus_debug_print_lock (); @@ -7228,17 +7244,14 @@ _g_dbus_debug_print_unlock (); } - object_path = g_dbus_message_get_path (message); - g_assert (object_path != NULL); - - eo = g_hash_table_lookup (connection->map_object_path_to_eo, object_path); + eo = g_hash_table_lookup (connection->map_object_path_to_eo, path); if (eo != NULL) { if (obj_message_func (connection, eo, message, &object_found)) goto out; } - es = g_hash_table_lookup (connection->map_object_path_to_es, object_path); + es = g_hash_table_lookup (connection->map_object_path_to_es, path); if (es != NULL) { if (subtree_message_func (connection, es, message)) @@ -7265,14 +7278,14 @@ "org.freedesktop.DBus.Error.UnknownMethod", _("No such interface â%sâ on object at path %s"), interface_name, - object_path); + path); } else { reply = g_dbus_message_new_method_error (message, "org.freedesktop.DBus.Error.UnknownMethod", _("Object does not exist at path â%sâ"), - object_path); + path); } g_dbus_connection_send_message_unlocked (connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/glib-2.76.4/gio/gdbusmessage.c new/glib-2.76.5/gio/gdbusmessage.c --- old/glib-2.76.4/gio/gdbusmessage.c 2023-07-06 17:39:47.000000000 +0200 +++ new/glib-2.76.5/gio/gdbusmessage.c 2023-08-31 13:08:59.000000000 +0200 @@ -1308,67 +1308,99 @@ break; case G_DBUS_MESSAGE_TYPE_METHOD_CALL: - if (g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_PATH) == NULL || - g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_MEMBER) == NULL) - { - g_set_error_literal (error, - G_IO_ERROR, - G_IO_ERROR_INVALID_ARGUMENT, - _("METHOD_CALL message: PATH or MEMBER header field is missing")); - goto out; - } + { + GVariant *path_variant = g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_PATH); + GVariant *member_variant = g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_MEMBER); + + if (path_variant == NULL || + !g_variant_is_of_type (path_variant, G_VARIANT_TYPE_OBJECT_PATH) || + member_variant == NULL || + !g_variant_is_of_type (member_variant, G_VARIANT_TYPE_STRING) || + !g_dbus_is_member_name (g_variant_get_string (member_variant, NULL))) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("METHOD_CALL message: PATH or MEMBER header field is missing or invalid")); + goto out; + } + } break; case G_DBUS_MESSAGE_TYPE_METHOD_RETURN: - if (g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL) == NULL) - { - g_set_error_literal (error, - G_IO_ERROR, - G_IO_ERROR_INVALID_ARGUMENT, - _("METHOD_RETURN message: REPLY_SERIAL header field is missing")); - goto out; - } + { + GVariant *reply_serial_variant = g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL); + + if (reply_serial_variant == NULL || + !g_variant_is_of_type (reply_serial_variant, G_VARIANT_TYPE_UINT32)) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid")); + goto out; + } + } break; case G_DBUS_MESSAGE_TYPE_ERROR: - if (g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_ERROR_NAME) == NULL || - g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL) == NULL) - { - g_set_error_literal (error, - G_IO_ERROR, - G_IO_ERROR_INVALID_ARGUMENT, - _("ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing")); - goto out; - } + { + GVariant *error_name_variant = g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_ERROR_NAME); + GVariant *reply_serial_variant = g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL); + + if (error_name_variant == NULL || + !g_variant_is_of_type (error_name_variant, G_VARIANT_TYPE_STRING) || + !g_dbus_is_error_name (g_variant_get_string (error_name_variant, NULL)) || + reply_serial_variant == NULL || + !g_variant_is_of_type (reply_serial_variant, G_VARIANT_TYPE_UINT32)) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid")); + goto out; + } + } break; case G_DBUS_MESSAGE_TYPE_SIGNAL: - if (g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_PATH) == NULL || - g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_INTERFACE) == NULL || - g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_MEMBER) == NULL) - { - g_set_error_literal (error, - G_IO_ERROR, - G_IO_ERROR_INVALID_ARGUMENT, - _("SIGNAL message: PATH, INTERFACE or MEMBER header field is missing")); - goto out; - } - if (g_strcmp0 (g_dbus_message_get_path (message), "/org/freedesktop/DBus/Local") == 0) - { - g_set_error_literal (error, - G_IO_ERROR, - G_IO_ERROR_INVALID_ARGUMENT, - _("SIGNAL message: The PATH header field is using the reserved value /org/freedesktop/DBus/Local")); - goto out; - } - if (g_strcmp0 (g_dbus_message_get_interface (message), "org.freedesktop.DBus.Local") == 0) - { - g_set_error_literal (error, - G_IO_ERROR, - G_IO_ERROR_INVALID_ARGUMENT, - _("SIGNAL message: The INTERFACE header field is using the reserved value org.freedesktop.DBus.Local")); - goto out; - } + { + GVariant *path_variant = g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_PATH); + GVariant *interface_variant = g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_INTERFACE); + GVariant *member_variant = g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_MEMBER); + + if (path_variant == NULL || + !g_variant_is_of_type (path_variant, G_VARIANT_TYPE_OBJECT_PATH) || + interface_variant == NULL || + !g_variant_is_of_type (interface_variant, G_VARIANT_TYPE_STRING) || + !g_dbus_is_interface_name (g_variant_get_string (interface_variant, NULL)) || + member_variant == NULL || + !g_variant_is_of_type (member_variant, G_VARIANT_TYPE_STRING) || + !g_dbus_is_member_name (g_variant_get_string (member_variant, NULL))) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid")); + goto out; + } + if (g_strcmp0 (g_dbus_message_get_path (message), "/org/freedesktop/DBus/Local") == 0) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("SIGNAL message: The PATH header field is using the reserved value /org/freedesktop/DBus/Local")); + goto out; + } + if (g_strcmp0 (g_dbus_message_get_interface (message), "org.freedesktop.DBus.Local") == 0) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("SIGNAL message: The INTERFACE header field is using the reserved value org.freedesktop.DBus.Local")); + goto out; + } + } break; default: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/glib-2.76.4/gio/gmenuexporter.c new/glib-2.76.5/gio/gmenuexporter.c --- old/glib-2.76.4/gio/gmenuexporter.c 2023-07-06 17:39:47.000000000 +0200 +++ new/glib-2.76.5/gio/gmenuexporter.c 2023-08-31 13:08:59.000000000 +0200 @@ -53,8 +53,9 @@ org_gtk_Menus_get_interface (void) { static GDBusInterfaceInfo *interface_info; + static gsize interface_info_initialized = 0; - if (interface_info == NULL) + if (g_once_init_enter (&interface_info_initialized)) { GError *error = NULL; GDBusNodeInfo *info; @@ -79,6 +80,8 @@ g_assert (interface_info != NULL); g_dbus_interface_info_ref (interface_info); g_dbus_node_info_unref (info); + + g_once_init_leave (&interface_info_initialized, 1); } return interface_info; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/glib-2.76.4/gio/gresourcefile.c new/glib-2.76.5/gio/gresourcefile.c --- old/glib-2.76.4/gio/gresourcefile.c 2023-07-06 17:39:47.000000000 +0200 +++ new/glib-2.76.5/gio/gresourcefile.c 2023-08-31 13:08:59.000000000 +0200 @@ -238,6 +238,7 @@ return G_FILE (resource); } +/* Will return %NULL if @uri is malformed */ GFile * _g_resource_file_new (const char *uri) { @@ -245,6 +246,9 @@ char *path; path = g_uri_unescape_string (uri + strlen ("resource:"), NULL); + if (path == NULL) + return NULL; + resource = g_resource_file_new_for_path (path); g_free (path); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/glib-2.76.4/gio/tests/gdbus-serialization.c new/glib-2.76.5/gio/tests/gdbus-serialization.c --- old/glib-2.76.4/gio/tests/gdbus-serialization.c 2023-07-06 17:39:47.000000000 +0200 +++ new/glib-2.76.5/gio/tests/gdbus-serialization.c 2023-08-31 13:08:59.000000000 +0200 @@ -936,7 +936,7 @@ g_dbus_message_set_interface (message, NULL); blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); - g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: PATH, INTERFACE or MEMBER header field is missing"); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid"); g_clear_error (&error); g_assert_null (blob); /* interface reserved value => error */ @@ -953,7 +953,7 @@ g_dbus_message_set_path (message, NULL); blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); - g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: PATH, INTERFACE or MEMBER header field is missing"); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid"); g_clear_error (&error); g_assert_null (blob); /* path reserved value => error */ @@ -970,7 +970,7 @@ g_dbus_message_set_member (message, NULL); blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); - g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: PATH, INTERFACE or MEMBER header field is missing"); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid"); g_clear_error (&error); g_assert_null (blob); /* reset member */ @@ -988,7 +988,7 @@ g_dbus_message_set_path (message, NULL); blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); - g_assert_cmpstr (error->message, ==, "Cannot serialize message: METHOD_CALL message: PATH or MEMBER header field is missing"); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: METHOD_CALL message: PATH or MEMBER header field is missing or invalid"); g_clear_error (&error); g_assert_null (blob); /* reset path */ @@ -998,7 +998,7 @@ g_dbus_message_set_member (message, NULL); blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); - g_assert_cmpstr (error->message, ==, "Cannot serialize message: METHOD_CALL message: PATH or MEMBER header field is missing"); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: METHOD_CALL message: PATH or MEMBER header field is missing or invalid"); g_clear_error (&error); g_assert_null (blob); /* reset member */ @@ -1018,7 +1018,7 @@ g_dbus_message_set_header (reply, G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL, NULL); blob = g_dbus_message_to_blob (reply, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); - g_assert_cmpstr (error->message, ==, "Cannot serialize message: METHOD_RETURN message: REPLY_SERIAL header field is missing"); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid"); g_clear_error (&error); g_assert_null (blob); g_object_unref (reply); @@ -1029,7 +1029,7 @@ g_dbus_message_set_error_name (reply, NULL); blob = g_dbus_message_to_blob (reply, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); - g_assert_cmpstr (error->message, ==, "Cannot serialize message: ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing"); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid"); g_clear_error (&error); g_assert_null (blob); /* reset ERROR_NAME */ @@ -1038,7 +1038,7 @@ g_dbus_message_set_header (reply, G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL, NULL); blob = g_dbus_message_to_blob (reply, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); - g_assert_cmpstr (error->message, ==, "Cannot serialize message: ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing"); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid"); g_clear_error (&error); g_assert_null (blob); g_object_unref (reply); @@ -1615,6 +1615,127 @@ g_clear_object (&message); } +static void +test_message_parse_missing_header (void) +{ + const guint8 data[] = { + 'l', /* little-endian byte order */ + 0x01, /* message type (method call) */ + 0x00, /* message flags (none) */ + 0x01, /* major protocol version */ + 0x12, 0x00, 0x00, 0x00, /* body length (in bytes) */ + 0x20, 0x20, 0x20, 0x20, /* message serial */ + /* a{yv} of header fields: */ + 0x24, 0x00, 0x00, 0x00, /* array length (in bytes), must be a multiple of 8 */ + 0x01, /* array key (PATH, required for method call messages) */ + /* Variant array value: */ + 0x01, /* signature length */ + 'o', /* one complete type */ + 0x00, /* nul terminator */ + /* (Variant array value payload) */ + 0x01, 0x00, 0x00, 0x00, + '/', 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x30, /* array key (MEMBER, required for method call messages; CORRUPTED from 0x03) */ + /* Variant array value: */ + 0x01, /* signature length */ + 's', /* one complete type */ + 0x00, /* nul terminator */ + /* (Variant array value payload) */ + 0x03, 0x00, 0x00, 0x00, + 'H', 'e', 'y', 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x08, /* array key (SIGNATURE) */ + /* Variant array value: */ + 0x01, /* signature length */ + 'g', /* one complete type */ + 0x00, /* nul terminator */ + /* (Variant array value payload) */ + 0x02, 's', 's', 0x00, + /* Some arbitrary valid content inside the message body: */ + 0x03, 0x00, 0x00, 0x00, + 'h', 'e', 'y', 0x00, + 0x05, 0x00, 0x00, 0x00, + 't', 'h', 'e', 'r', 'e', 0x00 + }; + + gsize size = sizeof (data); + GDBusMessage *message = NULL; + GError *local_error = NULL; + + g_test_summary ("Test that missing (required) headers prompt an error."); + g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/3061"); + + 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_null (message); + + g_clear_error (&local_error); +} + +static void +test_message_parse_invalid_header_type (void) +{ + const guint8 data[] = { + 'l', /* little-endian byte order */ + 0x01, /* message type (method call) */ + 0x00, /* message flags (none) */ + 0x01, /* major protocol version */ + 0x12, 0x00, 0x00, 0x00, /* body length (in bytes) */ + 0x20, 0x20, 0x20, 0x20, /* message serial */ + /* a{yv} of header fields: */ + 0x24, 0x00, 0x00, 0x00, /* array length (in bytes), must be a multiple of 8 */ + 0x01, /* array key (PATH, required for method call messages) */ + /* Variant array value: */ + 0x01, /* signature length */ + 'o', /* one complete type */ + 0x00, /* nul terminator */ + /* (Variant array value payload) */ + 0x01, 0x00, 0x00, 0x00, + '/', 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x03, /* array key (MEMBER, required for method call messages) */ + /* Variant array value: */ + 0x01, /* signature length */ + 't', /* one complete type; CORRUPTED, MEMBER should be 's' */ + 0x00, /* nul terminator */ + /* (Padding to 64-bit alignment of 't)' */ + 0x00, 0x00, 0x00, 0x00, + /* (Variant array value payload) */ + 'H', 'e', 'y', 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x08, /* array key (SIGNATURE) */ + /* Variant array value: */ + 0x01, /* signature length */ + 'g', /* one complete type */ + 0x00, /* nul terminator */ + /* (Variant array value payload) */ + 0x02, 's', 's', 0x00, + /* Some arbitrary valid content inside the message body: */ + 0x03, 0x00, 0x00, 0x00, + 'h', 'e', 'y', 0x00, + 0x05, 0x00, 0x00, 0x00, + 't', 'h', 'e', 'r', 'e', 0x00 + }; + + gsize size = sizeof (data); + GDBusMessage *message = NULL; + GError *local_error = NULL; + + g_test_summary ("Test that the type of well-known headers is checked."); + g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/3061"); + + 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_null (message); + + g_clear_error (&local_error); +} + /* ---------------------------------------------------------------------------------------------------- */ int @@ -1657,6 +1778,10 @@ test_message_parse_truncated); g_test_add_func ("/gdbus/message-parse/empty-structure", test_message_parse_empty_structure); + g_test_add_func ("/gdbus/message-parse/missing-header", + test_message_parse_missing_header); + g_test_add_func ("/gdbus/message-parse/invalid-header-type", + test_message_parse_invalid_header_type); return g_test_run(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/glib-2.76.4/gio/tests/vfs.c new/glib-2.76.5/gio/tests/vfs.c --- old/glib-2.76.4/gio/tests/vfs.c 2023-07-06 17:39:47.000000000 +0200 +++ new/glib-2.76.5/gio/tests/vfs.c 2023-08-31 13:08:59.000000000 +0200 @@ -108,18 +108,39 @@ gchar **schemes; vfs = g_vfs_get_local (); - g_assert (g_vfs_is_active (vfs)); + g_assert_true (g_vfs_is_active (vfs)); file = g_vfs_get_file_for_uri (vfs, "not a good uri"); - g_assert (G_IS_FILE (file)); + g_assert_true (G_IS_FILE (file)); g_object_unref (file); schemes = (gchar **)g_vfs_get_supported_uri_schemes (vfs); - g_assert (g_strv_length (schemes) > 0); + g_assert_cmpuint (g_strv_length (schemes), >, 0); g_assert_cmpstr (schemes[0], ==, "file"); } +static void +test_resource_malformed_escaping (void) +{ + GVfs *vfs; + GFile *file; + + g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/3090"); + g_test_summary ("Test that g_vfs_get_file_for_uri() returns an invalid file for an invalid URI"); + + vfs = g_vfs_get_local (); + g_assert_true (g_vfs_is_active (vfs)); + + file = g_vfs_get_file_for_uri (vfs, "resource:///%not-valid-escaping/gtk.css"); + g_assert_true (G_IS_FILE (file)); + + /* This only returns %NULL if the file was constructed with an invalid URI: */ + g_assert_null (g_file_get_uri_scheme (file)); + + g_object_unref (file); +} + int main (int argc, char *argv[]) { @@ -127,6 +148,7 @@ g_test_add_func ("/gvfs/local", test_local); g_test_add_func ("/gvfs/register-scheme", test_register_scheme); + g_test_add_func ("/gvfs/resource/malformed-escaping", test_resource_malformed_escaping); return g_test_run (); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/glib-2.76.4/glib/gfileutils.c new/glib-2.76.5/glib/gfileutils.c --- old/glib-2.76.4/glib/gfileutils.c 2023-07-06 17:39:47.000000000 +0200 +++ new/glib-2.76.5/glib/gfileutils.c 2023-08-31 13:08:59.000000000 +0200 @@ -1500,7 +1500,7 @@ static const char letters[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; static const int NLETTERS = sizeof (letters) - 1; - glong value; + gint64 value; gint64 now_us; static int counter = 0; @@ -1521,7 +1521,7 @@ for (count = 0; count < 100; value += 7777, ++count) { - glong v = value; + gint64 v = value; /* Fill in the random bits. */ XXXXXX[0] = letters[v % NLETTERS]; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/glib-2.76.4/glib/gkeyfile.c new/glib-2.76.5/glib/gkeyfile.c --- old/glib-2.76.4/glib/gkeyfile.c 2023-07-06 17:39:47.000000000 +0200 +++ new/glib-2.76.5/glib/gkeyfile.c 2023-08-31 13:08:59.000000000 +0200 @@ -4287,8 +4287,11 @@ GError **error) { gchar *string_value, *q0, *q; + GSList *tmp_pieces = NULL; const gchar *p; + g_assert (pieces == NULL || *pieces == NULL); + string_value = g_new (gchar, strlen (value) + 1); p = value; @@ -4326,7 +4329,7 @@ G_KEY_FILE_ERROR_INVALID_VALUE, _("Key file contains escape character " "at end of line")); - break; + goto error; default: if (pieces && *p == key_file->list_separator) @@ -4348,20 +4351,21 @@ G_KEY_FILE_ERROR_INVALID_VALUE, _("Key file contains invalid escape " "sequence â%sâ"), sequence); - } - } + goto error; + } + } break; } } else - { - *q = *p; - if (pieces && (*p == key_file->list_separator)) - { - *pieces = g_slist_prepend (*pieces, g_strndup (q0, q - q0)); - q0 = q + 1; - } - } + { + *q = *p; + if (pieces && (*p == key_file->list_separator)) + { + tmp_pieces = g_slist_prepend (tmp_pieces, g_strndup (q0, q - q0)); + q0 = q + 1; + } + } if (*p == '\0') break; @@ -4372,13 +4376,19 @@ *q = '\0'; if (pieces) - { - if (q0 < q) - *pieces = g_slist_prepend (*pieces, g_strndup (q0, q - q0)); - *pieces = g_slist_reverse (*pieces); - } + { + if (q0 < q) + tmp_pieces = g_slist_prepend (tmp_pieces, g_strndup (q0, q - q0)); + *pieces = g_slist_reverse (tmp_pieces); + } return string_value; + +error: + g_free (string_value); + g_slist_free_full (tmp_pieces, g_free); + + return NULL; } static gchar * diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/glib-2.76.4/glib/tests/keyfile.c new/glib-2.76.5/glib/tests/keyfile.c --- old/glib-2.76.4/glib/tests/keyfile.c 2023-07-06 17:39:47.000000000 +0200 +++ new/glib-2.76.5/glib/tests/keyfile.c 2023-08-31 13:08:59.000000000 +0200 @@ -535,16 +535,17 @@ "3", }; const gchar *data = - "[valid]\n" - "key1=\\s\\n\\t\\r\\\\\n" - "key2=\"quoted\"\n" - "key3='quoted'\n" - "key4=\xe2\x89\xa0\xe2\x89\xa0\n" - "key5= leading space\n" - "key6=trailing space \n" - "[invalid]\n" - "key1=\\a\\b\\0800xff\n" - "key2=blabla\\\n"; + "[valid]\n" + "key1=\\s\\n\\t\\r\\\\\n" + "key2=\"quoted\"\n" + "key3='quoted'\n" + "key4=\xe2\x89\xa0\xe2\x89\xa0\n" + "key5= leading space\n" + "key6=trailing space \n" + "[invalid]\n" + "key1=\\a\\b\\0800xff\n" + "key2=blabla\\\n" + "key3=foo\\i\\\n"; keyfile = load_data (data, 0); @@ -563,6 +564,10 @@ check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); g_free (value); + value = g_key_file_get_string (keyfile, "invalid", "key3", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); + g_free (value); + g_key_file_set_string (keyfile, "inserted", "key1", "simple"); g_key_file_set_string (keyfile, "inserted", "key2", " leading space"); g_key_file_set_string (keyfile, "inserted", "key3", "\tleading tab"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/glib-2.76.4/meson.build new/glib-2.76.5/meson.build --- old/glib-2.76.4/meson.build 2023-07-06 17:39:47.000000000 +0200 +++ new/glib-2.76.5/meson.build 2023-08-31 13:08:59.000000000 +0200 @@ -1,5 +1,5 @@ project('glib', 'c', - version : '2.76.4', + version : '2.76.5', # NOTE: See the policy in docs/meson-version.md before changing the Meson dependency meson_version : '>= 0.60.0', default_options : [
