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 : [

Reply via email to