diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/common/CMakeLists.txt | 3 | ||||
-rw-r--r-- | src/server/game/Server/Packets/PacketUtilities.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Server/Packets/PacketUtilities.h | 52 | ||||
-rw-r--r-- | src/server/game/Server/Packets/TraitPacketsCommon.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Server/Packets/TraitPacketsCommon.h | 2 |
5 files changed, 48 insertions, 20 deletions
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 6b674e9dd24..66caf6c4e10 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -73,7 +73,8 @@ target_link_libraries(common valgrind threads jemalloc - openssl_ed25519) + openssl_ed25519 + short_alloc) add_dependencies(common revision_data.h) 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 <utf8.h> -#include <sstream> 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 <boost/container/static_vector.hpp> +#include <short_alloc/short_alloc.h> #include <string_view> #include <ctime> @@ -133,24 +133,49 @@ namespace WorldPackets /** * Utility class for automated prevention of loop counter spoofing in client packets */ - template<typename T, std::size_t N, typename Container = boost::container::static_vector<T, N>> + template<typename T, std::size_t N> class Array { public: - typedef Container storage_type; + using allocator_type = short_alloc::short_alloc<T, (N * sizeof(T) + (alignof(std::max_align_t) - 1)) & ~(alignof(std::max_align_t) - 1)>; + using arena_type = typename allocator_type::arena_type; - typedef std::integral_constant<std::size_t, N> max_capacity; + using storage_type = std::vector<T, allocator_type>; - 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<std::size_t, N>; - 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<TraitConfigType, int32>(); - traitConfig.Entries.resize(data.read<uint32>()); + uint32 entriesSize = data.read<uint32>(); + 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<TraitEntry, 100, std::vector<TraitEntry>> Entries; + std::vector<TraitEntry> Entries; String<259> Name; }; |