commit 9a5678a8a95c46913c15a5fc19f73c113e8ed036 from: rsc date: Sat Nov 04 20:41:42 2006 UTC Change GET/GBIT32 macros to explicitly cast final result to u32int. Otherwise, the type of the expression will be int, and if written to a uvlong (or just a ulong on most 64-bit systems), it will be sign-extended. This was going on in drawfcall with Mouse.msec, which is declared as a ulong. This fix assumes that the protocols only send unsigned numbers, which is true. commit - 3a19470202c5c0f6e9375e5d57535c3d508f2edf commit + 9a5678a8a95c46913c15a5fc19f73c113e8ed036 blob - e8a8c9b20e2929f9554239fb981110438b018d54 blob + 0d5cd6d3dcd19a334d300a9a10318e83fe6b2985 --- include/drawfcall.h +++ include/drawfcall.h @@ -53,7 +53,7 @@ AUTOLIB(draw) (p)[3] = (x)&0xFF #define GET(p, x) \ - ((x) = (((p)[0] << 24) | ((p)[1] << 16) | ((p)[2] << 8) | ((p)[3]))) + ((x) = (u32int)(((p)[0] << 24) | ((p)[1] << 16) | ((p)[2] << 8) | ((p)[3]))) #define PUT2(p, x) \ (p)[0] = ((x) >> 8)&0xFF, \ blob - aebb451500381ab68b2e45fc749130136848561e blob + a5dae3371e3bb3431e361871b97dc69ffc842ab8 --- include/fcall.h +++ include/fcall.h @@ -50,7 +50,7 @@ struct Fcall #define GBIT8(p) ((p)[0]) #define GBIT16(p) ((p)[0]|((p)[1]<<8)) -#define GBIT32(p) ((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) +#define GBIT32(p) ((u32int)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24))) #define GBIT64(p) ((u32int)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) |\ ((vlong)((p)[4]|((p)[5]<<8)|((p)[6]<<16)|((p)[7]<<24)) << 32))