Some architectures (hi, sparc!) are unhappy with unaligned memory accesses. So make sure the axisVal member of ValuatorClassRec has sizeof(double) alignment to avoid crashes and test failures.
X.Org bug#34742 <https://bugs.freedesktop.org/show_bug.cgi?id=34742> Signed-off-by: Julien Cristau <[email protected]> --- dix/devices.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) diff --git a/dix/devices.c b/dix/devices.c index 6c0dc42..959817e 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -1225,6 +1225,7 @@ InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes, Atom *labels, { int i; ValuatorClassPtr valc; + int len; if (!dev) return FALSE; @@ -1237,9 +1238,10 @@ InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes, Atom *labels, numAxes = MAX_VALUATORS; } - valc = (ValuatorClassPtr)calloc(1, sizeof(ValuatorClassRec) + - numAxes * sizeof(AxisInfo) + - numAxes * sizeof(double)); + len = sizeof(ValuatorClassRec) + numAxes * sizeof(AxisInfo); + /* round up so that valc->axisVal is properly aligned */ + len = (len + sizeof(double) - 1) & ~(sizeof(double) - 1); + valc = (ValuatorClassPtr)calloc(1, len + numAxes * sizeof(double)); if (!valc) return FALSE; @@ -1252,7 +1254,7 @@ InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes, Atom *labels, valc->motionHintWindow = NullWindow; valc->numAxes = numAxes; valc->axes = (AxisInfoPtr)(valc + 1); - valc->axisVal = (double *)(valc->axes + numAxes); + valc->axisVal = (double *)((char *)valc + len); if (mode & OutOfProximity) InitProximityClassDeviceStruct(dev); -- 1.7.2.3 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
