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) + ? >K_ASCENDING_BOOLEAN_SORT_KEYS_CLASS + : >K_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) + ? >K_ASCENDING_CHAR_SORT_KEYS_CLASS + : >K_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) + ? >K_ASCENDING_UCHAR_SORT_KEYS_CLASS + : >K_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) + ? >K_ASCENDING_INT_SORT_KEYS_CLASS + : >K_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) + ? >K_ASCENDING_UINT_SORT_KEYS_CLASS + : >K_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) + ? >K_ASCENDING_FLOAT_SORT_KEYS_CLASS + : >K_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) + ? >K_ASCENDING_DOUBLE_SORT_KEYS_CLASS + : >K_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) + ? >K_ASCENDING_LONG_SORT_KEYS_CLASS + : >K_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) + ? >K_ASCENDING_ULONG_SORT_KEYS_CLASS + : >K_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) + ? >K_ASCENDING_INT64_SORT_KEYS_CLASS + : >K_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) + ? >K_ASCENDING_UINT64_SORT_KEYS_CLASS + : >K_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, >K_DEFAULT_SORT_KEYS_CLASS, sizeof (gpointer), sizeof (gpointer)); ++ fallback = gtk_sort_keys_new (GtkDefaultSortKeys, >K_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, + >K_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, + >K_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 }