Merge pull request #123 from dreamstalker/_118

Fixed crash on bot disconnect
This commit is contained in:
theAsmodai 2016-01-10 17:19:56 +03:00
commit ac8345914e
7 changed files with 126 additions and 104 deletions

View File

@ -13,8 +13,8 @@
*
****/
#pragma once
#ifndef MATHLIB_H
#define MATHLIB_H
/* <42b7f> ../common/mathlib.h:3 */
typedef float vec_t;
@ -41,6 +41,50 @@ typedef union DLONG_u
#define M_PI 3.14159265358979323846
#ifdef __cplusplus
#ifdef min
#undef min
#endif
#ifdef max
#undef max
#endif
#ifdef clamp
#undef clamp
#endif
template <typename T>
inline T min(T a, T b) {
return (a < b) ? a : b;
}
template <typename T>
inline T max(T a, T b) {
return (a < b) ? b : a;
}
template <typename T>
inline T clamp(T a, T min, T max) {
return (a > max) ? max : (a < min) ? min : a;
}
template <typename T>
inline T bswap(T s) {
switch (sizeof(T)) {
#ifdef _WIN32
case 2: {auto res = _byteswap_ushort(*(uint16 *)&s); return *(T *)&res;}
case 4: {auto res = _byteswap_ulong(*(uint32 *)(&s)); return *(T *)&res;}
case 8: {auto res = _byteswap_uint64(*(uint64 *)&s); return *(T *)&res;}
#else
case 2: {auto res = _bswap16(*(uint16 *)&s); return *(T *)&res;}
case 4: {auto res = _bswap(*(uint32 *)&s); return *(T *)&res;}
case 8: {auto res = _bswap64(*(uint64 *)&s); return *(T *)&res;}
#endif
default: return s;
}
}
#else // __cplusplus
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
@ -50,3 +94,6 @@ typedef union DLONG_u
#endif
#define clamp(val, min, max) (((val) > (max)) ? (max) : (((val) < (min)) ? (min) : (val)))
#endif // __cplusplus
#endif // MATHLIB_H

View File

