commit:     b69099c78014c15933043371cc3b4adb10d8d3bc
Author:     Matt Turner <mattst88 <AT> gentoo <DOT> org>
AuthorDate: Sun Jul 16 14:28:24 2023 +0000
Commit:     Matt Turner <mattst88 <AT> gentoo <DOT> org>
CommitDate: Sun Jul 16 14:30:16 2023 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=b69099c7

gui-libs/gtk: Fix unaligned accesses

Signed-off-by: Matt Turner <mattst88 <AT> gentoo.org>

 ...4.10.4-gtk-Align-key_size-up-to-key_align.patch |  50 +++++++
 ...gtk-Pass-G_ALIGNOF-.-to-gtk_sort_keys_new.patch | 160 +++++++++++++++++++++
 gui-libs/gtk/gtk-4.10.4.ebuild                     |   5 +
 3 files changed, 215 insertions(+)

diff --git a/gui-libs/gtk/files/4.10.4-gtk-Align-key_size-up-to-key_align.patch 
b/gui-libs/gtk/files/4.10.4-gtk-Align-key_size-up-to-key_align.patch
new file mode 100644
index 000000000000..388c8011344f
--- /dev/null
+++ b/gui-libs/gtk/files/4.10.4-gtk-Align-key_size-up-to-key_align.patch
@@ -0,0 +1,50 @@
+From a3582031576783fbc644fdd2ad914820d0ba4863 Mon Sep 17 00:00:00 2001
+From: Matt Turner <matts...@gmail.com>
+Date: Mon, 19 Jun 2023 15:50:04 -0400
+Subject: [PATCH] gtk: Align key_size up to key_align
+
+Avoids unaligned accesses when e.g. the key_size is 12 and key_align is
+8. We need to round the key size up to 16 to ensure that all keys are
+appropriately aligned.
+
+This manifested as a failure in the `gtk:gtk / sorter` unit test on
+sparc.
+
+Closes: https://gitlab.gnome.org/GNOME/gtk/-/issues/5907
+(cherry picked from commit 3f360aa883dc51ad986c721be01b494020e5ac9d)
+---
+ gtk/gtkmultisorter.c   | 3 ++-
+ gtk/gtksortlistmodel.c | 3 ++-
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/gtk/gtkmultisorter.c b/gtk/gtkmultisorter.c
+index ddbdb440cb..e8744015af 100644
+--- a/gtk/gtkmultisorter.c
++++ b/gtk/gtkmultisorter.c
+@@ -186,7 +186,8 @@ gtk_multi_sort_keys_new (GtkMultiSorter *self)
+     {
+       result->keys[i].keys = gtk_sorter_get_keys (gtk_sorters_get 
(&self->sorters, i));
+       result->keys[i].offset = GTK_SORT_KEYS_ALIGN (keys->key_size, 
gtk_sort_keys_get_key_align (result->keys[i].keys));
+-      keys->key_size = result->keys[i].offset + gtk_sort_keys_get_key_size 
(result->keys[i].keys);
++      keys->key_size = result->keys[i].offset + GTK_SORT_KEYS_ALIGN 
(gtk_sort_keys_get_key_size (result->keys[i].keys),
++                                                                     
gtk_sort_keys_get_key_align (result->keys[i].keys));
+       keys->key_align = MAX (keys->key_align, gtk_sort_keys_get_key_align 
(result->keys[i].keys));
+     }
+ 
+diff --git a/gtk/gtksortlistmodel.c b/gtk/gtksortlistmodel.c
+index c2feb9e250..44414c1fd4 100644
+--- a/gtk/gtksortlistmodel.c
++++ b/gtk/gtksortlistmodel.c
+@@ -439,7 +439,8 @@ gtk_sort_list_model_create_keys (GtkSortListModel *self)
+   g_assert (self->key_size == 0);
+ 
+   self->sort_keys = gtk_sorter_get_keys (self->sorter);
+-  self->key_size = gtk_sort_keys_get_key_size (self->sort_keys);
++  self->key_size = GTK_SORT_KEYS_ALIGN (gtk_sort_keys_get_key_size 
(self->sort_keys),
++                                        gtk_sort_keys_get_key_align 
(self->sort_keys));
+   self->keys = g_malloc_n (self->n_items, self->key_size);
+   self->missing_keys = gtk_bitset_new_range (0, self->n_items);
+ }
+-- 
+2.41.0
+

