Fix undefined behavior
authorValentin <vakevk+git@gmail.com>
Fri, 4 Sep 2020 10:15:03 +0000 (12:15 +0200)
committerValentin <vakevk+git@gmail.com>
Fri, 4 Sep 2020 10:27:33 +0000 (12:27 +0200)
Without the casts the bytes accesses get converted to int. but int is
not guaranteed to be 4 bytes large. Even when it is 4 bytes large
`bytes[3] << 24` does not fit because int is signed.

Signed-off-by: Valentin Kettner <vakevk@gmail.com>
cursor/xcursor.c

index 689c702..1f1360f 100644 (file)
@@ -285,10 +285,11 @@ _XcursorReadUInt (XcursorFile *file, XcursorUInt *u)
 
     if ((*file->read) (file, bytes, 4) != 4)
        return XcursorFalse;
-    *u = ((bytes[0] << 0) |
-         (bytes[1] << 8) |
-         (bytes[2] << 16) |
-         (bytes[3] << 24));
+
+    *u = ((XcursorUInt)(bytes[0]) << 0) |
+         ((XcursorUInt)(bytes[1]) << 8) |
+         ((XcursorUInt)(bytes[2]) << 16) |
+         ((XcursorUInt)(bytes[3]) << 24);
     return XcursorTrue;
 }