@ -265,15 +265,7 @@ float (*LittleFloat)(float l);
int LongSwap(int l)
{
/*byte b1, b2, b3, b4;
b1 = l & 0xFF;
b2 = (l >> 8) & 0xFF;
b3 = (l >> 16) & 0xFF;
b4 = (l >> 24) & 0xFF;
return ((int)b1 << 24) + ((int)b2 << 16) + ((int)b3 << 8) + b4;*/
return _byteswap_ulong(l);
return bswap(l);
}
int LongNoSwap(int l)
@ -283,16 +275,7 @@ int LongNoSwap(int l)
short ShortSwap(short l)
{
#ifdef _WIN32
return _byteswap_ushort(l); // xchg
#else
byte b1, b2;
b1 = l & 0xFF;
b2 = (l >> 8) & 0xFF;
return (b1 << 8) + b2;
#endif
return bswap(l);
}
short ShortNoSwap(short l)
@ -315,8 +298,9 @@ float FloatSwap(float f)
dat2.b[3] = dat1.b[0];
return dat2.f;*/
unsigned long u = _byteswap_ulong(*(unsigned long *)&f);
return *(float *)&u;
//unsigned long u = bswap(*(unsigned long *)&f);
//return *(float *)&u;
return bswap(f);
}
float FloatNoSwap(float f)
@ -2632,62 +2616,62 @@ void COM_Munge2(unsigned char *data, int len, int seq)
unsigned int *end;
unsigned int mSeq;
mSeq = _byteswap_ulong(~seq) ^ seq;
mSeq = bswap(~seq) ^ seq;
len /= 4;
end = (unsigned int *)data + (len & ~15);
for (pc = (unsigned int *)data; pc < end; pc += 16)
{
pc[0] = _byteswap_ulong(pc[0]) ^ mSeq ^ 0xFFFFE7A5;
pc[1] = _byteswap_ulong(pc[1]) ^ mSeq ^ 0xBFEFFFE5;
pc[2] = _byteswap_ulong(pc[2]) ^ mSeq ^ 0xFFBFEFFF;
pc[3] = _byteswap_ulong(pc[3]) ^ mSeq ^ 0xBFEFBFED;
pc[4] = _byteswap_ulong(pc[4]) ^ mSeq ^ 0xBFAFEFBF;
pc[5] = _byteswap_ulong(pc[5]) ^ mSeq ^ 0xFFBFAFEF;
pc[6] = _byteswap_ulong(pc[6]) ^ mSeq ^ 0xFFEFBFAD;
pc[7] = _byteswap_ulong(pc[7]) ^ mSeq ^ 0xFFFFEFBF;
pc[8] = _byteswap_ulong(pc[8]) ^ mSeq ^ 0xFFEFF7EF;
pc[9] = _byteswap_ulong(pc[9]) ^ mSeq ^ 0xBFEFE7F5;
pc[10] = _byteswap_ulong(pc[10]) ^ mSeq ^ 0xBFBFE7E5;
pc[11] = _byteswap_ulong(pc[11]) ^ mSeq ^ 0xFFAFB7E7;
pc[12] = _byteswap_ulong(pc[12]) ^ mSeq ^ 0xBFFFAFB5;
pc[13] = _byteswap_ulong(pc[13]) ^ mSeq ^ 0xBFAFFFAF;
pc[14] = _byteswap_ulong(pc[14]) ^ mSeq ^ 0xFFAFA7FF;
pc[15] = _byteswap_ulong(pc[15]) ^ mSeq ^ 0xFFEFA7A5;
pc[0] = bswap(pc[0]) ^ mSeq ^ 0xFFFFE7A5;
pc[1] = bswap(pc[1]) ^ mSeq ^ 0xBFEFFFE5;
pc[2] = bswap(pc[2]) ^ mSeq ^ 0xFFBFEFFF;
pc[3] = bswap(pc[3]) ^ mSeq ^ 0xBFEFBFED;
pc[4] = bswap(pc[4]) ^ mSeq ^ 0xBFAFEFBF;
pc[5] = bswap(pc[5]) ^ mSeq ^ 0xFFBFAFEF;
pc[6] = bswap(pc[6]) ^ mSeq ^ 0xFFEFBFAD;
pc[7] = bswap(pc[7]) ^ mSeq ^ 0xFFFFEFBF;
pc[8] = bswap(pc[8]) ^ mSeq ^ 0xFFEFF7EF;
pc[9] = bswap(pc[9]) ^ mSeq ^ 0xBFEFE7F5;
pc[10] = bswap(pc[10]) ^ mSeq ^ 0xBFBFE7E5;
pc[11] = bswap(pc[11]) ^ mSeq ^ 0xFFAFB7E7;
pc[12] = bswap(pc[12]) ^ mSeq ^ 0xBFFFAFB5;
pc[13] = bswap(pc[13]) ^ mSeq ^ 0xBFAFFFAF;
pc[14] = bswap(pc[14]) ^ mSeq ^ 0xFFAFA7FF;
pc[15] = bswap(pc[15]) ^ mSeq ^ 0xFFEFA7A5;
}
switch(len & 15)
{
case 15:
pc[14] = _byteswap_ulong(pc[14]) ^ mSeq ^ 0xFFAFA7FF;
pc[14] = bswap(pc[14]) ^ mSeq ^ 0xFFAFA7FF;
case 14:
pc[13] = _byteswap_ulong(pc[13]) ^ mSeq ^ 0xBFAFFFAF;
pc[13] = bswap(pc[13]) ^ mSeq ^ 0xBFAFFFAF;
case 13:
pc[12] = _byteswap_ulong(pc[12]) ^ mSeq ^ 0xBFFFAFB5;
pc[12] = bswap(pc[12]) ^ mSeq ^ 0xBFFFAFB5;
case 12:
pc[11] = _byteswap_ulong(pc[11]) ^ mSeq ^ 0xFFAFB7E7;
pc[11] = bswap(pc[11]) ^ mSeq ^ 0xFFAFB7E7;
case 11:
pc[10] = _byteswap_ulong(pc[10]) ^ mSeq ^ 0xBFBFE7E5;
pc[10] = bswap(pc[10]) ^ mSeq ^ 0xBFBFE7E5;
case 10:
pc[9] = _byteswap_ulong(pc[9]) ^ mSeq ^ 0xBFEFE7F5;
pc[9] = bswap(pc[9]) ^ mSeq ^ 0xBFEFE7F5;
case 9:
pc[8] = _byteswap_ulong(pc[8]) ^ mSeq ^ 0xFFEFF7EF;
pc[8] = bswap(pc[8]) ^ mSeq ^ 0xFFEFF7EF;
case 8:
pc[7] = _byteswap_ulong(pc[7]) ^ mSeq ^ 0xFFFFEFBF;
pc[7] = bswap(pc[7]) ^ mSeq ^ 0xFFFFEFBF;
case 7:
pc[6] = _byteswap_ulong(pc[6]) ^ mSeq ^ 0xFFEFBFAD;
pc[6] = bswap(pc[6]) ^ mSeq ^ 0xFFEFBFAD;
case 6:
pc[5] = _byteswap_ulong(pc[5]) ^ mSeq ^ 0xFFBFAFEF;
pc[5] = bswap(pc[5]) ^ mSeq ^ 0xFFBFAFEF;
case 5:
pc[4] = _byteswap_ulong(pc[4]) ^ mSeq ^ 0xBFAFEFBF;
pc[4] = bswap(pc[4]) ^ mSeq ^ 0xBFAFEFBF;
case 4:
pc[3] = _byteswap_ulong(pc[3]) ^ mSeq ^ 0xBFEFBFED;
pc[3] = bswap(pc[3]) ^ mSeq ^ 0xBFEFBFED;
case 3:
pc[2] = _byteswap_ulong(pc[2]) ^ mSeq ^ 0xFFBFEFFF;
pc[2] = bswap(pc[2]) ^ mSeq ^ 0xFFBFEFFF;
case 2:
pc[1] = _byteswap_ulong(pc[1]) ^ mSeq ^ 0xBFEFFFE5;
pc[1] = bswap(pc[1]) ^ mSeq ^ 0xBFEFFFE5;
case 1:
pc[0] = _byteswap_ulong(pc[0]) ^ mSeq ^ 0xFFFFE7A5;
pc[0] = bswap(pc[0]) ^ mSeq ^ 0xFFFFE7A5;
}
}
#else // REHLDS_FIXES
@ -2731,62 +2715,62 @@ void COM_UnMunge2(unsigned char *data, int len, int seq)
unsigned int *end;
unsigned int mSeq;
mSeq = _byteswap_ulong(~seq) ^ seq;
mSeq = bswap(~seq) ^ seq;
len /= 4;
end = (unsigned int *)data + (len & ~15);
for (pc = (unsigned int *)data; pc < end; pc += 16)
{
pc[0] = _byteswap_ulong(pc[0] ^ mSeq ^ 0xFFFFE7A5);
pc[1] = _byteswap_ulong(pc[1] ^ mSeq ^ 0xBFEFFFE5);
pc[2] = _byteswap_ulong(pc[2] ^ mSeq ^ 0xFFBFEFFF);
pc[3] = _byteswap_ulong(pc[3] ^ mSeq ^ 0xBFEFBFED);
pc[4] = _byteswap_ulong(pc[4] ^ mSeq ^ 0xBFAFEFBF);
pc[5] = _byteswap_ulong(pc[5] ^ mSeq ^ 0xFFBFAFEF);
pc[6] = _byteswap_ulong(pc[6] ^ mSeq ^ 0xFFEFBFAD);
pc[7] = _byteswap_ulong(pc[7] ^ mSeq ^ 0xFFFFEFBF);
pc[8] = _byteswap_ulong(pc[8] ^ mSeq ^ 0xFFEFF7EF);
pc[9] = _byteswap_ulong(pc[9] ^ mSeq ^ 0xBFEFE7F5);
pc[10] = _byteswap_ulong(pc[10] ^ mSeq ^ 0xBFBFE7E5);
pc[11] = _byteswap_ulong(pc[11] ^ mSeq ^ 0xFFAFB7E7);
pc[12] = _byteswap_ulong(pc[12] ^ mSeq ^ 0xBFFFAFB5);
pc[13] = _byteswap_ulong(pc[13] ^ mSeq ^ 0xBFAFFFAF);
pc[14] = _byteswap_ulong(pc[14] ^ mSeq ^ 0xFFAFA7FF);
pc[15] = _byteswap_ulong(pc[15] ^ mSeq ^ 0xFFEFA7A5);
pc[0] = bswap(pc[0] ^ mSeq ^ 0xFFFFE7A5);
pc[1] = bswap(pc[1] ^ mSeq ^ 0xBFEFFFE5);
pc[2] = bswap(pc[2] ^ mSeq ^ 0xFFBFEFFF);
pc[3] = bswap(pc[3] ^ mSeq ^ 0xBFEFBFED);
pc[4] = bswap(pc[4] ^ mSeq ^ 0xBFAFEFBF);
pc[5] = bswap(pc[5] ^ mSeq ^ 0xFFBFAFEF);
pc[6] = bswap(pc[6] ^ mSeq ^ 0xFFEFBFAD);
pc[7] = bswap(pc[7] ^ mSeq ^ 0xFFFFEFBF);
pc[8] = bswap(pc[8] ^ mSeq ^ 0xFFEFF7EF);
pc[9] = bswap(pc[9] ^ mSeq ^ 0xBFEFE7F5);
pc[10] = bswap(pc[10] ^ mSeq ^ 0xBFBFE7E5);
pc[11] = bswap(pc[11] ^ mSeq ^ 0xFFAFB7E7);
pc[12] = bswap(pc[12] ^ mSeq ^ 0xBFFFAFB5);
pc[13] = bswap(pc[13] ^ mSeq ^ 0xBFAFFFAF);
pc[14] = bswap(pc[14] ^ mSeq ^ 0xFFAFA7FF);
pc[15] = bswap(pc[15] ^ mSeq ^ 0xFFEFA7A5);
}
switch(len & 15)
{
case 15:
pc[14] = _byteswap_ulong(pc[14] ^ mSeq ^ 0xFFAFA7FF);
pc[14] = bswap(pc[14] ^ mSeq ^ 0xFFAFA7FF);
case 14:
pc[13] = _byteswap_ulong(pc[13] ^ mSeq ^ 0xBFAFFFAF);
pc[13] = bswap(pc[13] ^ mSeq ^ 0xBFAFFFAF);
case 13:
pc[12] = _byteswap_ulong(pc[12] ^ mSeq ^ 0xBFFFAFB5);
pc[12] = bswap(pc[12] ^ mSeq ^ 0xBFFFAFB5);
case 12:
pc[11] = _byteswap_ulong(pc[11] ^ mSeq ^ 0xFFAFB7E7);
pc[11] = bswap(pc[11] ^ mSeq ^ 0xFFAFB7E7);
case 11:
pc[10] = _byteswap_ulong(pc[10] ^ mSeq ^ 0xBFBFE7E5);
pc[10] = bswap(pc[10] ^ mSeq ^ 0xBFBFE7E5);
case 10:
pc[9] = _byteswap_ulong(pc[9] ^ mSeq ^ 0xBFEFE7F5);
pc[9] = bswap(pc[9] ^ mSeq ^ 0xBFEFE7F5);
case 9:
pc[8] = _byteswap_ulong(pc[8] ^ mSeq ^ 0xFFEFF7EF);
pc[8] = bswap(pc[8] ^ mSeq ^ 0xFFEFF7EF);
case 8:
pc[7] = _byteswap_ulong(pc[7] ^ mSeq ^ 0xFFFFEFBF);
pc[7] = bswap(pc[7] ^ mSeq ^ 0xFFFFEFBF);
case 7:
pc[6] = _byteswap_ulong(pc[6] ^ mSeq ^ 0xFFEFBFAD);
pc[6] = bswap(pc[6] ^ mSeq ^ 0xFFEFBFAD);
case 6:
pc[5] = _byteswap_ulong(pc[5] ^ mSeq ^ 0xFFBFAFEF);
pc[5] = bswap(pc[5] ^ mSeq ^ 0xFFBFAFEF);
case 5:
pc[4] = _byteswap_ulong(pc[4] ^ mSeq ^ 0xBFAFEFBF);
pc[4] = bswap(pc[4] ^ mSeq ^ 0xBFAFEFBF);
case 4:
pc[3] = _byteswap_ulong(pc[3] ^ mSeq ^ 0xBFEFBFED);
pc[3] = bswap(pc[3] ^ mSeq ^ 0xBFEFBFED);
case 3:
pc[2] = _byteswap_ulong(pc[2] ^ mSeq ^ 0xFFBFEFFF);
pc[2] = bswap(pc[2] ^ mSeq ^ 0xFFBFEFFF);
case 2:
pc[1] = _byteswap_ulong(pc[1] ^ mSeq ^ 0xBFEFFFE5);
pc[1] = bswap(pc[1] ^ mSeq ^ 0xBFEFFFE5);
case 1:
pc[0] = _byteswap_ulong(pc[0] ^ mSeq ^ 0xFFFFE7A5);
pc[0] = bswap(pc[0] ^ mSeq ^ 0xFFFFE7A5);
}
}
#else // REHLDS_FIXES

