gtk: Align key_size up to key_align
authorMatt Turner <mattst88@gmail.com>
Mon, 19 Jun 2023 19:50:04 +0000 (15:50 -0400)
committerMatt Turner <mattst88@gmail.com>
Mon, 19 Jun 2023 19:55:09 +0000 (15:55 -0400)
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
gtk/gtkmultisorter.c
gtk/gtksortlistmodel.c

index 1ddf5824df39b27f4994bfe1d4059d72388418b6..fd7a95b041c6c55a2d7742ec13770667d15440dc 100644 (file)
@@ -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));
     }
 
index 61ca5a8c64d004bbe799fc30727bfd669170a577..e1103287264524076247cf86870e88079304ef03 100644 (file)
@@ -607,7 +607,8 @@ gtk_sort_list_model_create_keys (GtkSortListModel *self)
   self->sort_keys = gtk_sorter_get_keys (self->real_sorter);
   if (self->section_sorter)
     self->section_sort_keys = gtk_sorter_get_keys (self->section_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);
 }