[PATCH libXi] Force class alignment to a multiple of sizeof(XID).
Peter Hutterer
peter.hutterer at who-t.net
Wed Jan 18 13:58:24 PST 2012
On Tue, Jan 17, 2012 at 09:26:14PM +0100, Matthieu Herrb wrote:
> From: Peter Hutterer <peter.hutterer at who-t.net>
>
> 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).
>
> Reported-by: Nicolai Stange <nicolai.stange at zmaw.de>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> Signed-off-by: Matthieu Herrb <matthieu.herrb at laas.fr>
15feb92..07ced7b master -> master
thanks.
Cheers,
Peter
> ---
> src/XListDev.c | 27 +++++++++++++++++++--------
> 1 files changed, 19 insertions(+), 8 deletions(-)
>
> diff --git a/src/XListDev.c b/src/XListDev.c
> index 6a16da4..6b91238 100644
> --- a/src/XListDev.c
> +++ b/src/XListDev.c
> @@ -61,6 +61,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)
> {
> @@ -69,18 +80,18 @@ SizeClassInfo(xAnyClassPtr *any, int num_classes)
> 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:
> @@ -105,7 +116,7 @@ ParseClassInfo(xAnyClassPtr *any, XAnyClassPtr *Any, int num_classes)
> 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;
> @@ -117,7 +128,7 @@ ParseClassInfo(xAnyClassPtr *any, XAnyClassPtr *Any, int num_classes)
> 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;
> }
> @@ -129,8 +140,8 @@ ParseClassInfo(xAnyClassPtr *any, XAnyClassPtr *Any, int num_classes)
> 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;
> --
> 1.7.6
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>
More information about the xorg-devel
mailing list