aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/CMakeLists.txt3
-rw-r--r--src/server/game/Server/Packets/PacketUtilities.cpp5
-rw-r--r--src/server/game/Server/Packets/PacketUtilities.h52
-rw-r--r--src/server/game/Server/Packets/TraitPacketsCommon.cpp6
-rw-r--r--src/server/game/Server/Packets/TraitPacketsCommon.h2
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;
};