Skip to content

Commit 3ab068b

Browse files
authored
Fix memory overwriting by EnumToString & StringToEnum (#4089)
1 parent 725771e commit 3ab068b

File tree

6 files changed

+80
-94
lines changed

6 files changed

+80
-94
lines changed

Client/core/CConnectManager.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*****************************************************************************/
1111

1212
#include "StdInc.h"
13-
#include "net/packetenums.h"
13+
#include "net/Packets.h"
1414
using namespace std;
1515

1616
static CConnectManager* g_pConnectManager = NULL;

Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp

+19-19
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,16 @@
1414
//
1515

1616
IMPLEMENT_ENUM_BEGIN(eLuaType)
17-
ADD_ENUM(LUA_TNONE, "none")
18-
ADD_ENUM(LUA_TNIL, "nil")
19-
ADD_ENUM(LUA_TBOOLEAN, "boolean")
20-
ADD_ENUM(LUA_TLIGHTUSERDATA, "lightuserdata")
21-
ADD_ENUM(LUA_TNUMBER, "number")
22-
ADD_ENUM(LUA_TSTRING, "string")
23-
ADD_ENUM(LUA_TTABLE, "table")
24-
ADD_ENUM(LUA_TFUNCTION, "function")
25-
ADD_ENUM(LUA_TUSERDATA, "userdata")
26-
ADD_ENUM(LUA_TTHREAD, "thread")
17+
ADD_ENUM(static_cast<eLuaType>(LUA_TNONE), "none")
18+
ADD_ENUM(static_cast<eLuaType>(LUA_TNIL), "nil")
19+
ADD_ENUM(static_cast<eLuaType>(LUA_TBOOLEAN), "boolean")
20+
ADD_ENUM(static_cast<eLuaType>(LUA_TLIGHTUSERDATA), "lightuserdata")
21+
ADD_ENUM(static_cast<eLuaType>(LUA_TNUMBER), "number")
22+
ADD_ENUM(static_cast<eLuaType>(LUA_TSTRING), "string")
23+
ADD_ENUM(static_cast<eLuaType>(LUA_TTABLE), "table")
24+
ADD_ENUM(static_cast<eLuaType>(LUA_TFUNCTION), "function")
25+
ADD_ENUM(static_cast<eLuaType>(LUA_TUSERDATA), "userdata")
26+
ADD_ENUM(static_cast<eLuaType>(LUA_TTHREAD), "thread")
2727
IMPLEMENT_ENUM_END("lua-type")
2828

2929
IMPLEMENT_ENUM_BEGIN(CGUIVerticalAlign)
@@ -715,15 +715,15 @@ IMPLEMENT_ENUM_CLASS_END("client-model-type")
715715

716716
// Sound effects
717717
IMPLEMENT_ENUM_BEGIN(eSoundEffectType)
718-
ADD_ENUM(BASS_FX_DX8_CHORUS, "chorus")
719-
ADD_ENUM(BASS_FX_DX8_COMPRESSOR, "compressor")
720-
ADD_ENUM(BASS_FX_DX8_DISTORTION, "distortion")
721-
ADD_ENUM(BASS_FX_DX8_ECHO, "echo")
722-
ADD_ENUM(BASS_FX_DX8_FLANGER, "flanger")
723-
ADD_ENUM(BASS_FX_DX8_GARGLE, "gargle")
724-
ADD_ENUM(BASS_FX_DX8_I3DL2REVERB, "i3dl2reverb")
725-
ADD_ENUM(BASS_FX_DX8_PARAMEQ, "parameq")
726-
ADD_ENUM(BASS_FX_DX8_REVERB, "reverb")
718+
ADD_ENUM(static_cast<eSoundEffectType>(BASS_FX_DX8_CHORUS), "chorus")
719+
ADD_ENUM(static_cast<eSoundEffectType>(BASS_FX_DX8_COMPRESSOR), "compressor")
720+
ADD_ENUM(static_cast<eSoundEffectType>(BASS_FX_DX8_DISTORTION), "distortion")
721+
ADD_ENUM(static_cast<eSoundEffectType>(BASS_FX_DX8_ECHO), "echo")
722+
ADD_ENUM(static_cast<eSoundEffectType>(BASS_FX_DX8_FLANGER), "flanger")
723+
ADD_ENUM(static_cast<eSoundEffectType>(BASS_FX_DX8_GARGLE), "gargle")
724+
ADD_ENUM(static_cast<eSoundEffectType>(BASS_FX_DX8_I3DL2REVERB), "i3dl2reverb")
725+
ADD_ENUM(static_cast<eSoundEffectType>(BASS_FX_DX8_PARAMEQ), "parameq")
726+
ADD_ENUM(static_cast<eSoundEffectType>(BASS_FX_DX8_REVERB), "reverb")
727727
IMPLEMENT_ENUM_END("soundeffect-type")
728728

729729
IMPLEMENT_ENUM_CLASS_BEGIN(eSoundEffectParams::Chorus)

Server/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp

+10-10
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,16 @@
2323
//
2424

2525
IMPLEMENT_ENUM_BEGIN(eLuaType)
26-
ADD_ENUM(LUA_TNONE, "none")
27-
ADD_ENUM(LUA_TNIL, "nil")
28-
ADD_ENUM(LUA_TBOOLEAN, "boolean")
29-
ADD_ENUM(LUA_TLIGHTUSERDATA, "lightuserdata")
30-
ADD_ENUM(LUA_TNUMBER, "number")
31-
ADD_ENUM(LUA_TSTRING, "string")
32-
ADD_ENUM(LUA_TTABLE, "table")
33-
ADD_ENUM(LUA_TFUNCTION, "function")
34-
ADD_ENUM(LUA_TUSERDATA, "userdata")
35-
ADD_ENUM(LUA_TTHREAD, "thread")
26+
ADD_ENUM(static_cast<eLuaType>(LUA_TNONE), "none")
27+
ADD_ENUM(static_cast<eLuaType>(LUA_TNIL), "nil")
28+
ADD_ENUM(static_cast<eLuaType>(LUA_TBOOLEAN), "boolean")
29+
ADD_ENUM(static_cast<eLuaType>(LUA_TLIGHTUSERDATA), "lightuserdata")
30+
ADD_ENUM(static_cast<eLuaType>(LUA_TNUMBER), "number")
31+
ADD_ENUM(static_cast<eLuaType>(LUA_TSTRING), "string")
32+
ADD_ENUM(static_cast<eLuaType>(LUA_TTABLE), "table")
33+
ADD_ENUM(static_cast<eLuaType>(LUA_TFUNCTION), "function")
34+
ADD_ENUM(static_cast<eLuaType>(LUA_TUSERDATA), "userdata")
35+
ADD_ENUM(static_cast<eLuaType>(LUA_TTHREAD), "thread")
3636
IMPLEMENT_ENUM_END("lua-type")
3737

3838
IMPLEMENT_ENUM_BEGIN(TrafficLight::EColor)

Shared/sdk/SharedUtil.Misc.h

+22-31
Original file line numberDiff line numberDiff line change
@@ -1265,10 +1265,6 @@ namespace SharedUtil
12651265
//
12661266
// enum reflection shenanigans
12671267
//
1268-
enum eDummy
1269-
{
1270-
};
1271-
12721268
template <class T>
12731269
struct CEnumInfo
12741270
{
@@ -1278,31 +1274,31 @@ namespace SharedUtil
12781274
const char* szName;
12791275
};
12801276

1281-
CEnumInfo(const SString& strTypeName, const SEnumItem* pItemList, uint uiAmount, eDummy defaultValue, const SString& strDefaultName)
1277+
CEnumInfo(const SString& strTypeName, const SEnumItem* pItemList, uint uiAmount, T defaultValue, const SString& strDefaultName)
12821278
{
12831279
m_strTypeName = strTypeName;
12841280
m_strDefaultName = strDefaultName;
12851281
m_DefaultValue = defaultValue;
12861282
for (uint i = 0; i < uiAmount; i++)
12871283
{
12881284
const SEnumItem& item = pItemList[i];
1289-
m_ValueMap[item.szName] = (eDummy)item.iValue;
1290-
m_NameMap[(eDummy)item.iValue] = item.szName;
1285+
m_ValueMap[item.szName] = item.iValue;
1286+
m_NameMap[item.iValue] = item.szName;
12911287
}
12921288
}
12931289

1294-
bool ValueValid(eDummy value) const { return MapContains(m_NameMap, value); }
1290+
bool ValueValid(T value) const { return MapContains(m_NameMap, value); }
12951291

1296-
const SString& FindName(eDummy value) const
1292+
const SString& FindName(T value) const
12971293
{
12981294
if (const SString* pName = MapFind(m_NameMap, value))
12991295
return *pName;
13001296
return m_strDefaultName;
13011297
}
13021298

1303-
bool FindValue(const SString& strName, eDummy& outResult) const
1299+
bool FindValue(const SString& strName, T& outResult) const
13041300
{
1305-
const eDummy* pValue;
1301+
const T* pValue;
13061302
if ((pValue = MapFind(m_ValueMap, strName)) || (pValue = MapFind(m_ValueMap, strName.ToLower())))
13071303
{
13081304
outResult = *pValue;
@@ -1316,45 +1312,40 @@ namespace SharedUtil
13161312

13171313
SString m_strTypeName;
13181314
SString m_strDefaultName;
1319-
eDummy m_DefaultValue;
1320-
std::map<SString, eDummy> m_ValueMap;
1321-
std::map<eDummy, SString> m_NameMap;
1315+
T m_DefaultValue;
1316+
std::map<SString, T> m_ValueMap;
1317+
std::map<T, SString> m_NameMap;
13221318
};
13231319

1324-
#define DECLARE_ENUM2(T, U) \
1325-
CEnumInfo<U>* GetEnumInfo ( const T* ); \
1326-
inline const SString& EnumToString ( const T& value ) { return GetEnumInfo ( (T*)0 )->FindName ( (eDummy)value ); }\
1327-
inline bool StringToEnum ( const SString& strName, T& outResult ) { return GetEnumInfo ( (T*)0 )->FindValue ( strName, (eDummy&)outResult ); }\
1320+
#define DECLARE_ENUM(T) \
1321+
CEnumInfo<T>* GetEnumInfo ( const T* ); \
1322+
inline const SString& EnumToString ( const T& value ) { return GetEnumInfo ( (T*)0 )->FindName ( value ); }\
1323+
inline bool StringToEnum ( const SString& strName, T& outResult ) { return GetEnumInfo ( (T*)0 )->FindValue ( strName, outResult ); }\
13281324
inline const SString& GetEnumTypeName ( const T& ) { return GetEnumInfo ( (T*)0 )->GetTypeName (); }\
1329-
inline bool EnumValueValid ( const T& value ) { return GetEnumInfo ( (T*)0 )->ValueValid ( (eDummy)value ); }\
1325+
inline bool EnumValueValid ( const T& value ) { return GetEnumInfo ( (T*)0 )->ValueValid ( value ); }\
13301326

1331-
#define IMPLEMENT_ENUM_BEGIN2(T, U) \
1332-
CEnumInfo<U>* GetEnumInfo( const T* ) \
1327+
#define IMPLEMENT_ENUM_BEGIN(T) \
1328+
CEnumInfo<T>* GetEnumInfo( const T* ) \
13331329
{ \
1334-
using CEnumInfo = CEnumInfo<U>; \
1330+
using CEnumInfo = CEnumInfo<T>; \
13351331
static const CEnumInfo::SEnumItem items[] = {
13361332

13371333
#define IMPLEMENT_ENUM_END(name) \
1338-
IMPLEMENT_ENUM_END_DEFAULTS(name,0,"")
1334+
IMPLEMENT_ENUM_END_DEFAULTS(name, static_cast<std::remove_reference_t<decltype(std::declval<CEnumInfo::SEnumItem>().iValue)>>(0), "")
13391335

13401336
#define IMPLEMENT_ENUM_END_DEFAULTS(name,defvalue,defname) \
13411337
}; \
1342-
static CEnumInfo info( name, items, NUMELMS(items),(eDummy)(defvalue),defname ); \
1338+
static CEnumInfo info(name, items, NUMELMS(items), defvalue, defname); \
13431339
return &info; \
13441340
}
13451341

13461342
#define ADD_ENUM(value,name) {value, name},
13471343
#define ADD_ENUM1(value) {value, #value},
13481344

1349-
// enum
1350-
#define DECLARE_ENUM(T) DECLARE_ENUM2(T, int)
1351-
#define IMPLEMENT_ENUM_BEGIN(T) IMPLEMENT_ENUM_BEGIN2(T, int)
1352-
13531345
// enum class
1354-
#define DECLARE_ENUM_CLASS(T) DECLARE_ENUM2(T, T)
1355-
#define IMPLEMENT_ENUM_CLASS_BEGIN(T) IMPLEMENT_ENUM_BEGIN2(T, T)
1346+
#define DECLARE_ENUM_CLASS(T) DECLARE_ENUM(T)
1347+
#define IMPLEMENT_ENUM_CLASS_BEGIN(T) IMPLEMENT_ENUM_BEGIN(T)
13561348
#define IMPLEMENT_ENUM_CLASS_END(name) IMPLEMENT_ENUM_END(name)
1357-
#define IMPLEMENT_ENUM_CLASS_END_DEFAULTS(name,defvalue,defname) IMPLEMENT_ENUM_END_DEFAULTS(name,defvalue,defname)
13581349

13591350
//
13601351
// Fast wildcard matching

Shared/sdk/net/Packets.h

+27-1
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,34 @@
1515

1616
enum ePacketID
1717
{
18+
// Internal MTA packets
19+
PACKET_ID_SERVER_JOIN = 0,
20+
PACKET_ID_SERVER_JOIN_DATA,
21+
PACKET_ID_SERVER_JOIN_COMPLETE,
22+
23+
PACKET_ID_PLAYER_JOIN,
24+
PACKET_ID_PLAYER_JOINDATA,
25+
PACKET_ID_PLAYER_QUIT,
26+
PACKET_ID_PLAYER_TIMEOUT,
27+
28+
PACKET_ID_MOD_NAME,
29+
PACKET_ID_PACKET_PROGRESS,
30+
PACKET_ID_MTA_RESERVED_03,
31+
PACKET_ID_MTA_RESERVED_04,
32+
PACKET_ID_MTA_RESERVED_05,
33+
PACKET_ID_MTA_RESERVED_06,
34+
PACKET_ID_MTA_RESERVED_07,
35+
PACKET_ID_MTA_RESERVED_08,
36+
PACKET_ID_MTA_RESERVED_09,
37+
PACKET_ID_MTA_RESERVED_10,
38+
PACKET_ID_MTA_RESERVED_11,
39+
PACKET_ID_MTA_RESERVED_12,
40+
PACKET_ID_MTA_RESERVED_13,
41+
PACKET_ID_MTA_RESERVED_14,
42+
PACKET_ID_MTA_RESERVED_15,
43+
1844
// Connection packets
19-
PACKET_ID_SERVER_JOINEDGAME = PACKET_ID_END_OF_INTERNAL_PACKETS,
45+
PACKET_ID_SERVER_JOINEDGAME,
2046
PACKET_ID_SERVER_DISCONNECTED,
2147

2248
// All our outgoing only packets use this

Shared/sdk/net/packetenums.h

+1-32
Original file line numberDiff line numberDiff line change
@@ -10,37 +10,6 @@
1010
*****************************************************************************/
1111

1212
#pragma once
13-
14-
enum
15-
{
16-
PACKET_ID_SERVER_JOIN = 0,
17-
PACKET_ID_SERVER_JOIN_DATA,
18-
PACKET_ID_SERVER_JOIN_COMPLETE,
19-
20-
PACKET_ID_PLAYER_JOIN,
21-
PACKET_ID_PLAYER_JOINDATA,
22-
PACKET_ID_PLAYER_QUIT,
23-
PACKET_ID_PLAYER_TIMEOUT,
24-
25-
PACKET_ID_MOD_NAME,
26-
PACKET_ID_PACKET_PROGRESS,
27-
PACKET_ID_MTA_RESERVED_03,
28-
PACKET_ID_MTA_RESERVED_04,
29-
PACKET_ID_MTA_RESERVED_05,
30-
PACKET_ID_MTA_RESERVED_06,
31-
PACKET_ID_MTA_RESERVED_07,
32-
PACKET_ID_MTA_RESERVED_08,
33-
PACKET_ID_MTA_RESERVED_09,
34-
PACKET_ID_MTA_RESERVED_10,
35-
PACKET_ID_MTA_RESERVED_11,
36-
PACKET_ID_MTA_RESERVED_12,
37-
PACKET_ID_MTA_RESERVED_13,
38-
PACKET_ID_MTA_RESERVED_14,
39-
PACKET_ID_MTA_RESERVED_15,
40-
41-
PACKET_ID_END_OF_INTERNAL_PACKETS
42-
};
43-
4413
#define RAKNET_PACKET_COUNT RID_USER_PACKET_ENUM
4514

4615
/// You should not edit the file MessageIdentifiers.h as it is a part of RakNet static library
@@ -55,7 +24,7 @@ enum
5524
/// \endcode
5625
///
5726
/// \note All these enumerations should be casted to (unsigned char) before writing them to RakNet::BitStream
58-
enum
27+
enum eRakNetPackets
5928
{
6029
//
6130
// RESERVED TYPES - DO NOT CHANGE THESE

0 commit comments

Comments
 (0)