Alignment error in libXi
Christian Weisgerber
naddy at mips.inka.de
Sun Mar 13 15:11:39 PDT 2011
GTK+3 blows up on LP64 archs with strict alignment. This comes
down to an unaligned access error in libXi, specifically in
the XIButtonClass case in copy_classes() in XExtInt.c.
cls_lib->num_buttons = cls_wire->num_buttons;
cls_lib->state.mask_len = ((((cls_wire->num_buttons + 7)/8) + 3)/4) * 4;
cls_lib->state.mask = next_block(&ptr_lib, cls_lib->state.mask_len);
memcpy(cls_lib->state.mask, &cls_wire[1],
cls_lib->state.mask_len);
cls_lib->labels = next_block(&ptr_lib, cls_lib->num_buttons * sizeof(Atom));
atoms =(uint32_t*)((char*)&cls_wire[1] + cls_lib->state.mask_len);
for (j = 0; j < cls_lib->num_buttons; j++)
cls_lib->labels[j] = *atoms++;
It's the cls_lib->labels[j] = *atoms++ assignment that blows up.
For state.mask, n*4 bytes are allocated from the ptr_lib area.
labels is allocated immediately following that, but labels is an
array of Atoms, which are longs, i.e, an 8-byte type on LP64 archs.
labels can end up on an address that is misaligned for Atom
assignments, like it did here:
#0 0x00000001616ea910 in copy_classes (to=0x165db5600, from=0x161bae020,
nclasses=3) at /usr/xenocara/lib/libXi/src/XExtInt.c:1490
1490 cls_lib->labels[j] = *atoms++;
(gdb) bt
#0 0x00000001616ea910 in copy_classes (to=0x165db5600, from=0x161bae020,
nclasses=3) at /usr/xenocara/lib/libXi/src/XExtInt.c:1490
#1 0x00000001616ecd80 in XIQueryDevice (dpy=0x16b964db0, deviceid=0,
ndevices_return=0x1fffe44f0)
at /usr/xenocara/lib/libXi/src/XIQueryDevice.c:90
#2 0x000000016c30b6b0 in gdk_x11_device_manager_xi2_constructed (
object=0x16f8886a0) at gdkdevicemanager-xi2.c:413
#3 0x000000016bf08488 in g_object_newv ()
from /usr/local/lib/libgobject-2.0.so.2800.0
#4 0x000000016bf08a48 in g_object_new_valist ()
from /usr/local/lib/libgobject-2.0.so.2800.0
#5 0x000000016bf07dec in g_object_new ()
from /usr/local/lib/libgobject-2.0.so.2800.0
#6 0x000000016c308c10 in _gdk_x11_device_manager_new (display=0x164582000)
at gdkdevicemanager-x11.c:59
#7 0x000000016c310a0c in _gdk_x11_display_open (display_name=0x0)
at gdkdisplay-x11.c:1228
#8 0x000000016c30dff4 in gdk_x11_display_manager_open_display (
manager=0x1659b0000, name=0x0) at gdkdisplaymanager-x11.c:55
#9 0x000000016c2d4130 in gdk_display_manager_open_display (
manager=0x1659b0000, name=0x0) at gdkdisplaymanager.c:362
#10 0x000000016c2d29e4 in gdk_display_open (display_name=0x0)
at gdkdisplay.c:1720
#11 0x000000016c2c44b4 in gdk_display_open_default_libgtk_only () at gdk.c:341
#12 0x0000000168a9981c in gtk_init_check (argc=0x1fffe49a8, argv=0x1fffe49b0)
at gtkmain.c:1132
#13 0x0000000168a99878 in gtk_init (argc=0x1fffe49a8, argv=0x1fffe49b0)
at gtkmain.c:1184
#14 0x0000000120031094 in main (argc=1, argv=0x1fffe4a70) at main.c:948
(gdb) i loc
cls_lib = (XIButtonClassInfo *) 0x165db5018
cls_wire = (xXIButtonInfo *) 0x161bae020
atoms = (uint32_t *) 0x161bae02c
j = 0
any_lib = (XIAnyClassInfo *) 0x165db5018
any_wire = (xXIAnyInfo *) 0x161bae020
ptr_lib = (void *) 0x165db5094
ptr_wire = 0x161bae020 "\001"
i = 0
len = 0
(gdb) p cls_lib->labels
$1 = (Atom *) 0x165db5044
(gdb) p sizeof(Atom)
$2 = 8
(gdb)
--
Christian "naddy" Weisgerber naddy at mips.inka.de
More information about the xorg
mailing list