From b65c3f5f4a4edbc953c405bfacd33f186f3a1931 Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 6 Jan 2023 16:52:44 +0100 Subject: Core/Misc: Replaced boost::container::static_vector in packet classes with plain vector with custom static storage allocatlr --- src/server/game/Server/Packets/PacketUtilities.cpp | 5 +-- src/server/game/Server/Packets/PacketUtilities.h | 52 ++++++++++++++++------ .../game/Server/Packets/TraitPacketsCommon.cpp | 6 ++- .../game/Server/Packets/TraitPacketsCommon.h | 2 +- 4 files changed, 46 insertions(+), 19 deletions(-) (limited to 'src/server') diff --git a/src/server/game/Server/Packets/PacketUtilities.cpp b/src/server/game/Server/Packets/PacketUtilities.cpp index 699e63814ac..fe7487daaee 100644 --- a/src/server/game/Server/Packets/PacketUtilities.cpp +++ b/src/server/game/Server/Packets/PacketUtilities.cpp @@ -18,7 +18,6 @@ #include "PacketUtilities.h" #include "Hyperlinks.h" #include -#include WorldPackets::InvalidStringValueException::InvalidStringValueException(std::string const& value) : ByteBufferInvalidValueException("string", value.c_str()) { @@ -59,7 +58,5 @@ bool WorldPackets::Strings::NoHyperlinks::Validate(std::string const& value) WorldPackets::PacketArrayMaxCapacityException::PacketArrayMaxCapacityException(std::size_t requestedSize, std::size_t sizeLimit) { - std::ostringstream builder; - builder << "Attempted to read more array elements from packet " << requestedSize << " than allowed " << sizeLimit; - message().assign(builder.str()); + message().assign("Attempted to read more array elements from packet " + Trinity::ToString(requestedSize) + " than allowed " + Trinity::ToString(sizeLimit)); } diff --git a/src/server/game/Server/Packets/PacketUtilities.h b/src/server/game/Server/Packets/PacketUtilities.h index 4af2d2c4b17..9810ae932f4 100644 --- a/src/server/game/Server/Packets/PacketUtilities.h +++ b/src/server/game/Server/Packets/PacketUtilities.h @@ -21,7 +21,7 @@ #include "ByteBuffer.h" #include "Duration.h" #include "Tuples.h" -#include +#include #include #include @@ -133,24 +133,49 @@ namespace WorldPackets /** * Utility class for automated prevention of loop counter spoofing in client packets */ - template> + template class Array { public: - typedef Container storage_type; + using allocator_type = short_alloc::short_alloc; + using arena_type = typename allocator_type::arena_type; - typedef std::integral_constant max_capacity; + using storage_type = std::vector; - typedef typename storage_type::value_type value_type; - typedef typename storage_type::size_type size_type; - typedef typename storage_type::pointer pointer; - typedef typename storage_type::const_pointer const_pointer; - typedef typename storage_type::reference reference; - typedef typename storage_type::const_reference const_reference; - typedef typename storage_type::iterator iterator; - typedef typename storage_type::const_iterator const_iterator; + using max_capacity = std::integral_constant; - Array() { } + using value_type = typename storage_type::value_type; + using size_type = typename storage_type::size_type; + using pointer = typename storage_type::pointer; + using const_pointer = typename storage_type::const_pointer; + using reference = typename storage_type::reference; + using const_reference = typename storage_type::const_reference; + using iterator = typename storage_type::iterator; + using const_iterator = typename storage_type::const_iterator; + + Array() : _storage(_data) { } + + Array(Array const& other) : Array() + { + for (T const& element : other) + _storage.push_back(element); + } + + Array(Array&& other) noexcept = delete; + + Array& operator=(Array const& other) + { + if (this == &other) + return *this; + + _storage.clear(); + for (T const& element : other) + _storage.push_back(element); + + return *this; + } + + Array& operator=(Array&& other) noexcept = delete; iterator begin() { return _storage.begin(); } const_iterator begin() const { return _storage.begin(); } @@ -209,6 +234,7 @@ namespace WorldPackets } private: + arena_type _data; storage_type _storage; }; diff --git a/src/server/game/Server/Packets/TraitPacketsCommon.cpp b/src/server/game/Server/Packets/TraitPacketsCommon.cpp index d6bfe6667cf..aa8d6ca5e6f 100644 --- a/src/server/game/Server/Packets/TraitPacketsCommon.cpp +++ b/src/server/game/Server/Packets/TraitPacketsCommon.cpp @@ -71,7 +71,11 @@ ByteBuffer& operator>>(ByteBuffer& data, TraitConfig& traitConfig) { data >> traitConfig.ID; traitConfig.Type = data.read(); - traitConfig.Entries.resize(data.read()); + uint32 entriesSize = data.read(); + if (entriesSize > 100) + throw PacketArrayMaxCapacityException(entriesSize, 100); + + traitConfig.Entries.resize(entriesSize); switch (traitConfig.Type) { case TraitConfigType::Combat: diff --git a/src/server/game/Server/Packets/TraitPacketsCommon.h b/src/server/game/Server/Packets/TraitPacketsCommon.h index 96186412362..b6d143e7baf 100644 --- a/src/server/game/Server/Packets/TraitPacketsCommon.h +++ b/src/server/game/Server/Packets/TraitPacketsCommon.h @@ -54,7 +54,7 @@ struct TraitConfig int32 LocalIdentifier = 0; // Local to specialization int32 SkillLineID = 0; int32 TraitSystemID = 0; - Array> Entries; + std::vector Entries; String<259> Name; }; -- cgit v1.2.3