diff --git 
a/gui-libs/gtk/files/4.10.4-gtk-Pass-G_ALIGNOF-.-to-gtk_sort_keys_new.patch 
b/gui-libs/gtk/files/4.10.4-gtk-Pass-G_ALIGNOF-.-to-gtk_sort_keys_new.patch
new file mode 100644
index 000000000000..3cfe54078c03
--- /dev/null
+++ b/gui-libs/gtk/files/4.10.4-gtk-Pass-G_ALIGNOF-.-to-gtk_sort_keys_new.patch
@@ -0,0 +1,160 @@
+From 00cdaba5a89eedb6f7334bdfa523e374e5dc4b12 Mon Sep 17 00:00:00 2001
+From: Matt Turner <matts...@gmail.com>
+Date: Mon, 19 Jun 2023 15:47:17 -0400
+Subject: [PATCH] gtk: Pass G_ALIGNOF (...) to gtk_sort_keys_new
+
+The sizeof and G_ALIGNOF are often, but not always, identical.
+
+(cherry picked from commit a4440453868ebe7c87d0a69de9609b33a688a8bb)
+---
+ gtk/gtknumericsorter.c     | 22 +++++++++++-----------
+ gtk/gtksorter.c            |  2 +-
+ gtk/gtkstringsorter.c      |  2 +-
+ gtk/gtktreelistrowsorter.c |  2 +-
+ 4 files changed, 14 insertions(+), 14 deletions(-)
+
+diff --git a/gtk/gtknumericsorter.c b/gtk/gtknumericsorter.c
+index 4f474ad14d..f66d5ff505 100644
+--- a/gtk/gtknumericsorter.c
++++ b/gtk/gtknumericsorter.c
+@@ -227,7 +227,7 @@ gtk_numeric_sort_keys_new (GtkNumericSorter *self)
+                                                       ? 
&GTK_ASCENDING_BOOLEAN_SORT_KEYS_CLASS
+                                                       : 
&GTK_DESCENDING_BOOLEAN_SORT_KEYS_CLASS,
+                                   sizeof (char),
+-                                  sizeof (char));
++                                  G_ALIGNOF (char));
+       break;
+ 
+     case G_TYPE_CHAR:
+@@ -236,7 +236,7 @@ gtk_numeric_sort_keys_new (GtkNumericSorter *self)
+                                                       ? 
&GTK_ASCENDING_CHAR_SORT_KEYS_CLASS
+                                                       : 
&GTK_DESCENDING_CHAR_SORT_KEYS_CLASS,
+                                   sizeof (char),
+-                                  sizeof (char));
++                                  G_ALIGNOF (char));
+       break;
+ 
+     case G_TYPE_UCHAR:
+@@ -245,7 +245,7 @@ gtk_numeric_sort_keys_new (GtkNumericSorter *self)
+                                                       ? 
&GTK_ASCENDING_UCHAR_SORT_KEYS_CLASS
+                                                       : 
&GTK_DESCENDING_UCHAR_SORT_KEYS_CLASS,
+                                   sizeof (guchar),
+-                                  sizeof (guchar));
++                                  G_ALIGNOF (guchar));
+       break;
+ 
+     case G_TYPE_INT:
+@@ -254,7 +254,7 @@ gtk_numeric_sort_keys_new (GtkNumericSorter *self)
+                                                       ? 
&GTK_ASCENDING_INT_SORT_KEYS_CLASS
+                                                       : 
&GTK_DESCENDING_INT_SORT_KEYS_CLASS,
+                                   sizeof (int),
+-                                  sizeof (int));
++                                  G_ALIGNOF (int));
+       break;
+ 
+     case G_TYPE_UINT:
+@@ -263,7 +263,7 @@ gtk_numeric_sort_keys_new (GtkNumericSorter *self)
+                                                       ? 
&GTK_ASCENDING_UINT_SORT_KEYS_CLASS
+                                                       : 
&GTK_DESCENDING_UINT_SORT_KEYS_CLASS,
+                                   sizeof (guint),
+-                                  sizeof (guint));
++                                  G_ALIGNOF (guint));
+       break;
+ 
+     case G_TYPE_FLOAT:
+@@ -272,7 +272,7 @@ gtk_numeric_sort_keys_new (GtkNumericSorter *self)
+                                                       ? 
&GTK_ASCENDING_FLOAT_SORT_KEYS_CLASS
+                                                       : 
&GTK_DESCENDING_FLOAT_SORT_KEYS_CLASS,
+                                   sizeof (float),
+-                                  sizeof (float));
++                                  G_ALIGNOF (float));
+       break;
+ 
+     case G_TYPE_DOUBLE:
+@@ -281,7 +281,7 @@ gtk_numeric_sort_keys_new (GtkNumericSorter *self)
+                                                       ? 
&GTK_ASCENDING_DOUBLE_SORT_KEYS_CLASS
+                                                       : 
&GTK_DESCENDING_DOUBLE_SORT_KEYS_CLASS,
+                                   sizeof (double),
+-                                  sizeof (double));
++                                  G_ALIGNOF (double));
+       break;
+ 
+     case G_TYPE_LONG:
+@@ -290,7 +290,7 @@ gtk_numeric_sort_keys_new (GtkNumericSorter *self)
+                                                       ? 
&GTK_ASCENDING_LONG_SORT_KEYS_CLASS
+                                                       : 
&GTK_DESCENDING_LONG_SORT_KEYS_CLASS,
+                                   sizeof (long),
+-                                  sizeof (long));
++                                  G_ALIGNOF (long));
+       break;
+ 
+     case G_TYPE_ULONG:
+@@ -299,7 +299,7 @@ gtk_numeric_sort_keys_new (GtkNumericSorter *self)
+                                                       ? 
&GTK_ASCENDING_ULONG_SORT_KEYS_CLASS
+                                                       : 
&GTK_DESCENDING_ULONG_SORT_KEYS_CLASS,
+                                   sizeof (gulong),
+-                                  sizeof (gulong));
++                                  G_ALIGNOF (gulong));
+       break;
+ 
+     case G_TYPE_INT64:
+@@ -308,7 +308,7 @@ gtk_numeric_sort_keys_new (GtkNumericSorter *self)
+                                                       ? 
&GTK_ASCENDING_INT64_SORT_KEYS_CLASS
+                                                       : 
&GTK_DESCENDING_INT64_SORT_KEYS_CLASS,
+                                   sizeof (gint64),
+-                                  sizeof (gint64));
++                                  G_ALIGNOF (gint64));
+       break;
+ 
+     case G_TYPE_UINT64:
+@@ -317,7 +317,7 @@ gtk_numeric_sort_keys_new (GtkNumericSorter *self)
+                                                       ? 
&GTK_ASCENDING_UINT64_SORT_KEYS_CLASS
+                                                       : 
&GTK_DESCENDING_UINT64_SORT_KEYS_CLASS,
+                                   sizeof (guint64),
+-                                  sizeof (guint64));
++                                  G_ALIGNOF (guint64));
+       break;
+ 
+     default:
+diff --git a/gtk/gtksorter.c b/gtk/gtksorter.c
+index 2de29554ec..18bf950cf6 100644
+--- a/gtk/gtksorter.c
++++ b/gtk/gtksorter.c
+@@ -304,7 +304,7 @@ gtk_sorter_get_keys (GtkSorter *self)
+   if (priv->keys)
+     return gtk_sort_keys_ref (priv->keys);
+ 
+-  fallback = gtk_sort_keys_new (GtkDefaultSortKeys, 
&GTK_DEFAULT_SORT_KEYS_CLASS, sizeof (gpointer), sizeof (gpointer));
++  fallback = gtk_sort_keys_new (GtkDefaultSortKeys, 
&GTK_DEFAULT_SORT_KEYS_CLASS, sizeof (gpointer), G_ALIGNOF (gpointer));
+   fallback->sorter = g_object_ref (self);
+ 
+   return (GtkSortKeys *) fallback;
+diff --git a/gtk/gtkstringsorter.c b/gtk/gtkstringsorter.c
+index 70739509e2..17c46b4436 100644
+--- a/gtk/gtkstringsorter.c
++++ b/gtk/gtkstringsorter.c
+@@ -234,7 +234,7 @@ gtk_string_sort_keys_new (GtkStringSorter *self)
+   result = gtk_sort_keys_new (GtkStringSortKeys,
+                               &GTK_STRING_SORT_KEYS_CLASS,
+                               sizeof (char *),
+-                              sizeof (char *));
++                              G_ALIGNOF (char *));
+ 
+   result->expression = gtk_expression_ref (self->expression);
+   result->ignore_case = self->ignore_case;
+diff --git a/gtk/gtktreelistrowsorter.c b/gtk/gtktreelistrowsorter.c
+index d7932cb067..6503948a89 100644
+--- a/gtk/gtktreelistrowsorter.c
++++ b/gtk/gtktreelistrowsorter.c
+@@ -350,7 +350,7 @@ gtk_tree_list_row_sort_keys_new (GtkTreeListRowSorter 
*self)
+   result = gtk_sort_keys_new (GtkTreeListRowSortKeys,
+                               &GTK_TREE_LIST_ROW_SORT_KEYS_CLASS,
+                               sizeof (gpointer[MAX_KEY_DEPTH]),
+-                              sizeof (gpointer[MAX_KEY_DEPTH]));
++                              G_ALIGNOF (gpointer));
+ 
+   if (self->sorter)
+     result->sort_keys = gtk_sorter_get_keys (self->sorter);
+-- 
+2.41.0
+

diff --git a/gui-libs/gtk/gtk-4.10.4.ebuild b/gui-libs/gtk/gtk-4.10.4.ebuild
index 5624e17877cc..79ae3bf49fc8 100644
--- a/gui-libs/gtk/gtk-4.10.4.ebuild
+++ b/gui-libs/gtk/gtk-4.10.4.ebuild
@@ -96,6 +96,11 @@ BDEPEND="
        )
 "
 
+PATCHES=(
+       "${FILESDIR}"/${PV}-gtk-Pass-G_ALIGNOF-.-to-gtk_sort_keys_new.patch
+       "${FILESDIR}"/${PV}-gtk-Align-key_size-up-to-key_align.patch
+)
+
 python_check_deps() {
        python_has_version "dev-python/pygobject:3[${PYTHON_USEDEP}]" || return
 }

Reply via email to