I think this is missing fixes for regressions caused by these commits.
Specifically the ones here:

https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1933/commits

https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1943

The Ubuntu code branch that is being referred here also includes these
fixes.

Thanks,

Anuj

On Mon, 2021-11-29 at 13:13 +0530, Ranjitsinh Rathod wrote:
> From: Neetika Singh <[email protected]>
> 
> Add patches for below CVE issues:
> CVE-2021-27218
> CVE-2021-27219
> CVE-2021-28153
> Link:
> https://mirrors.ocf.berkeley.edu/ubuntu/pool/main/g/glib2.0/glib2.0_2.64.6-1~ubuntu20.04.3.debian.tar.xz
> 
> Signed-off-by: Neetika.Singh <[email protected]>
> Signed-off-by: Ranjitsinh Rathod <[email protected]>
> Signed-off-by: Ranjitsinh Rathod <[email protected]>
> ---
>  .../glib-2.0/glib-2.0/CVE-2021-27218.patch    | 128 ++++++++
>  .../glib-2.0/glib-2.0/CVE-2021-27219-01.patch | 169 ++++++++++
>  .../glib-2.0/glib-2.0/CVE-2021-27219-02.patch | 248 +++++++++++++++
>  .../glib-2.0/glib-2.0/CVE-2021-27219-03.patch | 130 ++++++++
>  .../glib-2.0/glib-2.0/CVE-2021-27219-04.patch | 297 ++++++++++++++++++
>  .../glib-2.0/glib-2.0/CVE-2021-27219-05.patch |  53 ++++
>  .../glib-2.0/glib-2.0/CVE-2021-27219-06.patch | 100 ++++++
>  .../glib-2.0/glib-2.0/CVE-2021-27219-07.patch |  75 +++++
>  .../glib-2.0/glib-2.0/CVE-2021-27219-08.patch | 100 ++++++
>  .../glib-2.0/glib-2.0/CVE-2021-27219-09.patch |  99 ++++++
>  .../glib-2.0/glib-2.0/CVE-2021-27219-10.patch |  58 ++++
>  .../glib-2.0/glib-2.0/CVE-2021-27219-11.patch |  62 ++++
>  .../glib-2.0/glib-2.0/CVE-2021-28153-1.patch  |  26 ++
>  .../glib-2.0/glib-2.0/CVE-2021-28153-2.patch  |  41 +++
>  .../glib-2.0/glib-2.0/CVE-2021-28153-3.patch  |  56 ++++
>  .../glib-2.0/glib-2.0/CVE-2021-28153-4.patch  | 264 ++++++++++++++++
>  .../glib-2.0/glib-2.0/CVE-2021-28153-5.patch  |  54 ++++
>  meta/recipes-core/glib-2.0/glib-2.0_2.62.6.bb |  17 +
>  18 files changed, 1977 insertions(+)
>  create mode 100644 meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-
> 27218.patch
>  create mode 100644 meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 01.patch
>  create mode 100644 meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 02.patch
>  create mode 100644 meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 03.patch
>  create mode 100644 meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 04.patch
>  create mode 100644 meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 05.patch
>  create mode 100644 meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 06.patch
>  create mode 100644 meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 07.patch
>  create mode 100644 meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 08.patch
>  create mode 100644 meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 09.patch
>  create mode 100644 meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 10.patch
>  create mode 100644 meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 11.patch
>  create mode 100644 meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-
> 1.patch
>  create mode 100644 meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-
> 2.patch
>  create mode 100644 meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-
> 3.patch
>  create mode 100644 meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-
> 4.patch
>  create mode 100644 meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-
> 5.patch
> 
> diff --git a/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27218.patch
> b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27218.patch
> new file mode 100644
> index 0000000000..23e1426cee
> --- /dev/null
> +++ b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27218.patch
> @@ -0,0 +1,128 @@
> +Backport of:
> +
> +From 0f384c88a241bbbd884487b1c40b7b75f1e638d3 Mon Sep 17 00:00:00 2001
> +From: Krzesimir Nowak <[email protected]>
> +Date: Wed, 10 Feb 2021 23:51:07 +0100
> +Subject: [PATCH] gbytearray: Do not accept too large byte arrays
> +
> +GByteArray uses guint for storing the length of the byte array, but it
> +also has a constructor (g_byte_array_new_take) that takes length as a
> +gsize. gsize may be larger than guint (64 bits for gsize vs 32 bits
> +for guint). It is possible to call the function with a value greater
> +than G_MAXUINT, which will result in silent length truncation. This
> +may happen as a result of unreffing GBytes into GByteArray, so rather
> +be loud about it.
> +
> +(Test case tweaked by Philip Withnall.)
> +
> +(Backport 2.66: Add #include gstrfuncsprivate.h in the test case for
> +`g_memdup2()`.)
> +
> +Upstream-Status: Backport
> [https://mirrors.ocf.berkeley.edu/ubuntu/pool/main/g/glib2.0/glib2.0_2.64.6-1~ubuntu20.04.3.debian.tar.xz
> ]
> +CVE: CVE-2021-27218
> +Signed-off-by: Neetika Singh <[email protected]>
> +Signed-off-by: Ranjitsinh Rathod <[email protected]>
> +---
> + glib/garray.c      |  6 ++++++
> + glib/gbytes.c      |  4 ++++
> + glib/tests/bytes.c | 35 ++++++++++++++++++++++++++++++++++-
> + 3 files changed, 44 insertions(+), 1 deletion(-)
> +
> +--- a/glib/garray.c
> ++++ b/glib/garray.c
> +@@ -2234,6 +2234,10 @@ g_byte_array_steal (GByteArray *array,
> +  * Create byte array containing the data. The data will be owned by
> the array
> +  * and will be freed with g_free(), i.e. it could be allocated using
> g_strdup().
> +  *
> ++ * Do not use it if @len is greater than %G_MAXUINT. #GByteArray
> ++ * stores the length of its data in #guint, which may be shorter than
> ++ * #gsize.
> ++ *
> +  * Since: 2.32
> +  *
> +  * Returns: (transfer full): a new #GByteArray
> +@@ -2245,6 +2249,8 @@ g_byte_array_new_take (guint8 *data,
> +   GByteArray *array;
> +   GRealArray *real;
> + 
> ++  g_return_val_if_fail (len <= G_MAXUINT, NULL);
> ++
> +   array = g_byte_array_new ();
> +   real = (GRealArray *)array;
> +   g_assert (real->data == NULL);
> +--- a/glib/gbytes.c
> ++++ b/glib/gbytes.c
> +@@ -519,6 +519,10 @@ g_bytes_unref_to_data (GBytes *bytes,
> +  * g_bytes_new(), g_bytes_new_take() or g_byte_array_free_to_bytes().
> In all
> +  * other cases the data is copied.
> +  *
> ++ * Do not use it if @bytes contains more than %G_MAXUINT
> ++ * bytes. #GByteArray stores the length of its data in #guint, which
> ++ * may be shorter than #gsize, that @bytes is using.
> ++ *
> +  * Returns: (transfer full): a new mutable #GByteArray containing the
> same byte data
> +  *
> +  * Since: 2.32
> +--- a/glib/tests/bytes.c
> ++++ b/glib/tests/bytes.c
> +@@ -10,12 +10,12 @@
> +  */
> + 
> + #undef G_DISABLE_ASSERT
> +-#undef G_LOG_DOMAIN
> + 
> + #include <stdio.h>
> + #include <stdlib.h>
> + #include <string.h>
> + #include "glib.h"
> ++#include "glib/gstrfuncsprivate.h"
> + 
> + /* Keep in sync with glib/gbytes.c */
> + struct _GBytes
> +@@ -334,6 +334,38 @@ test_to_array_transferred (void)
> + }
> + 
> + static void
> ++test_to_array_transferred_oversize (void)
> ++{
> ++  g_test_message ("g_bytes_unref_to_array() can only take GBytes up
> to "
> ++                  "G_MAXUINT in length; test that longer ones are
> rejected");
> ++
> ++  if (sizeof (guint) >= sizeof (gsize))
> ++    {
> ++      g_test_skip ("Skipping test as guint is not smaller than
> gsize");
> ++    }
> ++  else if (g_test_undefined ())
> ++    {
> ++      GByteArray *array = NULL;
> ++      GBytes *bytes = NULL;
> ++      gpointer data = g_memdup2 (NYAN, N_NYAN);
> ++      gsize len = ((gsize) G_MAXUINT) + 1;
> ++
> ++      bytes = g_bytes_new_take (data, len);
> ++      g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
> ++                             "g_byte_array_new_take: assertion 'len
> <= G_MAXUINT' failed");
> ++      array = g_bytes_unref_to_array (g_steal_pointer (&bytes));
> ++      g_test_assert_expected_messages ();
> ++      g_assert_null (array);
> ++
> ++      g_free (data);
> ++    }
> ++  else
> ++    {
> ++      g_test_skip ("Skipping test as testing undefined behaviour is
> disabled");
> ++    }
> ++}
> ++
> ++static void
> + test_to_array_two_refs (void)
> + {
> +   gconstpointer memory;
> +@@ -410,6 +442,7 @@ main (int argc, char *argv[])
> +   g_test_add_func ("/bytes/to-array/transfered",
> test_to_array_transferred);
> +   g_test_add_func ("/bytes/to-array/two-refs",
> test_to_array_two_refs);
> +   g_test_add_func ("/bytes/to-array/non-malloc",
> test_to_array_non_malloc);
> ++  g_test_add_func ("/bytes/to-array/transferred/oversize",
> test_to_array_transferred_oversize);
> +   g_test_add_func ("/bytes/null", test_null);
> + 
> +   return g_test_run ();
> diff --git a/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 01.patch b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-01.patch
> new file mode 100644
> index 0000000000..3ded039633
> --- /dev/null
> +++ b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-01.patch
> @@ -0,0 +1,169 @@
> +Backport of:
> +
> +From 5e5f75a77e399c638be66d74e5daa8caeb433e00 Mon Sep 17 00:00:00 2001
> +From: Philip Withnall <[email protected]>
> +Date: Thu, 4 Feb 2021 13:30:52 +0000
> +Subject: [PATCH 01/11] gstrfuncs: Add internal g_memdup2() function
> +MIME-Version: 1.0
> +Content-Type: text/plain; charset=UTF-8
> +Content-Transfer-Encoding: 8bit
> +
> +This will replace the existing `g_memdup()` function for use within
> +GLib. It has an unavoidable security flaw of taking its `byte_size`
> +argument as a `guint` rather than as a `gsize`. Most callers will
> +expect it to be a `gsize`, and may pass in large values which could
> +silently be truncated, resulting in an undersize allocation compared
> +to what the caller expects.
> +
> +This could lead to a classic buffer overflow vulnerability for many
> +callers of `g_memdup()`.
> +
> +`g_memdup2()`, in comparison, takes its `byte_size` as a `gsize`.
> +
> +Spotted by Kevin Backhouse of GHSL.
> +
> +In GLib 2.68, `g_memdup2()` will be a new public API. In this version
> +for backport to older stable releases, it’s a new `static inline` API
> +in a private header, so that use of `g_memdup()` within GLib can be
> +fixed without adding a new API in a stable release series.
> +
> +Signed-off-by: Philip Withnall <[email protected]>
> +Helps: GHSL-2021-045
> +Helps: #2319
> +
> +Upstream-Status: Backport
> [https://mirrors.ocf.berkeley.edu/ubuntu/pool/main/g/glib2.0/glib2.0_2.64.6-1~ubuntu20.04.3.debian.tar.xz
> ]
> +CVE: CVE-2021-27219
> +Signed-off-by: Neetika Singh <[email protected]>
> +Signed-off-by: Ranjitsinh Rathod <[email protected]>
> +---
> + docs/reference/glib/meson.build |  1 +
> + glib/gstrfuncsprivate.h         | 55
> +++++++++++++++++++++++++++++++++
> + glib/meson.build                |  1 +
> + glib/tests/strfuncs.c           | 23 ++++++++++++++
> + 4 files changed, 80 insertions(+)
> + create mode 100644 glib/gstrfuncsprivate.h
> +
> +--- a/docs/reference/glib/meson.build
> ++++ b/docs/reference/glib/meson.build
> +@@ -22,6 +22,7 @@ if get_option('gtk_doc')
> +     'gprintfint.h',
> +     'gmirroringtable.h',
> +     'gscripttable.h',
> ++    'gstrfuncsprivate.h',
> +     'glib-mirroring-tab',
> +     'gnulib',
> +     'pcre',
> +--- /dev/null
> ++++ b/glib/gstrfuncsprivate.h
> +@@ -0,0 +1,55 @@
> ++/* GLIB - Library of useful routines for C programming
> ++ * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh
> MacDonald
> ++ *
> ++ * 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/>.
> ++ */
> ++
> ++#include <glib.h>
> ++#include <string.h>
> ++
> ++/*
> ++ * g_memdup2:
> ++ * @mem: (nullable): the memory to copy.
> ++ * @byte_size: the number of bytes to copy.
> ++ *
> ++ * Allocates @byte_size bytes of memory, and copies @byte_size bytes
> into it
> ++ * from @mem. If @mem is %NULL it returns %NULL.
> ++ *
> ++ * This replaces g_memdup(), which was prone to integer overflows
> when
> ++ * converting the argument from a #gsize to a #guint.
> ++ *
> ++ * This static inline version is a backport of the new public API
> from
> ++ * GLib 2.68, kept internal to GLib for backport to older stable
> releases.
> ++ * See https://gitlab.gnome.org/GNOME/glib/-/issues/2319.
> ++ *
> ++ * Returns: (nullable): a pointer to the newly-allocated copy of the
> memory,
> ++ *    or %NULL if @mem is %NULL.
> ++ * Since: 2.68
> ++ */
> ++static inline gpointer
> ++g_memdup2 (gconstpointer mem,
> ++           gsize         byte_size)
> ++{
> ++  gpointer new_mem;
> ++
> ++  if (mem && byte_size != 0)
> ++    {
> ++      new_mem = g_malloc (byte_size);
> ++      memcpy (new_mem, mem, byte_size);
> ++    }
> ++  else
> ++    new_mem = NULL;
> ++
> ++  return new_mem;
> ++}
> +--- a/glib/meson.build
> ++++ b/glib/meson.build
> +@@ -268,6 +268,7 @@ glib_sources = files(
> +   'gslist.c',
> +   'gstdio.c',
> +   'gstrfuncs.c',
> ++  'gstrfuncsprivate.h',
> +   'gstring.c',
> +   'gstringchunk.c',
> +   'gtestutils.c',
> +--- a/glib/tests/strfuncs.c
> ++++ b/glib/tests/strfuncs.c
> +@@ -32,6 +32,8 @@
> + #include <string.h>
> + #include "glib.h"
> + 
> ++#include "gstrfuncsprivate.h"
> ++
> + #if defined (_MSC_VER) && (_MSC_VER <= 1800)
> + #define isnan(x) _isnan(x)
> + 
> +@@ -219,6 +221,26 @@ test_memdup (void)
> +   g_free (str_dup);
> + }
> + 
> ++/* Testing g_memdup2() function with various positive and negative
> cases */
> ++static void
> ++test_memdup2 (void)
> ++{
> ++  gchar *str_dup = NULL;
> ++  const gchar *str = "The quick brown fox jumps over the lazy dog";
> ++
> ++  /* Testing negative cases */
> ++  g_assert_null (g_memdup2 (NULL, 1024));
> ++  g_assert_null (g_memdup2 (str, 0));
> ++  g_assert_null (g_memdup2 (NULL, 0));
> ++
> ++  /* Testing normal usage cases */
> ++  str_dup = g_memdup2 (str, strlen (str) + 1);
> ++  g_assert_nonnull (str_dup);
> ++  g_assert_cmpstr (str, ==, str_dup);
> ++
> ++  g_free (str_dup);
> ++}
> ++
> + /* Testing g_strpcpy() function with various positive and negative
> cases */
> + static void
> + test_stpcpy (void)
> +@@ -2523,6 +2545,7 @@ main (int   argc,
> +   g_test_add_func ("/strfuncs/has-prefix", test_has_prefix);
> +   g_test_add_func ("/strfuncs/has-suffix", test_has_suffix);
> +   g_test_add_func ("/strfuncs/memdup", test_memdup);
> ++  g_test_add_func ("/strfuncs/memdup2", test_memdup2);
> +   g_test_add_func ("/strfuncs/stpcpy", test_stpcpy);
> +   g_test_add_func ("/strfuncs/str_match_string",
> test_str_match_string);
> +   g_test_add_func ("/strfuncs/str_tokenize_and_fold",
> test_str_tokenize_and_fold);
> diff --git a/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 02.patch b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-02.patch
> new file mode 100644
> index 0000000000..b305b30234
> --- /dev/null
> +++ b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-02.patch
> @@ -0,0 +1,248 @@
> +From be8834340a2d928ece82025463ae23dee2c333d0 Mon Sep 17 00:00:00 2001
> +From: Philip Withnall <[email protected]>
> +Date: Thu, 4 Feb 2021 13:37:56 +0000
> +Subject: [PATCH 02/11] gio: Use g_memdup2() instead of g_memdup() in
> obvious
> + places
> +MIME-Version: 1.0
> +Content-Type: text/plain; charset=UTF-8
> +Content-Transfer-Encoding: 8bit
> +
> +Convert all the call sites which use `g_memdup()`’s length argument
> +trivially (for example, by passing a `sizeof()`), so that they use
> +`g_memdup2()` instead.
> +
> +In almost all of these cases the use of `g_memdup()` would not have
> +caused problems, but it will soon be deprecated, so best port away
> from
> +it.
> +
> +Signed-off-by: Philip Withnall <[email protected]>
> +Helps: #2319
> +
> +Upstream-Status: Backport
> [https://mirrors.ocf.berkeley.edu/ubuntu/pool/main/g/glib2.0/glib2.0_2.64.6-1~ubuntu20.04.3.debian.tar.xz
> ]
> +CVE: CVE-2021-27219
> +Signed-off-by: Neetika Singh <[email protected]>
> +Signed-off-by: Ranjitsinh Rathod <[email protected]>
> +---
> + gio/gdbusconnection.c                 | 5 +++--
> + gio/gdbusinterfaceskeleton.c          | 3 ++-
> + gio/gfile.c                           | 7 ++++---
> + gio/gsettingsschema.c                 | 5 +++--
> + gio/gwin32registrykey.c               | 8 +++++---
> + gio/tests/async-close-output-stream.c | 6 ++++--
> + gio/tests/gdbus-export.c              | 5 +++--
> + gio/win32/gwinhttpfile.c              | 9 +++++----
> + 8 files changed, 29 insertions(+), 19 deletions(-)
> +
> +--- a/gio/gdbusconnection.c
> ++++ b/gio/gdbusconnection.c
> +@@ -110,6 +110,7 @@
> + #include "gasyncinitable.h"
> + #include "giostream.h"
> + #include "gasyncresult.h"
> ++#include "gstrfuncsprivate.h"
> + #include "gtask.h"
> + #include "gmarshal-internal.h"
> + 
> +@@ -4007,7 +4008,7 @@ _g_dbus_interface_vtable_copy (const GDB
> +   /* Don't waste memory by copying padding - remember to update this
> +    * when changing struct _GDBusInterfaceVTable in gdbusconnection.h
> +    */
> +-  return g_memdup ((gconstpointer) vtable, 3 * sizeof (gpointer));
> ++  return g_memdup2 ((gconstpointer) vtable, 3 * sizeof (gpointer));
> + }
> + 
> + static void
> +@@ -4024,7 +4025,7 @@ _g_dbus_subtree_vtable_copy (const GDBus
> +   /* Don't waste memory by copying padding - remember to update this
> +    * when changing struct _GDBusSubtreeVTable in gdbusconnection.h
> +    */
> +-  return g_memdup ((gconstpointer) vtable, 3 * sizeof (gpointer));
> ++  return g_memdup2 ((gconstpointer) vtable, 3 * sizeof (gpointer));
> + }
> + 
> + static void
> +--- a/gio/gdbusinterfaceskeleton.c
> ++++ b/gio/gdbusinterfaceskeleton.c
> +@@ -28,6 +28,7 @@
> + #include "gdbusmethodinvocation.h"
> + #include "gdbusconnection.h"
> + #include "gmarshal-internal.h"
> ++#include "gstrfuncsprivate.h"
> + #include "gtask.h"
> + #include "gioerror.h"
> + 
> +@@ -701,7 +702,7 @@ add_connection_locked (GDBusInterfaceSke
> +        * properly before building the hooked_vtable, so we create it
> +        * once at the last minute.
> +        */
> +-      interface_->priv->hooked_vtable = g_memdup
> (g_dbus_interface_skeleton_get_vtable (interface_), sizeof
> (GDBusInterfaceVTable));
> ++      interface_->priv->hooked_vtable = g_memdup2
> (g_dbus_interface_skeleton_get_vtable (interface_), sizeof
> (GDBusInterfaceVTable));
> +       interface_->priv->hooked_vtable->method_call =
> skeleton_intercept_handle_method_call;
> +     }
> + 
> +--- a/gio/gfile.c
> ++++ b/gio/gfile.c
> +@@ -60,6 +60,7 @@
> + #include "gasyncresult.h"
> + #include "gioerror.h"
> + #include "glibintl.h"
> ++#include "gstrfuncsprivate.h"
> + 
> + 
> + /**
> +@@ -7854,7 +7855,7 @@ measure_disk_usage_progress (gboolean re
> +   g_main_context_invoke_full (g_task_get_context (task),
> +                               g_task_get_priority (task),
> +                               measure_disk_usage_invoke_progress,
> +-                              g_memdup (&progress, sizeof progress),
> ++                              g_memdup2 (&progress, sizeof progress),
> +                               g_free);
> + }
> + 
> +@@ -7872,7 +7873,7 @@ measure_disk_usage_thread (GTask
> +                                  data->progress_callback ?
> measure_disk_usage_progress : NULL, task,
> +                                  &result.disk_usage,
> &result.num_dirs, &result.num_files,
> +                                  &error))
> +-    g_task_return_pointer (task, g_memdup (&result, sizeof result),
> g_free);
> ++    g_task_return_pointer (task, g_memdup2 (&result, sizeof result),
> g_free);
> +   else
> +     g_task_return_error (task, error);
> + }
> +@@ -7896,7 +7897,7 @@ g_file_real_measure_disk_usage_async (GF
> + 
> +   task = g_task_new (file, cancellable, callback, user_data);
> +   g_task_set_source_tag (task, g_file_real_measure_disk_usage_async);
> +-  g_task_set_task_data (task, g_memdup (&data, sizeof data), g_free);
> ++  g_task_set_task_data (task, g_memdup2 (&data, sizeof data),
> g_free);
> +   g_task_set_priority (task, io_priority);
> + 
> +   g_task_run_in_thread (task, measure_disk_usage_thread);
> +--- a/gio/gsettingsschema.c
> ++++ b/gio/gsettingsschema.c
> +@@ -20,6 +20,7 @@
> + 
> + #include "gsettingsschema-internal.h"
> + #include "gsettings.h"
> ++#include "gstrfuncsprivate.h"
> + 
> + #include "gvdb/gvdb-reader.h"
> + #include "strinfo.c"
> +@@ -1067,9 +1068,9 @@ g_settings_schema_list_children (GSettin
> + 
> +       if (g_str_has_suffix (key, "/"))
> +         {
> +-          gint length = strlen (key);
> ++          gsize length = strlen (key);
> + 
> +-          strv[j] = g_memdup (key, length);
> ++          strv[j] = g_memdup2 (key, length);
> +           strv[j][length - 1] = '\0';
> +           j++;
> +         }
> +--- a/gio/gwin32registrykey.c
> ++++ b/gio/gwin32registrykey.c
> +@@ -28,6 +28,8 @@
> + #include <ntstatus.h>
> + #include <winternl.h>
> + 
> ++#include "gstrfuncsprivate.h"
> ++
> + #ifndef _WDMDDK_
> + typedef enum _KEY_INFORMATION_CLASS {
> +   KeyBasicInformation,
> +@@ -247,7 +249,7 @@ g_win32_registry_value_iter_copy (const
> +   new_iter->value_name_size = iter->value_name_size;
> + 
> +   if (iter->value_data != NULL)
> +-    new_iter->value_data = g_memdup (iter->value_data, iter-
> >value_data_size);
> ++    new_iter->value_data = g_memdup2 (iter->value_data, iter-
> >value_data_size);
> + 
> +   new_iter->value_data_size = iter->value_data_size;
> + 
> +@@ -268,8 +270,8 @@ g_win32_registry_value_iter_copy (const
> +   new_iter->value_data_expanded_charsize = iter-
> >value_data_expanded_charsize;
> + 
> +   if (iter->value_data_expanded_u8 != NULL)
> +-    new_iter->value_data_expanded_u8 = g_memdup (iter-
> >value_data_expanded_u8,
> +-                                                 iter-
> >value_data_expanded_charsize);
> ++    new_iter->value_data_expanded_u8 = g_memdup2 (iter-
> >value_data_expanded_u8,
> ++                                                  iter-
> >value_data_expanded_charsize);
> + 
> +   new_iter->value_data_expanded_u8_size = iter-
> >value_data_expanded_charsize;
> + 
> +--- a/gio/tests/async-close-output-stream.c
> ++++ b/gio/tests/async-close-output-stream.c
> +@@ -24,6 +24,8 @@
> + #include <stdlib.h>
> + #include <string.h>
> + 
> ++#include "gstrfuncsprivate.h"
> ++
> + #define DATA_TO_WRITE "Hello world\n"
> + 
> + typedef struct
> +@@ -147,9 +149,9 @@ prepare_data (SetupData *data,
> + 
> +   data->expected_size = g_memory_output_stream_get_data_size
> (G_MEMORY_OUTPUT_STREAM (data->data_stream));
> + 
> +-  g_assert_cmpint (data->expected_size, >, 0);
> ++  g_assert_cmpuint (data->expected_size, >, 0);
> + 
> +-  data->expected_output = g_memdup (written, (guint)data-
> >expected_size);
> ++  data->expected_output = g_memdup2 (written, data->expected_size);
> + 
> +   /* then recreate the streams and prepare them for the asynchronous
> close */
> +   destroy_streams (data);
> +--- a/gio/tests/gdbus-export.c
> ++++ b/gio/tests/gdbus-export.c
> +@@ -23,6 +23,7 @@
> + #include <string.h>
> + 
> + #include "gdbus-tests.h"
> ++#include "gstrfuncsprivate.h"
> + 
> + /* all tests rely on a shared mainloop */
> + static GMainLoop *loop = NULL;
> +@@ -671,7 +672,7 @@ subtree_introspect (GDBusConnection
> +       g_assert_not_reached ();
> +     }
> + 
> +-  return g_memdup (interfaces, 2 * sizeof (void *));
> ++  return g_memdup2 (interfaces, 2 * sizeof (void *));
> + }
> + 
> + static const GDBusInterfaceVTable *
> +@@ -727,7 +728,7 @@ dynamic_subtree_introspect (GDBusConnect
> + {
> +   const GDBusInterfaceInfo *interfaces[2] = { &dyna_interface_info,
> NULL };
> + 
> +-  return g_memdup (interfaces, 2 * sizeof (void *));
> ++  return g_memdup2 (interfaces, 2 * sizeof (void *));
> + }
> + 
> + static const GDBusInterfaceVTable *
> +--- a/gio/win32/gwinhttpfile.c
> ++++ b/gio/win32/gwinhttpfile.c
> +@@ -29,6 +29,7 @@
> + #include "gio/gfile.h"
> + #include "gio/gfileattribute.h"
> + #include "gio/gfileinfo.h"
> ++#include "gstrfuncsprivate.h"
> + #include "gwinhttpfile.h"
> + #include "gwinhttpfileinputstream.h"
> + #include "gwinhttpfileoutputstream.h"
> +@@ -393,10 +394,10 @@
> +   child = g_object_new (G_TYPE_WINHTTP_FILE, NULL);
> +   child->vfs = winhttp_file->vfs;
> +   child->url = winhttp_file->url;
> +-  child->url.lpszScheme = g_memdup (winhttp_file->url.lpszScheme,
> (winhttp_file->url.dwSchemeLength+1)*2);
> +-  child->url.lpszHostName = g_memdup (winhttp_file->url.lpszHostName,
> (winhttp_file->url.dwHostNameLength+1)*2);
> +-  child->url.lpszUserName = g_memdup (winhttp_file->url.lpszUserName,
> (winhttp_file->url.dwUserNameLength+1)*2);
> +-  child->url.lpszPassword = g_memdup (winhttp_file->url.lpszPassword,
> (winhttp_file->url.dwPasswordLength+1)*2);
> ++  child->url.lpszScheme = g_memdup2 (winhttp_file->url.lpszScheme,
> (winhttp_file->url.dwSchemeLength+1)*2);
> ++  child->url.lpszHostName = g_memdup2 (winhttp_file-
> >url.lpszHostName, (winhttp_file->url.dwHostNameLength+1)*2);
> ++  child->url.lpszUserName = g_memdup2 (winhttp_file-
> >url.lpszUserName, (winhttp_file->url.dwUserNameLength+1)*2);
> ++  child->url.lpszPassword = g_memdup2 (winhttp_file-
> >url.lpszPassword, (winhttp_file->url.dwPasswordLength+1)*2);
> +   child->url.lpszUrlPath = wnew_path;
> +   child->url.dwUrlPathLength = wcslen (wnew_path);
> +   child->url.lpszExtraInfo = NULL;
> diff --git a/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 03.patch b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-03.patch
> new file mode 100644
> index 0000000000..17a8ef80b2
> --- /dev/null
> +++ b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-03.patch
> @@ -0,0 +1,130 @@
> +From 6110caea45b235420b98cd41d845cc92238f6781 Mon Sep 17 00:00:00 2001
> +From: Philip Withnall <[email protected]>
> +Date: Thu, 4 Feb 2021 13:39:25 +0000
> +Subject: [PATCH 03/11] gobject: Use g_memdup2() instead of g_memdup()
> in
> + obvious places
> +MIME-Version: 1.0
> +Content-Type: text/plain; charset=UTF-8
> +Content-Transfer-Encoding: 8bit
> +
> +Convert all the call sites which use `g_memdup()`’s length argument
> +trivially (for example, by passing a `sizeof()`), so that they use
> +`g_memdup2()` instead.
> +
> +In almost all of these cases the use of `g_memdup()` would not have
> +caused problems, but it will soon be deprecated, so best port away
> from
> +it.
> +
> +Signed-off-by: Philip Withnall <[email protected]>
> +Helps: #2319
> +
> +Upstream-Status: Backport
> [https://mirrors.ocf.berkeley.edu/ubuntu/pool/main/g/glib2.0/glib2.0_2.64.6-1~ubuntu20.04.3.debian.tar.xz
> ]
> +CVE: CVE-2021-27219
> +Signed-off-by: Neetika Singh <[email protected]>
> +Signed-off-by: Ranjitsinh Rathod <[email protected]>
> +---
> + gobject/gsignal.c     | 3 ++-
> + gobject/gtype.c       | 9 +++++----
> + gobject/gtypemodule.c | 3 ++-
> + gobject/tests/param.c | 4 +++-
> + 4 files changed, 12 insertions(+), 7 deletions(-)
> +
> +--- a/gobject/gsignal.c
> ++++ b/gobject/gsignal.c
> +@@ -28,6 +28,7 @@
> + #include <signal.h>
> + 
> + #include "gsignal.h"
> ++#include "gstrfuncsprivate.h"
> + #include "gtype-private.h"
> + #include "gbsearcharray.h"
> + #include "gvaluecollector.h"
> +@@ -1809,7 +1810,7 @@ g_signal_newv (const gchar       *signal
> +   node->single_va_closure_is_valid = FALSE;
> +   node->flags = signal_flags & G_SIGNAL_FLAGS_MASK;
> +   node->n_params = n_params;
> +-  node->param_types = g_memdup (param_types, sizeof (GType) *
> n_params);
> ++  node->param_types = g_memdup2 (param_types, sizeof (GType) *
> n_params);
> +   node->return_type = return_type;
> +   node->class_closure_bsa = NULL;
> +   if (accumulator)
> +--- a/gobject/gtype.c
> ++++ b/gobject/gtype.c
> +@@ -33,6 +33,7 @@
> + 
> + #include "glib-private.h"
> + #include "gconstructor.h"
> ++#include "gstrfuncsprivate.h"
> + 
> + #ifdef G_OS_WIN32
> + #include <windows.h>
> +@@ -1470,7 +1471,7 @@ type_add_interface_Wm (TypeNode
> +   iholder->next = iface_node_get_holders_L (iface);
> +   iface_node_set_holders_W (iface, iholder);
> +   iholder->instance_type = NODE_TYPE (node);
> +-  iholder->info = info ? g_memdup (info, sizeof (*info)) : NULL;
> ++  iholder->info = info ? g_memdup2 (info, sizeof (*info)) : NULL;
> +   iholder->plugin = plugin;
> + 
> +   /* create an iface entry for this type */
> +@@ -1731,7 +1732,7 @@ type_iface_retrieve_holder_info_Wm (Type
> +         INVALID_RECURSION ("g_type_plugin_*", iholder->plugin,
> NODE_NAME (iface));
> +       
> +       check_interface_info_I (iface, instance_type, &tmp_info);
> +-      iholder->info = g_memdup (&tmp_info, sizeof (tmp_info));
> ++      iholder->info = g_memdup2 (&tmp_info, sizeof (tmp_info));
> +     }
> +   
> +   return iholder;     /* we don't modify write lock upon returning
> NULL */
> +@@ -2016,10 +2017,10 @@ type_iface_vtable_base_init_Wm (TypeNode
> +       IFaceEntry *pentry = type_lookup_iface_entry_L (pnode, iface);
> +       
> +       if (pentry)
> +-      vtable = g_memdup (pentry->vtable, iface->data-
> >iface.vtable_size);
> ++      vtable = g_memdup2 (pentry->vtable, iface->data-
> >iface.vtable_size);
> +     }
> +   if (!vtable)
> +-    vtable = g_memdup (iface->data->iface.dflt_vtable, iface->data-
> >iface.vtable_size);
> ++    vtable = g_memdup2 (iface->data->iface.dflt_vtable, iface->data-
> >iface.vtable_size);
> +   entry->vtable = vtable;
> +   vtable->g_type = NODE_TYPE (iface);
> +   vtable->g_instance_type = NODE_TYPE (node);
> +--- a/gobject/gtypemodule.c
> ++++ b/gobject/gtypemodule.c
> +@@ -19,6 +19,7 @@
> + 
> + #include <stdlib.h>
> + 
> ++#include "gstrfuncsprivate.h"
> + #include "gtypeplugin.h"
> + #include "gtypemodule.h"
> + 
> +@@ -436,7 +437,7 @@ g_type_module_register_type (GTypeModule
> +   module_type_info->loaded = TRUE;
> +   module_type_info->info = *type_info;
> +   if (type_info->value_table)
> +-    module_type_info->info.value_table = g_memdup (type_info-
> >value_table,
> ++    module_type_info->info.value_table = g_memdup2 (type_info-
> >value_table,
> +                                                  sizeof
> (GTypeValueTable));
> + 
> +   return module_type_info->type;
> +--- a/gobject/tests/param.c
> ++++ b/gobject/tests/param.c
> +@@ -2,6 +2,8 @@
> + #include <glib-object.h>
> + #include <stdlib.h>
> + 
> ++#include "gstrfuncsprivate.h"
> ++
> + static void
> + test_param_value (void)
> + {
> +@@ -874,7 +876,7 @@ main (int argc, char *argv[])
> +             test_path = g_strdup_printf
> ("/param/implement/subprocess/%d-%d-%d-%d",
> +                                          data.change_this_flag,
> data.change_this_type,
> +                                          data.use_this_flag,
> data.use_this_type);
> +-            test_data = g_memdup (&data, sizeof
> (TestParamImplementData));
> ++            test_data = g_memdup2 (&data, sizeof
> (TestParamImplementData));
> +             g_test_add_data_func_full (test_path, test_data,
> test_param_implement_child, g_free);
> +             g_free (test_path);
> +           }
> diff --git a/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 04.patch b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-04.patch
> new file mode 100644
> index 0000000000..b6d441dba7
> --- /dev/null
> +++ b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-04.patch
> @@ -0,0 +1,297 @@
> +Backport of:
> +
> +From 0736b7c1e7cf4232c5d7eb2b0fbfe9be81bd3baa Mon Sep 17 00:00:00 2001
> +From: Philip Withnall <[email protected]>
> +Date: Thu, 4 Feb 2021 13:41:21 +0000
> +Subject: [PATCH 04/11] glib: Use g_memdup2() instead of g_memdup() in
> obvious
> + places
> +MIME-Version: 1.0
> +Content-Type: text/plain; charset=UTF-8
> +Content-Transfer-Encoding: 8bit
> +
> +Convert all the call sites which use `g_memdup()`’s length argument
> +trivially (for example, by passing a `sizeof()` or an existing `gsize`
> +variable), so that they use `g_memdup2()` instead.
> +
> +In almost all of these cases the use of `g_memdup()` would not have
> +caused problems, but it will soon be deprecated, so best port away
> from
> +it
> +
> +In particular, this fixes an overflow within `g_bytes_new()`,
> identified
> +as GHSL-2021-045 by GHSL team member Kevin Backhouse.
> +
> +Signed-off-by: Philip Withnall <[email protected]>
> +Fixes: GHSL-2021-045
> +Helps: #2319
> +
> +Upstream-Status: Backport
> [https://mirrors.ocf.berkeley.edu/ubuntu/pool/main/g/glib2.0/glib2.0_2.64.6-1~ubuntu20.04.3.debian.tar.xz
> ]
> +CVE: CVE-2021-27219
> +Signed-off-by: Neetika Singh <[email protected]>
> +Signed-off-by: Ranjitsinh Rathod <[email protected]>
> +---
> + glib/gbytes.c               | 6 ++++--
> + glib/gdir.c                 | 3 ++-
> + glib/ghash.c                | 7 ++++---
> + glib/giochannel.c           | 5 +++--
> + glib/gslice.c               | 3 ++-
> + glib/gtestutils.c           | 3 ++-
> + glib/gvariant.c             | 7 ++++---
> + glib/gvarianttype.c         | 3 ++-
> + glib/tests/array-test.c     | 4 +++-
> + glib/tests/option-context.c | 6 ++++--
> + glib/tests/uri.c            | 8 +++++---
> + 11 files changed, 35 insertions(+), 20 deletions(-)
> +
> +--- a/glib/gbytes.c
> ++++ b/glib/gbytes.c
> +@@ -34,6 +34,8 @@
> + 
> + #include <string.h>
> + 
> ++#include "gstrfuncsprivate.h"
> ++
> + /**
> +  * GBytes:
> +  *
> +@@ -95,7 +97,7 @@ g_bytes_new (gconstpointer data,
> + {
> +   g_return_val_if_fail (data != NULL || size == 0, NULL);
> + 
> +-  return g_bytes_new_take (g_memdup (data, size), size);
> ++  return g_bytes_new_take (g_memdup2 (data, size), size);
> + }
> + 
> + /**
> +@@ -499,7 +501,7 @@ g_bytes_unref_to_data (GBytes *bytes,
> +        * Copy: Non g_malloc (or compatible) allocator, or static
> memory,
> +        * so we have to copy, and then unref.
> +        */
> +-      result = g_memdup (bytes->data, bytes->size);
> ++      result = g_memdup2 (bytes->data, bytes->size);
> +       *size = bytes->size;
> +       g_bytes_unref (bytes);
> +     }
> +--- a/glib/gdir.c
> ++++ b/glib/gdir.c
> +@@ -37,6 +37,7 @@
> + #include "gconvert.h"
> + #include "gfileutils.h"
> + #include "gstrfuncs.h"
> ++#include "gstrfuncsprivate.h"
> + #include "gtestutils.h"
> + #include "glibintl.h"
> + 
> +@@ -112,7 +113,7 @@ g_dir_open_with_errno (const gchar *path
> +     return NULL;
> + #endif
> + 
> +-  return g_memdup (&dir, sizeof dir);
> ++  return g_memdup2 (&dir, sizeof dir);
> + }
> + 
> + /**
> +--- a/glib/ghash.c
> ++++ b/glib/ghash.c
> +@@ -34,6 +34,7 @@
> + #include "gmacros.h"
> + #include "glib-private.h"
> + #include "gstrfuncs.h"
> ++#include "gstrfuncsprivate.h"
> + #include "gatomic.h"
> + #include "gtestutils.h"
> + #include "gslice.h"
> +@@ -962,7 +963,7 @@ g_hash_table_ensure_keyval_fits (GHashTa
> +       if (hash_table->have_big_keys)
> +         {
> +           if (key != value)
> +-            hash_table->values = g_memdup (hash_table->keys, sizeof
> (gpointer) * hash_table->size);
> ++            hash_table->values = g_memdup2 (hash_table->keys, sizeof
> (gpointer) * hash_table->size);
> +           /* Keys and values are both big now, so no need for further
> checks */
> +           return;
> +         }
> +@@ -970,7 +971,7 @@ g_hash_table_ensure_keyval_fits (GHashTa
> +         {
> +           if (key != value)
> +             {
> +-              hash_table->values = g_memdup (hash_table->keys, sizeof
> (guint) * hash_table->size);
> ++              hash_table->values = g_memdup2 (hash_table->keys,
> sizeof (guint) * hash_table->size);
> +               is_a_set = FALSE;
> +             }
> +         }
> +@@ -998,7 +999,7 @@ g_hash_table_ensure_keyval_fits (GHashTa
> + 
> +   /* Just split if necessary */
> +   if (is_a_set && key != value)
> +-    hash_table->values = g_memdup (hash_table->keys, sizeof
> (gpointer) * hash_table->size);
> ++    hash_table->values = g_memdup2 (hash_table->keys, sizeof
> (gpointer) * hash_table->size);
> + 
> + #endif
> + }
> +--- a/glib/giochannel.c
> ++++ b/glib/giochannel.c
> +@@ -35,7 +35,7 @@
> + #include <errno.h>
> +
> + #include "giochannel.h"
> +-
> ++#include "gstrfuncsprivate.h"
> + #include "gstrfuncs.h"
> + #include "gtestutils.h"
> + #include "glibintl.h"
> +
> +@@ -1673,10 +1674,10 @@ g_io_channel_read_line (GIOChannel  *cha
> +
> +       /* Copy the read bytes (including any embedded nuls) and nul-
> terminate.
> +        * `USE_BUF (channel)->str` is guaranteed to be nul-terminated
> as it’s a
> +-       * #GString, so it’s safe to call g_memdup() with +1 length to
> allocate
> ++       * #GString, so it’s safe to call g_memdup2() with +1 length to
> allocate
> +        * a nul-terminator. */
> +       g_assert (USE_BUF (channel));
> +-      line = g_memdup (USE_BUF (channel)->str, got_length + 1);
> ++      line = g_memdup2 (USE_BUF (channel)->str, got_length + 1);
> +       line[got_length] = '\0';
> +       *str_return = g_steal_pointer (&line);
> +       g_string_erase (USE_BUF (channel), 0, got_length);
> +--- a/glib/gslice.c
> ++++ b/glib/gslice.c
> +@@ -41,6 +41,7 @@
> + #include "gmain.h"
> + #include "gmem.h"               /* gslice.h */
> + #include "gstrfuncs.h"
> ++#include "gstrfuncsprivate.h"
> + #include "gutils.h"
> + #include "gtrashstack.h"
> + #include "gtestutils.h"
> +@@ -350,7 +351,7 @@ g_slice_get_config_state (GSliceConfig c
> +       array[i++] = allocator->contention_counters[address];
> +       array[i++] = allocator_get_magazine_threshold (allocator,
> address);
> +       *n_values = i;
> +-      return g_memdup (array, sizeof (array[0]) * *n_values);
> ++      return g_memdup2 (array, sizeof (array[0]) * *n_values);
> +     default:
> +       return NULL;
> +     }
> +--- a/glib/gtestutils.c
> ++++ b/glib/gtestutils.c
> +@@ -49,6 +49,7 @@
> + #include "gpattern.h"
> + #include "grand.h"
> + #include "gstrfuncs.h"
> ++#include "gstrfuncsprivate.h"
> + #include "gtimer.h"
> + #include "gslice.h"
> + #include "gspawn.h"
> +@@ -3803,7 +3804,7 @@ g_test_log_extract (GTestLogBuffer *tbuf
> +       if (p <= tbuffer->data->str + mlength)
> +         {
> +           g_string_erase (tbuffer->data, 0, mlength);
> +-          tbuffer->msgs = g_slist_prepend (tbuffer->msgs, g_memdup
> (&msg, sizeof (msg)));
> ++          tbuffer->msgs = g_slist_prepend (tbuffer->msgs, g_memdup2
> (&msg, sizeof (msg)));
> +           return TRUE;
> +         }
> + 
> +--- a/glib/gvariant.c
> ++++ b/glib/gvariant.c
> +@@ -33,6 +33,7 @@
> + 
> + #include <string.h>
> + 
> ++#include "gstrfuncsprivate.h"
> + 
> + /**
> +  * SECTION:gvariant
> +@@ -725,7 +726,7 @@ g_variant_new_variant (GVariant *value)
> +   g_variant_ref_sink (value);
> + 
> +   return g_variant_new_from_children (G_VARIANT_TYPE_VARIANT,
> +-                                      g_memdup (&value, sizeof
> value),
> ++                                      g_memdup2 (&value, sizeof
> value),
> +                                       1, g_variant_is_trusted
> (value));
> + }
> + 
> +@@ -1229,7 +1230,7 @@ g_variant_new_fixed_array (const GVarian
> +       return NULL;
> +     }
> + 
> +-  data = g_memdup (elements, n_elements * element_size);
> ++  data = g_memdup2 (elements, n_elements * element_size);
> +   value = g_variant_new_from_data (array_type, data,
> +                                    n_elements * element_size,
> +                                    FALSE, g_free, data);
> +@@ -1908,7 +1909,7 @@ g_variant_dup_bytestring (GVariant *valu
> +   if (length)
> +     *length = size;
> + 
> +-  return g_memdup (original, size + 1);
> ++  return g_memdup2 (original, size + 1);
> + }
> + 
> + /**
> +--- a/glib/gvarianttype.c
> ++++ b/glib/gvarianttype.c
> +@@ -28,6 +28,7 @@
> + 
> + #include <string.h>
> + 
> ++#include "gstrfuncsprivate.h"
> + 
> + /**
> +  * SECTION:gvarianttype
> +@@ -1181,7 +1182,7 @@ g_variant_type_new_tuple (const GVariant
> +   g_assert (offset < sizeof buffer);
> +   buffer[offset++] = ')';
> + 
> +-  return (GVariantType *) g_memdup (buffer, offset);
> ++  return (GVariantType *) g_memdup2 (buffer, offset);
> + }
> + 
> + /**
> +--- a/glib/tests/array-test.c
> ++++ b/glib/tests/array-test.c
> +@@ -29,6 +29,8 @@
> + #include <string.h>
> + #include "glib.h"
> + 
> ++#include "gstrfuncsprivate.h"
> ++
> + /* Test data to be passed to any function which calls g_array_new(),
> providing
> +  * the parameters for that call. Most #GArray tests should be
> repeated for all
> +  * possible values of #ArrayTestData. */
> +@@ -1917,7 +1919,7 @@ byte_array_new_take (void)
> +   GByteArray *gbarray;
> +   guint8 *data;
> + 
> +-  data = g_memdup ("woooweeewow", 11);
> ++  data = g_memdup2 ("woooweeewow", 11);
> +   gbarray = g_byte_array_new_take (data, 11);
> +   g_assert (gbarray->data == data);
> +   g_assert_cmpuint (gbarray->len, ==, 11);
> +--- a/glib/tests/option-context.c
> ++++ b/glib/tests/option-context.c
> +@@ -27,6 +27,8 @@
> + #include <string.h>
> + #include <locale.h>
> + 
> ++#include "gstrfuncsprivate.h"
> ++
> + static GOptionEntry main_entries[] = {
> +   { "main-switch", 0, 0,
> +     G_OPTION_ARG_NONE, NULL,
> +@@ -256,7 +258,7 @@ join_stringv (int argc, char **argv)
> + static char **
> + copy_stringv (char **argv, int argc)
> + {
> +-  return g_memdup (argv, sizeof (char *) * (argc + 1));
> ++  return g_memdup2 (argv, sizeof (char *) * (argc + 1));
> + }
> + 
> + static void
> +@@ -2323,7 +2325,7 @@ test_group_parse (void)
> +   g_option_context_add_group (context, group);
> + 
> +   argv = split_string ("program --test arg1 -f arg2 --group-test arg3
> --frob arg4 -z arg5", &argc);
> +-  orig_argv = g_memdup (argv, (argc + 1) * sizeof (char *));
> ++  orig_argv = g_memdup2 (argv, (argc + 1) * sizeof (char *));
> + 
> +   retval = g_option_context_parse (context, &argc, &argv, &error);
> + 
> diff --git a/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 05.patch b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-05.patch
> new file mode 100644
> index 0000000000..4cd678703f
> --- /dev/null
> +++ b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-05.patch
> @@ -0,0 +1,53 @@
> +From 0cbad673215ec8a049b7fe2ff44b0beed31b376e Mon Sep 17 00:00:00 2001
> +From: Philip Withnall <[email protected]>
> +Date: Thu, 4 Feb 2021 16:12:24 +0000
> +Subject: [PATCH 05/11] gwinhttpfile: Avoid arithmetic overflow when
> + calculating a size
> +MIME-Version: 1.0
> +Content-Type: text/plain; charset=UTF-8
> +Content-Transfer-Encoding: 8bit
> +
> +The members of `URL_COMPONENTS` (`winhttp_file->url`) are `DWORD`s,
> i.e.
> +32-bit unsigned integers. Adding to and multiplying them may cause
> them
> +to overflow the unsigned integer bounds, even if the result is passed
> to
> +`g_memdup2()` which accepts a `gsize`.
> +
> +Cast the `URL_COMPONENTS` members to `gsize` first to ensure that the
> +arithmetic is done in terms of `gsize`s rather than unsigned integers.
> +
> +Spotted by Sebastian Dröge.
> +
> +Signed-off-by: Philip Withnall <[email protected]>
> +Helps: #2319
> +
> +Upstream-Status: Backport
> [https://mirrors.ocf.berkeley.edu/ubuntu/pool/main/g/glib2.0/glib2.0_2.64.6-1~ubuntu20.04.3.debian.tar.xz
> ]
> +CVE: CVE-2021-27219
> +Signed-off-by: Neetika Singh <[email protected]>
> +Signed-off-by: Ranjitsinh Rathod <[email protected]>
> +---
> + gio/win32/gwinhttpfile.c | 8 ++++----
> + 1 file changed, 4 insertions(+), 4 deletions(-)
> +
> +diff --git a/gio/win32/gwinhttpfile.c b/gio/win32/gwinhttpfile.c
> +index 3f8fbd838..e0340e247 100644
> +--- a/gio/win32/gwinhttpfile.c
> ++++ b/gio/win32/gwinhttpfile.c
> +@@ -410,10 +410,10 @@ g_winhttp_file_resolve_relative_path (GFile     
> *file,
> +   child = g_object_new (G_TYPE_WINHTTP_FILE, NULL);
> +   child->vfs = winhttp_file->vfs;
> +   child->url = winhttp_file->url;
> +-  child->url.lpszScheme = g_memdup2 (winhttp_file->url.lpszScheme,
> (winhttp_file->url.dwSchemeLength+1)*2);
> +-  child->url.lpszHostName = g_memdup2 (winhttp_file-
> >url.lpszHostName, (winhttp_file->url.dwHostNameLength+1)*2);
> +-  child->url.lpszUserName = g_memdup2 (winhttp_file-
> >url.lpszUserName, (winhttp_file->url.dwUserNameLength+1)*2);
> +-  child->url.lpszPassword = g_memdup2 (winhttp_file-
> >url.lpszPassword, (winhttp_file->url.dwPasswordLength+1)*2);
> ++  child->url.lpszScheme = g_memdup2 (winhttp_file->url.lpszScheme,
> ((gsize) winhttp_file->url.dwSchemeLength + 1) * 2);
> ++  child->url.lpszHostName = g_memdup2 (winhttp_file-
> >url.lpszHostName, ((gsize) winhttp_file->url.dwHostNameLength + 1) *
> 2);
> ++  child->url.lpszUserName = g_memdup2 (winhttp_file-
> >url.lpszUserName, ((gsize) winhttp_file->url.dwUserNameLength + 1) *
> 2);
> ++  child->url.lpszPassword = g_memdup2 (winhttp_file-
> >url.lpszPassword, ((gsize) winhttp_file->url.dwPasswordLength + 1) *
> 2);
> +   child->url.lpszUrlPath = wnew_path;
> +   child->url.dwUrlPathLength = wcslen (wnew_path);
> +   child->url.lpszExtraInfo = NULL;
> +-- 
> +GitLab
> +
> +
> diff --git a/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 06.patch b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-06.patch
> new file mode 100644
> index 0000000000..e03681d21c
> --- /dev/null
> +++ b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-06.patch
> @@ -0,0 +1,100 @@
> +From f9ee2275cbc312c0b4cdbc338a4fbb76eb36fb9a Mon Sep 17 00:00:00 2001
> +From: Philip Withnall <[email protected]>
> +Date: Thu, 4 Feb 2021 13:49:00 +0000
> +Subject: [PATCH 06/11] gdatainputstream: Handle stop_chars_len
> internally as
> + gsize
> +
> +Previously it was handled as a `gssize`, which meant that if the
> +`stop_chars` string was longer than `G_MAXSSIZE` there would be an
> +overflow.
> +
> +Signed-off-by: Philip Withnall <[email protected]>
> +Helps: #2319
> +
> +Upstream-Status: Backport
> [https://mirrors.ocf.berkeley.edu/ubuntu/pool/main/g/glib2.0/glib2.0_2.64.6-1~ubuntu20.04.3.debian.tar.xz
> ]
> +CVE: CVE-2021-27219
> +Signed-off-by: Neetika Singh <[email protected]>
> +Signed-off-by: Ranjitsinh Rathod <[email protected]>
> +---
> + gio/gdatainputstream.c | 25 +++++++++++++++++--------
> + 1 file changed, 17 insertions(+), 8 deletions(-)
> +
> +diff --git a/gio/gdatainputstream.c b/gio/gdatainputstream.c
> +index 2e7750cb5..2cdcbda19 100644
> +--- a/gio/gdatainputstream.c
> ++++ b/gio/gdatainputstream.c
> +@@ -27,6 +27,7 @@
> + #include "gioenumtypes.h"
> + #include "gioerror.h"
> + #include "glibintl.h"
> ++#include "gstrfuncsprivate.h"
> + 
> + #include <string.h>
> + 
> +@@ -856,7 +857,7 @@ static gssize
> + scan_for_chars (GDataInputStream *stream,
> +               gsize            *checked_out,
> +               const char       *stop_chars,
> +-                gssize            stop_chars_len)
> ++                gsize             stop_chars_len)
> + {
> +   GBufferedInputStream *bstream;
> +   const char *buffer;
> +@@ -952,7 +953,7 @@ typedef struct
> +   gsize checked;
> + 
> +   gchar *stop_chars;
> +-  gssize stop_chars_len;
> ++  gsize stop_chars_len;
> +   gsize length;
> + } GDataInputStreamReadData;
> + 
> +@@ -1078,12 +1079,17 @@ g_data_input_stream_read_async
> (GDataInputStream    *stream,
> + {
> +   GDataInputStreamReadData *data;
> +   GTask *task;
> ++  gsize stop_chars_len_unsigned;
> + 
> +   data = g_slice_new0 (GDataInputStreamReadData);
> +-  if (stop_chars_len == -1)
> +-    stop_chars_len = strlen (stop_chars);
> +-  data->stop_chars = g_memdup (stop_chars, stop_chars_len);
> +-  data->stop_chars_len = stop_chars_len;
> ++
> ++  if (stop_chars_len < 0)
> ++    stop_chars_len_unsigned = strlen (stop_chars);
> ++  else
> ++    stop_chars_len_unsigned = (gsize) stop_chars_len;
> ++
> ++  data->stop_chars = g_memdup2 (stop_chars, stop_chars_len_unsigned);
> ++  data->stop_chars_len = stop_chars_len_unsigned;
> +   data->last_saw_cr = FALSE;
> + 
> +   task = g_task_new (stream, cancellable, callback, user_data);
> +@@ -1338,17 +1344,20 @@ g_data_input_stream_read_upto
> (GDataInputStream  *stream,
> +   gssize found_pos;
> +   gssize res;
> +   char *data_until;
> ++  gsize stop_chars_len_unsigned;
> + 
> +   g_return_val_if_fail (G_IS_DATA_INPUT_STREAM (stream), NULL);
> + 
> +   if (stop_chars_len < 0)
> +-    stop_chars_len = strlen (stop_chars);
> ++    stop_chars_len_unsigned = strlen (stop_chars);
> ++  else
> ++    stop_chars_len_unsigned = (gsize) stop_chars_len;
> + 
> +   bstream = G_BUFFERED_INPUT_STREAM (stream);
> + 
> +   checked = 0;
> + 
> +-  while ((found_pos = scan_for_chars (stream, &checked, stop_chars,
> stop_chars_len)) == -1)
> ++  while ((found_pos = scan_for_chars (stream, &checked, stop_chars,
> stop_chars_len_unsigned)) == -1)
> +     {
> +       if (g_buffered_input_stream_get_available (bstream) ==
> +           g_buffered_input_stream_get_buffer_size (bstream))
> +-- 
> +GitLab
> +
> +
> diff --git a/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 07.patch b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-07.patch
> new file mode 100644
> index 0000000000..b3a32dfbc9
> --- /dev/null
> +++ b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-07.patch
> @@ -0,0 +1,75 @@
> +From 2aaf593a9eb96d84fe3be740aca2810a97d95592 Mon Sep 17 00:00:00 2001
> +From: Philip Withnall <[email protected]>
> +Date: Thu, 4 Feb 2021 13:50:37 +0000
> +Subject: [PATCH 07/11] gwin32: Use gsize internally in g_wcsdup()
> +MIME-Version: 1.0
> +Content-Type: text/plain; charset=UTF-8
> +Content-Transfer-Encoding: 8bit
> +
> +This allows it to handle strings up to length `G_MAXSIZE` — previously
> +it would overflow with such strings.
> +
> +Update the several copies of it identically.
> +
> +Signed-off-by: Philip Withnall <[email protected]>
> +Helps: #2319
> +
> +Upstream-Status: Backport
> [https://mirrors.ocf.berkeley.edu/ubuntu/pool/main/g/glib2.0/glib2.0_2.64.6-1~ubuntu20.04.3.debian.tar.xz
> ]
> +CVE: CVE-2021-27219
> +Signed-off-by: Neetika Singh <[email protected]>
> +Signed-off-by: Ranjitsinh Rathod <[email protected]>
> +---
> + gio/gwin32registrykey.c | 34 ++++++++++++++++++++++++++--------
> + 2 files changed, 38 insertions(+), 16 deletions(-)
> +
> +diff --git a/gio/gwin32registrykey.c b/gio/gwin32registrykey.c
> +index 548a94188..2eb67daf8 100644
> +--- a/gio/gwin32registrykey.c
> ++++ b/gio/gwin32registrykey.c
> +@@ -127,16 +127,34 @@ typedef enum
> +   G_WIN32_REGISTRY_UPDATED_PATH = 1,
> + } GWin32RegistryKeyUpdateFlag;
> + 
> ++static gsize
> ++g_utf16_len (const gunichar2 *str)
> ++{
> ++  gsize result;
> ++
> ++  for (result = 0; str[0] != 0; str++, result++)
> ++    ;
> ++
> ++  return result;
> ++}
> ++
> + static gunichar2 *
> +-g_wcsdup (const gunichar2 *str,
> +-          gssize           str_size)
> ++g_wcsdup (const gunichar2 *str, gssize str_len)
> + {
> +-  if (str_size == -1)
> +-    {
> +-      str_size = wcslen (str) + 1;
> +-      str_size *= sizeof (gunichar2);
> +-    }
> +-  return g_memdup (str, str_size);
> ++  gsize str_len_unsigned;
> ++  gsize str_size;
> ++
> ++  g_return_val_if_fail (str != NULL, NULL);
> ++
> ++  if (str_len < 0)
> ++    str_len_unsigned = g_utf16_len (str);
> ++  else
> ++    str_len_unsigned = (gsize) str_len;
> ++
> ++  g_assert (str_len_unsigned <= G_MAXSIZE / sizeof (gunichar2) - 1);
> ++  str_size = (str_len_unsigned + 1) * sizeof (gunichar2);
> ++
> ++  return g_memdup2 (str, str_size);
> + }
> + 
> + /**
> +-- 
> +GitLab
> +
> +
> diff --git a/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 08.patch b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-08.patch
> new file mode 100644
> index 0000000000..b36e1908c5
> --- /dev/null
> +++ b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-08.patch
> @@ -0,0 +1,100 @@
> +From ba8ca443051f93a74c0d03d62e70402036f967a5 Mon Sep 17 00:00:00 2001
> +From: Philip Withnall <[email protected]>
> +Date: Thu, 4 Feb 2021 13:58:32 +0000
> +Subject: [PATCH 08/11] gkeyfilesettingsbackend: Handle long keys when
> + converting paths
> +
> +Previously, the code in `convert_path()` could not handle keys longer
> +than `G_MAXINT`, and would overflow if that was exceeded.
> +
> +Convert the code to use `gsize` and `g_memdup2()` throughout, and
> +change from identifying the position of the final slash in the string
> +using a signed offset `i`, to using a pointer to the character (and
> +`strrchr()`). This allows the slash to be at any position in a
> +`G_MAXSIZE`-long string, without sacrificing a bit of the offset for
> +indicating whether a slash was found.
> +
> +Signed-off-by: Philip Withnall <[email protected]>
> +Helps: #2319
> +
> +Upstream-Status: Backport
> [https://mirrors.ocf.berkeley.edu/ubuntu/pool/main/g/glib2.0/glib2.0_2.64.6-1~ubuntu20.04.3.debian.tar.xz
> ]
> +CVE: CVE-2021-27219
> +Signed-off-by: Neetika Singh <[email protected]>
> +Signed-off-by: Ranjitsinh Rathod <[email protected]>
> +---
> + gio/gkeyfilesettingsbackend.c | 21 ++++++++++-----------
> + 1 file changed, 10 insertions(+), 11 deletions(-)
> +
> +diff --git a/gio/gkeyfilesettingsbackend.c
> b/gio/gkeyfilesettingsbackend.c
> +index cd5765afd..25b057672 100644
> +--- a/gio/gkeyfilesettingsbackend.c
> ++++ b/gio/gkeyfilesettingsbackend.c
> +@@ -33,6 +33,7 @@
> + #include "gfilemonitor.h"
> + #include "gsimplepermission.h"
> + #include "gsettingsbackendinternal.h"
> ++#include "gstrfuncsprivate.h"
> + #include "giomodule-priv.h"
> + #include "gportalsupport.h"
> + 
> +@@ -145,8 +146,8 @@ convert_path (GKeyfileSettingsBackend  *kfsb,
> +               gchar                   **group,
> +               gchar                   **basename)
> + {
> +-  gint key_len = strlen (key);
> +-  gint i;
> ++  gsize key_len = strlen (key);
> ++  const gchar *last_slash;
> + 
> +   if (key_len < kfsb->prefix_len ||
> +       memcmp (key, kfsb->prefix, kfsb->prefix_len) != 0)
> +@@ -155,38 +156,36 @@ convert_path (GKeyfileSettingsBackend  *kfsb,
> +   key_len -= kfsb->prefix_len;
> +   key += kfsb->prefix_len;
> + 
> +-  for (i = key_len; i >= 0; i--)
> +-    if (key[i] == '/')
> +-      break;
> ++  last_slash = strrchr (key, '/');
> + 
> +   if (kfsb->root_group)
> +     {
> +       /* if a root_group was specified, make sure the user hasn't
> given
> +        * a path that ghosts that group name
> +        */
> +-      if (i == kfsb->root_group_len && memcmp (key, kfsb->root_group,
> i) == 0)
> ++      if (last_slash != NULL && (last_slash - key) == kfsb-
> >root_group_len && memcmp (key, kfsb->root_group, last_slash - key) ==
> 0)
> +         return FALSE;
> +     }
> +   else
> +     {
> +       /* if no root_group was given, ensure that the user gave a path
> */
> +-      if (i == -1)
> ++      if (last_slash == NULL)
> +         return FALSE;
> +     }
> + 
> +   if (group)
> +     {
> +-      if (i >= 0)
> ++      if (last_slash != NULL)
> +         {
> +-          *group = g_memdup (key, i + 1);
> +-          (*group)[i] = '\0';
> ++          *group = g_memdup2 (key, (last_slash - key) + 1);
> ++          (*group)[(last_slash - key)] = '\0';
> +         }
> +       else
> +         *group = g_strdup (kfsb->root_group);
> +     }
> + 
> +   if (basename)
> +-    *basename = g_memdup (key + i + 1, key_len - i);
> ++    *basename = g_memdup2 (last_slash + 1, key_len - (last_slash -
> key));
> + 
> +   return TRUE;
> + }
> +-- 
> +GitLab
> +
> +
> diff --git a/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 09.patch b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-09.patch
> new file mode 100644
> index 0000000000..aa94397e4c
> --- /dev/null
> +++ b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-09.patch
> @@ -0,0 +1,99 @@
> +From 65ec7f4d6e8832c481f6e00e2eb007b9a60024ce Mon Sep 17 00:00:00 2001
> +From: Philip Withnall <[email protected]>
> +Date: Thu, 4 Feb 2021 14:00:53 +0000
> +Subject: [PATCH 09/11] =?UTF-
> 8?q?gsocket:=20Use=20gsize=20to=20track=20nat?=
> + =?UTF-8?q?ive=20sockaddr=E2=80=99s=20size?=
> +MIME-Version: 1.0
> +Content-Type: text/plain; charset=UTF-8
> +Content-Transfer-Encoding: 8bit
> +
> +Don’t use an `int`, that’s potentially too small. In practical terms,
> +this is not a problem, since no socket address is going to be that
> big.
> +
> +By making these changes we can use `g_memdup2()` without warnings,
> +though. Fewer warnings is good.
> +
> +Signed-off-by: Philip Withnall <[email protected]>
> +Helps: #2319
> +
> +Upstream-Status: Backport
> [https://mirrors.ocf.berkeley.edu/ubuntu/pool/main/g/glib2.0/glib2.0_2.64.6-1~ubuntu20.04.3.debian.tar.xz
> ]
> +CVE: CVE-2021-27219
> +Signed-off-by: Neetika Singh <[email protected]>
> +Signed-off-by: Ranjitsinh Rathod <[email protected]>
> +---
> + gio/gsocket.c | 16 ++++++++++------
> + 1 file changed, 10 insertions(+), 6 deletions(-)
> +
> +--- a/gio/gsocket.c
> ++++ b/gio/gsocket.c
> +@@ -75,6 +75,7 @@
> + #include "gcredentialsprivate.h"
> + #include "glibintl.h"
> + #include "gioprivate.h"
> ++#include "gstrfuncsprivate.h"
> + 
> + #ifdef G_OS_WIN32
> + /* For Windows XP runtime compatibility, but use the system's
> if_nametoindex() if available */
> +@@ -174,7 +175,7 @@ static gboolean     g_socket_datagram_ba
> +                                                                  
> GError          **error);
> + 
> + static GSocketAddress *
> +-cache_recv_address (GSocket *socket, struct sockaddr *native, int
> native_len);
> ++cache_recv_address (GSocket *socket, struct sockaddr *native, size_t
> native_len);
> + 
> + static gssize
> + g_socket_receive_message_with_timeout  (GSocket                
> *socket,
> +@@ -260,7 +261,7 @@ struct _GSocketPrivate
> +   struct {
> +     GSocketAddress *addr;
> +     struct sockaddr *native;
> +-    gint native_len;
> ++    gsize native_len;
> +     guint64 last_used;
> +   } recv_addr_cache[RECV_ADDR_CACHE_SIZE];
> + };
> +@@ -5259,14 +5260,14 @@ g_socket_send_messages_with_timeout (GSo
> + }
> + 
> + static GSocketAddress *
> +-cache_recv_address (GSocket *socket, struct sockaddr *native, int
> native_len)
> ++cache_recv_address (GSocket *socket, struct sockaddr *native, size_t
> native_len)
> + {
> +   GSocketAddress *saddr;
> +   gint i;
> +   guint64 oldest_time = G_MAXUINT64;
> +   gint oldest_index = 0;
> + 
> +-  if (native_len <= 0)
> ++  if (native_len == 0)
> +     return NULL;
> + 
> +   saddr = NULL;
> +@@ -5274,7 +5275,7 @@ cache_recv_address (GSocket *socket, str
> +     {
> +       GSocketAddress *tmp = socket->priv->recv_addr_cache[i].addr;
> +       gpointer tmp_native = socket->priv->recv_addr_cache[i].native;
> +-      gint tmp_native_len = socket->priv-
> >recv_addr_cache[i].native_len;
> ++      gsize tmp_native_len = socket->priv-
> >recv_addr_cache[i].native_len;
> + 
> +       if (!tmp)
> +         continue;
> +@@ -5304,7 +5305,7 @@ cache_recv_address (GSocket *socket, str
> +       g_free (socket->priv->recv_addr_cache[oldest_index].native);
> +     }
> + 
> +-  socket->priv->recv_addr_cache[oldest_index].native = g_memdup
> (native, native_len);
> ++  socket->priv->recv_addr_cache[oldest_index].native = g_memdup2
> (native, native_len);
> +   socket->priv->recv_addr_cache[oldest_index].native_len =
> native_len;
> +   socket->priv->recv_addr_cache[oldest_index].addr = g_object_ref
> (saddr);
> +   socket->priv->recv_addr_cache[oldest_index].last_used =
> g_get_monotonic_time ();
> +@@ -5452,6 +5453,9 @@ g_socket_receive_message_with_timeout (G
> +     /* do it */
> +     while (1)
> +       {
> ++        /* addrlen has to be of type int because that’s how
> WSARecvFrom() is defined */
> ++        G_STATIC_ASSERT (sizeof addr <= G_MAXINT);
> ++
> +       addrlen = sizeof addr;
> +       if (address)
> +         result = WSARecvFrom (socket->priv->fd,
> diff --git a/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 10.patch b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-10.patch
> new file mode 100644
> index 0000000000..ff503a6ffb
> --- /dev/null
> +++ b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-10.patch
> @@ -0,0 +1,58 @@
> +From 777b95a88f006d39d9fe6d3321db17e7b0d4b9a4 Mon Sep 17 00:00:00 2001
> +From: Philip Withnall <[email protected]>
> +Date: Thu, 4 Feb 2021 14:07:39 +0000
> +Subject: [PATCH 10/11] gtlspassword: Forbid very long TLS passwords
> +MIME-Version: 1.0
> +Content-Type: text/plain; charset=UTF-8
> +Content-Transfer-Encoding: 8bit
> +
> +The public API `g_tls_password_set_value_full()` (and the vfunc it
> +invokes) can only accept a `gssize` length. Ensure that nul-terminated
> +strings passed to `g_tls_password_set_value()` can’t exceed that
> length.
> +Use `g_memdup2()` to avoid an overflow if they’re longer than
> +`G_MAXUINT` similarly.
> +
> +Signed-off-by: Philip Withnall <[email protected]>
> +Helps: #2319
> +
> +Upstream-Status: Backport
> [https://mirrors.ocf.berkeley.edu/ubuntu/pool/main/g/glib2.0/glib2.0_2.64.6-1~ubuntu20.04.3.debian.tar.xz
> ]
> +CVE: CVE-2021-27219
> +Signed-off-by: Neetika Singh <[email protected]>
> +Signed-off-by: Ranjitsinh Rathod <[email protected]>
> +---
> + gio/gtlspassword.c | 10 ++++++++--
> + 1 file changed, 8 insertions(+), 2 deletions(-)
> +
> +diff --git a/gio/gtlspassword.c b/gio/gtlspassword.c
> +index 1e437a7b6..dbcec41a8 100644
> +--- a/gio/gtlspassword.c
> ++++ b/gio/gtlspassword.c
> +@@ -23,6 +23,7 @@
> + #include "glibintl.h"
> + 
> + #include "gioenumtypes.h"
> ++#include "gstrfuncsprivate.h"
> + #include "gtlspassword.h"
> + 
> + #include <string.h>
> +@@ -287,9 +288,14 @@ g_tls_password_set_value (GTlsPassword 
> *password,
> +   g_return_if_fail (G_IS_TLS_PASSWORD (password));
> + 
> +   if (length < 0)
> +-    length = strlen ((gchar *)value);
> ++    {
> ++      /* FIXME: g_tls_password_set_value_full() doesn’t support
> unsigned gsize */
> ++      gsize length_unsigned = strlen ((gchar *) value);
> ++      g_return_if_fail (length_unsigned > G_MAXSSIZE);
> ++      length = (gssize) length_unsigned;
> ++    }
> + 
> +-  g_tls_password_set_value_full (password, g_memdup (value, length),
> length, g_free);
> ++  g_tls_password_set_value_full (password, g_memdup2 (value, (gsize)
> length), length, g_free);
> + }
> + 
> + /**
> +-- 
> +GitLab
> +
> +
> diff --git a/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-
> 11.patch b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-11.patch
> new file mode 100644
> index 0000000000..c2c761d648
> --- /dev/null
> +++ b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-27219-11.patch
> @@ -0,0 +1,62 @@
> +From ecdf91400e9a538695a0895b95ad7e8abcdf1749 Mon Sep 17 00:00:00 2001
> +From: Philip Withnall <[email protected]>
> +Date: Thu, 4 Feb 2021 14:09:40 +0000
> +Subject: [PATCH 11/11] giochannel: Forbid very long line terminator
> strings
> +MIME-Version: 1.0
> +Content-Type: text/plain; charset=UTF-8
> +Content-Transfer-Encoding: 8bit
> +
> +The public API `GIOChannel.line_term_len` is only a `guint`. Ensure
> that
> +nul-terminated strings passed to `g_io_channel_set_line_term()` can’t
> +exceed that length. Use `g_memdup2()` to avoid a warning (`g_memdup()`
> +is due to be deprecated), but not to avoid a bug, since it’s also
> +limited to `G_MAXUINT`.
> +
> +Signed-off-by: Philip Withnall <[email protected]>
> +Helps: #2319
> +
> +Upstream-Status: Backport
> [https://mirrors.ocf.berkeley.edu/ubuntu/pool/main/g/glib2.0/glib2.0_2.64.6-1~ubuntu20.04.3.debian.tar.xz
> ]
> +CVE: CVE-2021-27219
> +Signed-off-by: Neetika Singh <[email protected]>
> +Signed-off-by: Ranjitsinh Rathod <[email protected]>
> +---
> + glib/giochannel.c | 17 +++++++++++++----
> + 1 file changed, 13 insertions(+), 4 deletions(-)
> +
> +diff --git a/glib/giochannel.c b/glib/giochannel.c
> +index c6a89d6e0..4dec20f77 100644
> +--- a/glib/giochannel.c
> ++++ b/glib/giochannel.c
> +@@ -887,16 +887,25 @@ g_io_channel_set_line_term
> (GIOChannel   *channel,
> +                             const gchar       *line_term,
> +                           gint         length)
> + {
> ++  guint length_unsigned;
> ++
> +   g_return_if_fail (channel != NULL);
> +   g_return_if_fail (line_term == NULL || length != 0); /* Disallow ""
> */
> + 
> +   if (line_term == NULL)
> +-    length = 0;
> +-  else if (length < 0)
> +-    length = strlen (line_term);
> ++    length_unsigned = 0;
> ++  else if (length >= 0)
> ++    length_unsigned = (guint) length;
> ++  else
> ++    {
> ++      /* FIXME: We’re constrained by line_term_len being a guint here
> */
> ++      gsize length_size = strlen (line_term);
> ++      g_return_if_fail (length_size > G_MAXUINT);
> ++      length_unsigned = (guint) length_size;
> ++    }
> + 
> +   g_free (channel->line_term);
> +-  channel->line_term = line_term ? g_memdup (line_term, length) :
> NULL;
> ++  channel->line_term = line_term ? g_memdup2 (line_term,
> length_unsigned) : NULL;
> +   channel->line_term_len = length;
> + }
> + 
> +-- 
> +GitLab
> +
> diff --git a/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-1.patch
> b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-1.patch
> new file mode 100644
> index 0000000000..eac6cbf630
> --- /dev/null
> +++ b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-1.patch
> @@ -0,0 +1,26 @@
> +From 78420a75aeb70569a8cd79fa0fea7b786b6f785f Mon Sep 17 00:00:00 2001
> +From: Philip Withnall <[email protected]>
> +Date: Wed, 24 Feb 2021 17:33:38 +0000
> +Subject: [PATCH 1/5] glocalfileoutputstream: Fix a typo in a comment
> +
> +Signed-off-by: Philip Withnall <[email protected]>
> +
> +Upstream-Status: Backport
> [https://mirrors.ocf.berkeley.edu/ubuntu/pool/main/g/glib2.0/glib2.0_2.64.6-1~ubuntu20.04.3.debian.tar.xz
> ]
> +CVE: CVE-2021-28153
> +Signed-off-by: Neetika Singh <[email protected]>
> +Signed-off-by: Ranjitsinh Rathod <[email protected]>
> +---
> + gio/glocalfileoutputstream.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +--- a/gio/glocalfileoutputstream.c
> ++++ b/gio/glocalfileoutputstream.c
> +@@ -851,7 +851,7 @@ handle_overwrite_open (const char    *fi
> +   mode = mode_from_flags_or_info (flags, reference_info);
> + 
> +   /* We only need read access to the original file if we are creating
> a backup.
> +-   * We also add O_CREATE to avoid a race if the file was just
> removed */
> ++   * We also add O_CREAT to avoid a race if the file was just removed
> */
> +   if (create_backup || readable)
> +     open_flags = O_RDWR | O_CREAT | O_BINARY;
> +   else
> diff --git a/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-2.patch
> b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-2.patch
> new file mode 100644
> index 0000000000..9d0ab7b656
> --- /dev/null
> +++ b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-2.patch
> @@ -0,0 +1,41 @@
> +From 32d3d02a50e7dcec5f4cf7908e7ac88d575d8fc5 Mon Sep 17 00:00:00 2001
> +From: Philip Withnall <[email protected]>
> +Date: Wed, 24 Feb 2021 17:34:32 +0000
> +Subject: [PATCH 2/5] tests: Stop using g_test_bug_base() in file tests
> +MIME-Version: 1.0
> +Content-Type: text/plain; charset=UTF-8
> +Content-Transfer-Encoding: 8bit
> +
> +Since a following commit is going to add a new test which references
> +Gitlab, so it’s best to move the URI bases inside the test cases.
> +
> +Signed-off-by: Philip Withnall <[email protected]>
> +
> +Upstream-Status: Backport
> [https://mirrors.ocf.berkeley.edu/ubuntu/pool/main/g/glib2.0/glib2.0_2.64.6-1~ubuntu20.04.3.debian.tar.xz
> ]
> +CVE: CVE-2021-28153
> +Signed-off-by: Neetika Singh <[email protected]>
> +Signed-off-by: Ranjitsinh Rathod <[email protected]>
> +---
> + gio/tests/file.c | 4 +---
> + 1 file changed, 1 insertion(+), 3 deletions(-)
> +
> +--- a/gio/tests/file.c
> ++++ b/gio/tests/file.c
> +@@ -685,7 +685,7 @@ test_replace_cancel (void)
> +   guint count;
> +   GError *error = NULL;
> + 
> +-  g_test_bug ("629301");
> ++  g_test_bug ("https://bugzilla.gnome.org/629301";);
> + 
> +   path = g_dir_make_tmp ("g_file_replace_cancel_XXXXXX", &error);
> +   g_assert_no_error (error);
> +@@ -1784,8 +1784,6 @@ main (int argc, char *argv[])
> + {
> +   g_test_init (&argc, &argv, NULL);
> + 
> +-  g_test_bug_base ("http://bugzilla.gnome.org/";);
> +-
> +   g_test_add_func ("/file/basic", test_basic);
> +   g_test_add_func ("/file/build-filename", test_build_filename);
> +   g_test_add_func ("/file/parent", test_parent);
> diff --git a/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-3.patch
> b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-3.patch
> new file mode 100644
> index 0000000000..bdd5a27ad2
> --- /dev/null
> +++ b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-3.patch
> @@ -0,0 +1,56 @@
> +Backport of:
> +
> +From ce0eb088a68171eed3ac217cb92a72e36eb57d1b Mon Sep 17 00:00:00 2001
> +From: Philip Withnall <[email protected]>
> +Date: Wed, 10 Mar 2021 16:05:55 +0000
> +Subject: [PATCH 3/5] glocalfileoutputstream: Factor out a flag check
> +
> +This clarifies the code a little. It introduces no functional changes.
> +
> +Signed-off-by: Philip Withnall <[email protected]>
> +
> +Upstream-Status: Backport
> [https://mirrors.ocf.berkeley.edu/ubuntu/pool/main/g/glib2.0/glib2.0_2.64.6-1~ubuntu20.04.3.debian.tar.xz
> ]
> +CVE: CVE-2021-28153
> +Signed-off-by: Neetika Singh <[email protected]>
> +Signed-off-by: Ranjitsinh Rathod <[email protected]>
> +---
> + gio/glocalfileoutputstream.c | 7 ++++---
> + 1 file changed, 4 insertions(+), 3 deletions(-)
> +
> +--- a/gio/glocalfileoutputstream.c
> ++++ b/gio/glocalfileoutputstream.c
> +@@ -847,6 +847,7 @@ handle_overwrite_open (const char    *fi
> +   int res;
> +   int mode;
> +   int errsv;
> ++  gboolean replace_destination_set = (flags &
> G_FILE_CREATE_REPLACE_DESTINATION);
> + 
> +   mode = mode_from_flags_or_info (flags, reference_info);
> + 
> +@@ -954,7 +955,7 @@ handle_overwrite_open (const char    *fi
> +    * to a backup file and rewrite the contents of the file.
> +    */
> +   
> +-  if ((flags & G_FILE_CREATE_REPLACE_DESTINATION) ||
> ++  if (replace_destination_set ||
> +       (!(original_stat.st_nlink > 1) && !is_symlink))
> +     {
> +       char *dirname, *tmp_filename;
> +@@ -973,7 +974,7 @@ handle_overwrite_open (const char    *fi
> +       
> +       /* try to keep permissions (unless replacing) */
> + 
> +-      if ( ! (flags & G_FILE_CREATE_REPLACE_DESTINATION) &&
> ++      if (!replace_destination_set &&
> +          (
> + #ifdef HAVE_FCHOWN
> +           fchown (tmpfd, original_stat.st_uid, original_stat.st_gid)
> == -1 ||
> +@@ -1112,7 +1113,7 @@ handle_overwrite_open (const char    *fi
> +       }
> +     }
> + 
> +-  if (flags & G_FILE_CREATE_REPLACE_DESTINATION)
> ++  if (replace_destination_set)
> +     {
> +       g_close (fd, NULL);
> +       
> diff --git a/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-4.patch
> b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-4.patch
> new file mode 100644
> index 0000000000..fbcb2bc546
> --- /dev/null
> +++ b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-4.patch
> @@ -0,0 +1,264 @@
> +Backport of:
> +
> +From 317b3b587058a05dca95d56dac26568c5b098d33 Mon Sep 17 00:00:00 2001
> +From: Philip Withnall <[email protected]>
> +Date: Wed, 24 Feb 2021 17:36:07 +0000
> +Subject: [PATCH 4/5] glocalfileoutputstream: Fix
> CREATE_REPLACE_DESTINATION
> + with symlinks
> +MIME-Version: 1.0
> +Content-Type: text/plain; charset=UTF-8
> +Content-Transfer-Encoding: 8bit
> +
> +The `G_FILE_CREATE_REPLACE_DESTINATION` flag is equivalent to
> unlinking
> +the destination file and re-creating it from scratch. That did
> +previously work, but in the process the code would call
> `open(O_CREAT)`
> +on the file. If the file was a dangling symlink, this would create the
> +destination file (empty). That’s not an intended side-effect, and has
> +security implications if the symlink is controlled by a lower-
> privileged
> +process.
> +
> +Fix that by not opening the destination file if it’s a symlink, and
> +adjusting the rest of the code to cope with
> + - the fact that `fd == -1` is not an error iff `is_symlink` is true,
> + - and that `original_stat` will contain the `lstat()` results for the
> +   symlink now, rather than the `stat()` results for its target
> (again,
> +   iff `is_symlink` is true).
> +
> +This means that the target of the dangling symlink is no longer
> created,
> +which was the bug. The symlink itself continues to be replaced (as
> +before) with the new file — this is the intended behaviour of
> +`g_file_replace()`.
> +
> +The behaviour for non-symlink cases, or cases where the symlink was
> not
> +dangling, should be unchanged.
> +
> +Includes a unit test.
> +
> +Signed-off-by: Philip Withnall <[email protected]>
> +
> +Fixes: #2325
> +
> +Upstream-Status: Backport
> [https://mirrors.ocf.berkeley.edu/ubuntu/pool/main/g/glib2.0/glib2.0_2.64.6-1~ubuntu20.04.3.debian.tar.xz
> ]
> +CVE: CVE-2021-28153
> +Signed-off-by: Neetika Singh <[email protected]>
> +Signed-off-by: Ranjitsinh Rathod <[email protected]>
> +---
> + gio/glocalfileoutputstream.c |  77 ++++++++++++++++++-------
> + gio/tests/file.c             | 108
> +++++++++++++++++++++++++++++++++++
> + 2 files changed, 163 insertions(+), 22 deletions(-)
> +
> +--- a/gio/glocalfileoutputstream.c
> ++++ b/gio/glocalfileoutputstream.c
> +@@ -875,16 +875,22 @@ handle_overwrite_open (const char    *fi
> +       /* Could be a symlink, or it could be a regular ELOOP error,
> +        * but then the next open will fail too. */
> +       is_symlink = TRUE;
> +-      fd = g_open (filename, open_flags, mode);
> ++      if (!replace_destination_set)
> ++        fd = g_open (filename, open_flags, mode);
> +     }
> +-#else
> +-  fd = g_open (filename, open_flags, mode);
> +-  errsv = errno;
> ++#else  /* if !O_NOFOLLOW */
> +   /* This is racy, but we do it as soon as possible to minimize the
> race */
> +   is_symlink = g_file_test (filename, G_FILE_TEST_IS_SYMLINK);
> ++
> ++  if (!is_symlink || !replace_destination_set)
> ++    {
> ++      fd = g_open (filename, open_flags, mode);
> ++      errsv = errno;
> ++    }
> + #endif
> + 
> +-  if (fd == -1)
> ++  if (fd == -1 &&
> ++      (!is_symlink || !replace_destination_set))
> +     {
> +       char *display_name = g_filename_display_name (filename);
> +       g_set_error (error, G_IO_ERROR,
> +@@ -898,7 +904,14 @@ handle_overwrite_open (const char    *fi
> + #ifdef G_OS_WIN32
> +   res = GLIB_PRIVATE_CALL (g_win32_fstat) (fd, &original_stat);
> + #else
> +-  res = fstat (fd, &original_stat);
> ++  if (!is_symlink)
> ++    {
> ++      res = fstat (fd, &original_stat);
> ++    }
> ++  else
> ++    {
> ++      res = lstat (filename, &original_stat);
> ++    }
> + #endif
> +   errsv = errno;
> + 
> +@@ -917,16 +930,27 @@ handle_overwrite_open (const char    *fi
> +   if (!S_ISREG (original_stat.st_mode))
> +     {
> +       if (S_ISDIR (original_stat.st_mode))
> +-      g_set_error_literal (error,
> +-                             G_IO_ERROR,
> +-                             G_IO_ERROR_IS_DIRECTORY,
> +-                             _("Target file is a directory"));
> +-      else
> +-      g_set_error_literal (error,
> ++        {
> ++          g_set_error_literal (error,
> ++                               G_IO_ERROR,
> ++                               G_IO_ERROR_IS_DIRECTORY,
> ++                               _("Target file is a directory"));
> ++          goto err_out;
> ++        }
> ++      else if (!is_symlink ||
> ++#ifdef S_ISLNK
> ++               !S_ISLNK (original_stat.st_mode)
> ++#else
> ++               FALSE
> ++#endif
> ++               )
> ++        {
> ++          g_set_error_literal (error,
> +                              G_IO_ERROR,
> +                              G_IO_ERROR_NOT_REGULAR_FILE,
> +                              _("Target file is not a regular file"));
> +-      goto err_out;
> ++          goto err_out;
> ++        }
> +     }
> +   
> +   if (etag != NULL)
> +@@ -1007,7 +1031,8 @@ handle_overwrite_open (const char    *fi
> +           }
> +       }
> + 
> +-      g_close (fd, NULL);
> ++      if (fd >= 0)
> ++        g_close (fd, NULL);
> +       *temp_filename = tmp_filename;
> +       return tmpfd;
> +     }
> +--- a/gio/tests/file.c
> ++++ b/gio/tests/file.c
> +@@ -805,6 +805,113 @@ test_replace_cancel (void)
> + }
> + 
> + static void
> ++test_replace_symlink (void)
> ++{
> ++#ifdef G_OS_UNIX
> ++  gchar *tmpdir_path = NULL;
> ++  GFile *tmpdir = NULL, *source_file = NULL, *target_file = NULL;
> ++  GFileOutputStream *stream = NULL;
> ++  const gchar *new_contents = "this is a test message which should be
> written to source and not target";
> ++  gsize n_written;
> ++  GFileEnumerator *enumerator = NULL;
> ++  GFileInfo *info = NULL;
> ++  gchar *contents = NULL;
> ++  gsize length = 0;
> ++  GError *local_error = NULL;
> ++
> ++  g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2325";);
> ++  g_test_summary ("Test that G_FILE_CREATE_REPLACE_DESTINATION
> doesn’t follow symlinks");
> ++
> ++  /* Create a fresh, empty working directory. */
> ++  tmpdir_path = g_dir_make_tmp ("g_file_replace_symlink_XXXXXX",
> &local_error);
> ++  g_assert_no_error (local_error);
> ++  tmpdir = g_file_new_for_path (tmpdir_path);
> ++
> ++  g_test_message ("Using temporary directory %s", tmpdir_path);
> ++  g_free (tmpdir_path);
> ++
> ++  /* Create symlink `source` which points to `target`. */
> ++  source_file = g_file_get_child (tmpdir, "source");
> ++  target_file = g_file_get_child (tmpdir, "target");
> ++  g_file_make_symbolic_link (source_file, "target", NULL,
> &local_error);
> ++  g_assert_no_error (local_error);
> ++
> ++  /* Ensure that `target` doesn’t exist */
> ++  g_assert_false (g_file_query_exists (target_file, NULL));
> ++
> ++  /* Replace the `source` symlink with a regular file using
> ++   * %G_FILE_CREATE_REPLACE_DESTINATION, which should replace it
> *without*
> ++   * following the symlink */
> ++  stream = g_file_replace (source_file, NULL, FALSE  /* no backup */,
> ++                           G_FILE_CREATE_REPLACE_DESTINATION, NULL,
> &local_error);
> ++  g_assert_no_error (local_error);
> ++
> ++  g_output_stream_write_all (G_OUTPUT_STREAM (stream), new_contents,
> strlen (new_contents),
> ++                             &n_written, NULL, &local_error);
> ++  g_assert_no_error (local_error);
> ++  g_assert_cmpint (n_written, ==, strlen (new_contents));
> ++
> ++  g_output_stream_close (G_OUTPUT_STREAM (stream), NULL,
> &local_error);
> ++  g_assert_no_error (local_error);
> ++
> ++  g_clear_object (&stream);
> ++
> ++  /* At this point, there should still only be one file: `source`. It
> should
> ++   * now be a regular file. `target` should not exist. */
> ++  enumerator = g_file_enumerate_children (tmpdir,
> ++                                         
> G_FILE_ATTRIBUTE_STANDARD_NAME ","
> ++                                         
> G_FILE_ATTRIBUTE_STANDARD_TYPE,
> ++                                         
> G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &local_error);
> ++  g_assert_no_error (local_error);
> ++
> ++  info = g_file_enumerator_next_file (enumerator, NULL,
> &local_error);
> ++  g_assert_no_error (local_error);
> ++  g_assert_nonnull (info);
> ++
> ++  g_assert_cmpstr (g_file_info_get_name (info), ==, "source");
> ++  g_assert_cmpint (g_file_info_get_file_type (info), ==,
> G_FILE_TYPE_REGULAR);
> ++
> ++  g_clear_object (&info);
> ++
> ++  info = g_file_enumerator_next_file (enumerator, NULL,
> &local_error);
> ++  g_assert_no_error (local_error);
> ++  g_assert_null (info);
> ++
> ++  g_file_enumerator_close (enumerator, NULL, &local_error);
> ++  g_assert_no_error (local_error);
> ++  g_clear_object (&enumerator);
> ++
> ++  /* Double-check that `target` doesn’t exist */
> ++  g_assert_false (g_file_query_exists (target_file, NULL));
> ++
> ++  /* Check the content of `source`. */
> ++  g_file_load_contents (source_file,
> ++                        NULL,
> ++                        &contents,
> ++                        &length,
> ++                        NULL,
> ++                        &local_error);
> ++  g_assert_no_error (local_error);
> ++  g_assert_cmpstr (contents, ==, new_contents);
> ++  g_assert_cmpuint (length, ==, strlen (new_contents));
> ++  g_free (contents);
> ++
> ++  /* Tidy up. */
> ++  g_file_delete (source_file, NULL, &local_error);
> ++  g_assert_no_error (local_error);
> ++
> ++  g_file_delete (tmpdir, NULL, &local_error);
> ++  g_assert_no_error (local_error);
> ++
> ++  g_clear_object (&target_file);
> ++  g_clear_object (&source_file);
> ++  g_clear_object (&tmpdir);
> ++#else  /* if !G_OS_UNIX */
> ++  g_test_skip ("Symlink replacement tests can only be run on Unix")
> ++#endif
> ++}
> ++
> ++static void
> + on_file_deleted (GObject      *object,
> +                GAsyncResult *result,
> +                gpointer      user_data)
> +@@ -1797,6 +1904,7 @@ main (int argc, char *argv[])
> +   g_test_add_data_func ("/file/async-create-delete/4096",
> GINT_TO_POINTER (4096), test_create_delete);
> +   g_test_add_func ("/file/replace-load", test_replace_load);
> +   g_test_add_func ("/file/replace-cancel", test_replace_cancel);
> ++  g_test_add_func ("/file/replace-symlink", test_replace_symlink);
> +   g_test_add_func ("/file/async-delete", test_async_delete);
> +   g_test_add_func ("/file/copy-preserve-mode",
> test_copy_preserve_mode);
> +   g_test_add_func ("/file/measure", test_measure);
> diff --git a/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-5.patch
> b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-5.patch
> new file mode 100644
> index 0000000000..c8d2cdd203
> --- /dev/null
> +++ b/meta/recipes-core/glib-2.0/glib-2.0/CVE-2021-28153-5.patch
> @@ -0,0 +1,54 @@
> +From 6c6439261bc7a8a0627519848a7222b3e1bd4ffe Mon Sep 17 00:00:00 2001
> +From: Philip Withnall <[email protected]>
> +Date: Wed, 24 Feb 2021 17:42:24 +0000
> +Subject: [PATCH 5/5] glocalfileoutputstream: Add a missing O_CLOEXEC
> flag to
> + replace()
> +
> +Signed-off-by: Philip Withnall <[email protected]>
> +
> +Upstream-Status: Backport
> [https://mirrors.ocf.berkeley.edu/ubuntu/pool/main/g/glib2.0/glib2.0_2.64.6-1~ubuntu20.04.3.debian.tar.xz
> ]
> +CVE: CVE-2021-28153
> +Signed-off-by: Neetika Singh <[email protected]>
> +Signed-off-by: Ranjitsinh Rathod <[email protected]>
> +---
> + gio/glocalfileoutputstream.c | 15 ++++++++++++---
> + 1 file changed, 12 insertions(+), 3 deletions(-)
> +
> +--- a/gio/glocalfileoutputstream.c
> ++++ b/gio/glocalfileoutputstream.c
> +@@ -58,6 +58,12 @@
> + #define O_BINARY 0
> + #endif
> + 
> ++#ifndef O_CLOEXEC
> ++#define O_CLOEXEC 0
> ++#else
> ++#define HAVE_O_CLOEXEC 1
> ++#endif
> ++
> + struct _GLocalFileOutputStreamPrivate {
> +   char *tmp_filename;
> +   char *original_filename;
> +@@ -1223,7 +1229,7 @@ _g_local_file_output_stream_replace (con
> +   sync_on_close = FALSE;
> + 
> +   /* If the file doesn't exist, create it */
> +-  open_flags = O_CREAT | O_EXCL | O_BINARY;
> ++  open_flags = O_CREAT | O_EXCL | O_BINARY | O_CLOEXEC;
> +   if (readable)
> +     open_flags |= O_RDWR;
> +   else
> +@@ -1253,8 +1259,11 @@ _g_local_file_output_stream_replace (con
> +       set_error_from_open_errno (filename, error);
> +       return NULL;
> +     }
> +-  
> +- 
> ++#if !defined(HAVE_O_CLOEXEC) && defined(F_SETFD)
> ++  else
> ++    fcntl (fd, F_SETFD, FD_CLOEXEC);
> ++#endif
> ++
> +   stream = g_object_new (G_TYPE_LOCAL_FILE_OUTPUT_STREAM, NULL);
> +   stream->priv->fd = fd;
> +   stream->priv->sync_on_close = sync_on_close;
> diff --git a/meta/recipes-core/glib-2.0/glib-2.0_2.62.6.bb
> b/meta/recipes-core/glib-2.0/glib-2.0_2.62.6.bb
> index 1a006b9f38..6272155d8c 100644
> --- a/meta/recipes-core/glib-2.0/glib-2.0_2.62.6.bb
> +++ b/meta/recipes-core/glib-2.0/glib-2.0_2.62.6.bb
> @@ -18,6 +18,23 @@ SRC_URI = "${GNOME_MIRROR}/glib/${SHRT_VER}/glib-
> ${PV}.tar.xz \
>            
> file://0001-gio-tests-resources.c-comment-out-a-build-host-only-.patch 
> \
>             file://tzdata-update.patch \
>             file://CVE-2020-35457.patch \
> +           file://CVE-2021-27218.patch \
> +           file://CVE-2021-27219-01.patch \
> +           file://CVE-2021-27219-02.patch \
> +           file://CVE-2021-27219-03.patch \
> +           file://CVE-2021-27219-04.patch \
> +           file://CVE-2021-27219-05.patch \
> +           file://CVE-2021-27219-06.patch \
> +           file://CVE-2021-27219-07.patch \
> +           file://CVE-2021-27219-08.patch \
> +           file://CVE-2021-27219-09.patch \
> +           file://CVE-2021-27219-10.patch \
> +           file://CVE-2021-27219-11.patch \
> +           file://CVE-2021-28153-1.patch \
> +           file://CVE-2021-28153-2.patch \
> +           file://CVE-2021-28153-3.patch \
> +           file://CVE-2021-28153-4.patch \
> +           file://CVE-2021-28153-5.patch \
>             "
>  
>  SRC_URI_append_class-native = " file://relocate-modules.patch"
> 
> 
> 

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#158963): 
https://lists.openembedded.org/g/openembedded-core/message/158963
Mute This Topic: https://lists.openembedded.org/mt/87373335/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to