On Fri, Jan 13, 2012 at 03:03:09PM +0100, David Coppa wrote:
> Hi!
> 
> I've noticed that on sparc64 we got the same SIGBUS described here:
> 
> http://comments.gmane.org/gmane.comp.freedesktop.xorg/44722
> 
> This happens frequently and it's annoying as it renders GTK2
> applications unusable on sparc64, since our gtk+2 is being
> built using "--with-xinput".
> 
> ---8<---
> 
> GNU gdb 6.3
> Copyright 2004 Free Software Foundation, Inc.
> GDB is free software, covered by the GNU General Public License, and you are
> welcome to change it and/or distribute copies of it under certain conditions.
> Type "show copying" to see the conditions.
> There is absolutely no warranty for GDB.  Type "show warranty" for details.
> This GDB was configured as "sparc64-unknown-openbsd5.0"...(no debugging 
> symbols found)
> 
> (gdb) run
> Starting program: /usr/local/bin/gtk-demo 
> (no debugging symbols found)
> (no debugging symbols found)
> (no debugging symbols found)
> 
> Program received signal SIGBUS, Bus error.
> 0x000000020bd628ac in ParseClassInfo (any=0xfffffffffffcf068, 
> Any=0xfffffffffffcf058, num_classes=1) at 
> /usr/xenocara/lib/libXi/src/XListDev.c:104
> 104                       K->class = KeyClass;
> (gdb) bt
> #0  0x000000020bd628ac in ParseClassInfo (any=0xfffffffffffcf068, 
> Any=0xfffffffffffcf058, num_classes=1) at 
> /usr/xenocara/lib/libXi/src/XListDev.c:104
> #1  0x000000020bd63024 in XListInputDevices (dpy=0x20ca5edb0, 
> ndevices=0xfffffffffffcf18c) at /usr/xenocara/lib/libXi/src/XListDev.c:227
> #2  0x0000000209b7c518 in gdk_drag_action_get_type () from 
> /usr/local/lib/libgdk-x11-2.0.so.2400.0
> #3  0x0000000209b53c74 in gdk_drag_action_get_type () from 
> /usr/local/lib/libgdk-x11-2.0.so.2400.0
> #4  0x0000000209b1c58c in gdk_display_open_default_libgtk_only () from 
> /usr/local/lib/libgdk-x11-2.0.so.2400.0
> #5  0x00000002008603e4 in gtk_init_check () from 
> /usr/local/lib/libgtk-x11-2.0.so.2400.0
> #6  0x000000020086041c in gtk_init () from 
> /usr/local/lib/libgtk-x11-2.0.so.2400.0
> #7  0x0000000000122e5c in main ()
> (gdb) bt full
> #0  0x000000020bd628ac in ParseClassInfo (any=0xfffffffffffcf068, 
> Any=0xfffffffffffcf058, num_classes=1) at 
> /usr/xenocara/lib/libXi/src/XListDev.c:104
>       K = 0x20785ad44
>       k = 0x20c994860
>       j = 0
>       k = 3
> #1  0x000000020bd63024 in XListInputDevices (dpy=0x20ca5edb0, 
> ndevices=0xfffffffffffcf18c) at /usr/xenocara/lib/libXi/src/XListDev.c:227
>       size = 695
>       req = (xListInputDevicesReq *) 0x202248000
>       rep = {repType = 1 '\001', RepType = 2 '\002', sequenceNumber = 105, 
> length = 87, ndevices = 6 '\006', pad1 = 0 '\0', pad2 = 0 '\0', pad3 = 0 
> '\0', 
>   pad01 = 0, pad02 = 0, pad03 = 0, pad04 = 0, pad05 = 0}
>       list = (xDeviceInfo *) 0x20c994808
>       slist = (xDeviceInfo *) 0x20c994800
>       sclist = (XDeviceInfo *) 0x20785ac00
>       clist = (XDeviceInfo *) 0x20785ac28
>       any = 0x20c994860
>       sav_any = 0x20c994830
>       Any = 0x20785ad44
>       nptr = 0x20c99495b ""
>       Nptr = 0xfffffffffffcf18c ""
>       i = 1
>       rlen = 348
>       info = (XExtDisplayInfo *) 0x20a1b7100
> 
> ---8<---
> 
> So, I've cherrypicked the patch at:
> http://patchwork.freedesktop.org/patch/2272/
> 
> ...And applied it to SizeClassInfo() too as suggested (it won't hurt)
> 
> This fixes the issue for me.
> Comments or suggestions?

You should ping Peter to ask him why this is still not committed
upstreams. 

It looks to me like this changes the on-wire procol, but I'm not sure
and I haven't found time to check for real during the weekend.

> 
> Index: src/XListDev.c
> ===================================================================
> RCS file: /cvs/xenocara/lib/libXi/src/XListDev.c,v
> retrieving revision 1.3
> diff -u -p -r1.3 XListDev.c
> --- src/XListDev.c    11 Nov 2010 10:49:22 -0000      1.3
> +++ src/XListDev.c    13 Jan 2012 13:07:33 -0000
> @@ -58,6 +58,17 @@ SOFTWARE.
>  #include <X11/extensions/extutil.h>
>  #include "XIint.h"
>  
> +/* Calculate length field to a multiples of sizeof(XID). XIDs are typedefs
> + * to ulong and thus may be 8 bytes on some platforms. This can trigger a
> + * SIGBUS if a class ends up not being 8-aligned (e.g. after XAxisInfo).
> + */
> +static int pad_to_xid(int base_size)
> +{
> +    int padsize = sizeof(XID);
> +
> +    return ((base_size + padsize - 1)/padsize) * padsize;
> +}
> +
>  static int
>  SizeClassInfo(xAnyClassPtr *any, int num_classes)
>  {
> @@ -66,18 +77,18 @@ SizeClassInfo(xAnyClassPtr *any, int num
>      for (j = 0; j < num_classes; j++) {
>          switch ((*any)->class) {
>              case KeyClass:
> -                size += sizeof(XKeyInfo);
> +                size += pad_to_xid(sizeof(XKeyInfo));
>                  break;
>              case ButtonClass:
> -                size += sizeof(XButtonInfo);
> +                size += pad_to_xid(sizeof(XButtonInfo));
>                  break;
>              case ValuatorClass:
>                  {
>                      xValuatorInfoPtr v;
>  
>                      v = (xValuatorInfoPtr) *any;
> -                    size += sizeof(XValuatorInfo) +
> -                        (v->num_axes * sizeof(XAxisInfo));
> +                    size += pad_to_xid(sizeof(XValuatorInfo) +
> +                        (v->num_axes * sizeof(XAxisInfo)));
>                      break;
>                  }
>              default:
> @@ -102,7 +113,7 @@ ParseClassInfo(xAnyClassPtr *any, XAnyCl
>                      xKeyInfoPtr k = (xKeyInfoPtr) *any;
>  
>                      K->class = KeyClass;
> -                    K->length = sizeof(XKeyInfo);
> +                    K->length = pad_to_xid(sizeof(XKeyInfo));
>                      K->min_keycode = k->min_keycode;
>                      K->max_keycode = k->max_keycode;
>                      K->num_keys = k->num_keys;
> @@ -114,7 +125,7 @@ ParseClassInfo(xAnyClassPtr *any, XAnyCl
>                      xButtonInfoPtr b = (xButtonInfoPtr) *any;
>  
>                      B->class = ButtonClass;
> -                    B->length = sizeof(XButtonInfo);
> +                    B->length = pad_to_xid(sizeof(XButtonInfo));
>                      B->num_buttons = b->num_buttons;
>                      break;
>                  }
> @@ -126,8 +137,8 @@ ParseClassInfo(xAnyClassPtr *any, XAnyCl
>                      xAxisInfoPtr a;
>  
>                      V->class = ValuatorClass;
> -                    V->length = sizeof(XValuatorInfo) +
> -                        (v->num_axes * sizeof(XAxisInfo));
> +                    V->length = pad_to_xid(sizeof(XValuatorInfo) +
> +                        (v->num_axes * sizeof(XAxisInfo)));
>                      V->num_axes = v->num_axes;
>                      V->motion_buffer = v->motion_buffer_size;
>                      V->mode = v->mode;

-- 
Matthieu Herrb

Reply via email to