View File

@ -531,6 +531,10 @@ void SV_DropClient_internal(client_t *cl, qboolean crash, const char *string)
Q_memset(cl->userinfo, 0, sizeof(cl->userinfo));
Q_memset(cl->physinfo, 0, sizeof(cl->physinfo));
#ifdef REHLDS_FIXES
g_GameClients[host_client - g_psvs.clients]->SetSpawnedOnce(false);
#endif // REHLDS_FIXES
SV_FullClientUpdate(cl, &g_psv.reliable_datagram);
NotifyDedicatedServerUI("UpdatePlayers");

View File

@ -1370,7 +1370,7 @@ int NET_SendLong(netsrc_t sock, int s, const char *buf, int len, int flags, cons
while (len > 0)
{
size = min(SPLIT_SIZE, len);
size = min(int(SPLIT_SIZE), len);
pPacket->packetID = (packetNumber << 4) + packetCount;

View File

@ -4862,7 +4862,7 @@ void SV_ExtractFromUserinfo(client_t *cl)
if (val[0] != 0)
{
i = Q_atoi(val);
cl->netchan.rate = clamp(i, MIN_RATE, MAX_RATE);
cl->netchan.rate = clamp(float(i), MIN_RATE, MAX_RATE);
}
val = Info_ValueForKey(userinfo, "topcolor");

View File

@ -44,6 +44,7 @@
#define PAD_NUMBER(number, boundary) \
( ((number) + ((boundary)-1)) / (boundary) ) * (boundary)
#ifndef MATHLIB_H
// In case this ever changes
#define M_PI 3.14159265358979323846
@ -54,19 +55,7 @@
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
#ifdef __cplusplus
template<typename T>
inline T clamp2(T const &val, T const &minVal, T const &maxVal) //renamed to clamp2 to avoid conflicts with clamp defined in mathlib
{
if (val < minVal)
return minVal;
else if (val > maxVal)
return maxVal;
else
return val;
}
#endif
#endif // MATHLIB_H
#ifndef FALSE
#define FALSE 0

View File

@ -166,8 +166,6 @@
#define WSAENOPROTOOPT ENOPROTOOPT
inline unsigned long _byteswap_ulong(unsigned long val) { return _bswap(val); }
#ifndef FALSE
#define FALSE 0
#endif