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

Reply via email to