X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=com_msg.c;h=80503b62b5307ff3d1ebf44ebf94da2aa02144e4;hb=4dcdfb3370a11f338014164eec075b7fd7bb57b5;hp=0de4fc677032e548d7da4969da6138edc069156c;hpb=7d917e0a7817da5998432cf9b7e779a623ef1bb3;p=xonotic%2Fdarkplaces.git diff --git a/com_msg.c b/com_msg.c index 0de4fc67..80503b62 100644 --- a/com_msg.c +++ b/com_msg.c @@ -1,5 +1,6 @@ /* Copyright (C) 1996-1997 Id Software, Inc. +Copyright (C) 2000-2020 DarkPlaces contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -29,6 +30,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ============================================================================ */ +/* Casting to unsigned when shifting by 24 bits here is necessary to prevent UB + * caused by shifting outside the range of int on platforms where int is 32 bits. + */ float BuffBigFloat (const unsigned char *buffer) { @@ -38,13 +42,13 @@ float BuffBigFloat (const unsigned char *buffer) unsigned int i; } u; - u.i = (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]; + u.i = ((unsigned)buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]; return u.f; } int BuffBigLong (const unsigned char *buffer) { - return (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]; + return ((unsigned)buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]; } short BuffBigShort (const unsigned char *buffer) @@ -60,13 +64,13 @@ float BuffLittleFloat (const unsigned char *buffer) unsigned int i; } u; - u.i = (buffer[3] << 24) | (buffer[2] << 16) | (buffer[1] << 8) | buffer[0]; + u.i = ((unsigned)buffer[3] << 24) | (buffer[2] << 16) | (buffer[1] << 8) | buffer[0]; return u.f; } int BuffLittleLong (const unsigned char *buffer) { - return (buffer[3] << 24) | (buffer[2] << 16) | (buffer[1] << 8) | buffer[0]; + return ((unsigned)buffer[3] << 24) | (buffer[2] << 16) | (buffer[1] << 8) | buffer[0]; } short BuffLittleShort (const unsigned char *buffer) @@ -182,18 +186,12 @@ void MSG_WriteUnterminatedString (sizebuf_t *sb, const char *s) void MSG_WriteCoord13i (sizebuf_t *sb, float f) { - if (f >= 0) - MSG_WriteShort (sb, (int)(f * 8.0 + 0.5)); - else - MSG_WriteShort (sb, (int)(f * 8.0 - 0.5)); + MSG_WriteShort (sb, Q_rint(f*8)); } void MSG_WriteCoord16i (sizebuf_t *sb, float f) { - if (f >= 0) - MSG_WriteShort (sb, (int)(f + 0.5)); - else - MSG_WriteShort (sb, (int)(f - 0.5)); + MSG_WriteShort (sb, Q_rint(f)); } void MSG_WriteCoord32f (sizebuf_t *sb, float f) @@ -223,18 +221,12 @@ void MSG_WriteVector (sizebuf_t *sb, const vec3_t v, protocolversion_t protocol) // LadyHavoc: round to nearest value, rather than rounding toward zero, fixes crosshair problem void MSG_WriteAngle8i (sizebuf_t *sb, float f) { - if (f >= 0) - MSG_WriteByte (sb, (int)(f*(256.0/360.0) + 0.5) & 255); - else - MSG_WriteByte (sb, (int)(f*(256.0/360.0) - 0.5) & 255); + MSG_WriteByte (sb, (int)Q_rint(f*(256.0/360.0)) & 255); } void MSG_WriteAngle16i (sizebuf_t *sb, float f) { - if (f >= 0) - MSG_WriteShort (sb, (int)(f*(65536.0/360.0) + 0.5) & 65535); - else - MSG_WriteShort (sb, (int)(f*(65536.0/360.0) - 0.5) & 65535); + MSG_WriteShort (sb, (int)Q_rint(f*(65536.0/360.0)) & 65535); } void MSG_WriteAngle32f (sizebuf_t *sb, float f) @@ -298,7 +290,7 @@ int MSG_ReadLittleLong (sizebuf_t *sb) return -1; } sb->readcount += 4; - return sb->data[sb->readcount-4] | (sb->data[sb->readcount-3]<<8) | (sb->data[sb->readcount-2]<<16) | (sb->data[sb->readcount-1]<<24); + return sb->data[sb->readcount-4] | (sb->data[sb->readcount-3]<<8) | (sb->data[sb->readcount-2]<<16) | ((unsigned)sb->data[sb->readcount-1]<<24); } int MSG_ReadBigLong (sizebuf_t *sb) @@ -309,7 +301,7 @@ int MSG_ReadBigLong (sizebuf_t *sb) return -1; } sb->readcount += 4; - return (sb->data[sb->readcount-4]<<24) + (sb->data[sb->readcount-3]<<16) + (sb->data[sb->readcount-2]<<8) + sb->data[sb->readcount-1]; + return ((unsigned)sb->data[sb->readcount-4]<<24) + (sb->data[sb->readcount-3]<<16) + (sb->data[sb->readcount-2]<<8) + sb->data[sb->readcount-1]; } float MSG_ReadLittleFloat (sizebuf_t *sb) @@ -325,7 +317,7 @@ float MSG_ReadLittleFloat (sizebuf_t *sb) return -1; } sb->readcount += 4; - dat.l = sb->data[sb->readcount-4] | (sb->data[sb->readcount-3]<<8) | (sb->data[sb->readcount-2]<<16) | (sb->data[sb->readcount-1]<<24); + dat.l = sb->data[sb->readcount-4] | (sb->data[sb->readcount-3]<<8) | (sb->data[sb->readcount-2]<<16) | ((unsigned)sb->data[sb->readcount-1]<<24); return dat.f; } @@ -342,7 +334,7 @@ float MSG_ReadBigFloat (sizebuf_t *sb) return -1; } sb->readcount += 4; - dat.l = (sb->data[sb->readcount-4]<<24) | (sb->data[sb->readcount-3]<<16) | (sb->data[sb->readcount-2]<<8) | sb->data[sb->readcount-1]; + dat.l = ((unsigned)sb->data[sb->readcount-4]<<24) | (sb->data[sb->readcount-3]<<16) | (sb->data[sb->readcount-2]<<8) | sb->data[sb->readcount-1]; return dat.f; }