mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-11-14 07:47:13 +00:00
The AMF3 reader read an array inside an array to any depth and kept reading values after the data had ended. It now refuses arrays nested more than 64 deep and throws when the data ends before a value does. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
90 lines
2.4 KiB
C++
90 lines
2.4 KiB
C++
#pragma once
|
|
|
|
#include "Amf3.h"
|
|
#include "BitStream.h"
|
|
|
|
#include <memory>
|
|
#include <vector>
|
|
#include <string>
|
|
|
|
class AMFDeserialize {
|
|
public:
|
|
// Most entries one array may hold, in each of its dense and associative parts.
|
|
static constexpr uint32_t MaxArraySize = 10'000;
|
|
|
|
// Deepest nesting of arrays allowed. Client UI messages nest a handful of levels.
|
|
static constexpr uint32_t MaxDepth = 32;
|
|
|
|
// Most values one deserializer will read over its lifetime.
|
|
static constexpr uint32_t MaxValues = 100'000;
|
|
|
|
/**
|
|
* Read an AMF3 value from a bitstream.
|
|
*
|
|
* @param inStream inStream to read value from.
|
|
* @return Returns an AMFValue with all the information from the bitStream in it.
|
|
*/
|
|
std::unique_ptr<AMFBaseValue> Read(RakNet::BitStream& inStream);
|
|
private:
|
|
/**
|
|
* @brief Private method to read a U29 integer from a bitstream
|
|
*
|
|
* @param inStream bitstream to read data from
|
|
* @return The number as an unsigned 29 bit integer
|
|
*/
|
|
static uint32_t ReadU29(RakNet::BitStream& inStream);
|
|
|
|
/**
|
|
* @brief Reads a string from a bitstream
|
|
*
|
|
* @param inStream bitStream to read data from
|
|
* @return The read string
|
|
*/
|
|
const std::string ReadString(RakNet::BitStream& inStream);
|
|
|
|
/**
|
|
* @brief Read an AMFDouble value from a bitStream
|
|
*
|
|
* @param inStream bitStream to read data from
|
|
* @return Double value represented as an AMFValue
|
|
*/
|
|
static std::unique_ptr<AMFDoubleValue> ReadAmfDouble(RakNet::BitStream& inStream);
|
|
|
|
/**
|
|
* @brief Read an AMFArray from a bitStream
|
|
*
|
|
* @param inStream bitStream to read data from
|
|
* @return Array value represented as an AMFValue
|
|
*/
|
|
std::unique_ptr<AMFArrayValue> ReadAmfArray(RakNet::BitStream& inStream);
|
|
|
|
/**
|
|
* @brief Read an AMFString from a bitStream
|
|
*
|
|
* @param inStream bitStream to read data from
|
|
* @return String value represented as an AMFValue
|
|
*/
|
|
std::unique_ptr<AMFStringValue> ReadAmfString(RakNet::BitStream& inStream);
|
|
|
|
/**
|
|
* @brief Read an AMFInteger from a bitStream
|
|
*
|
|
* @param inStream bitStream to read data from
|
|
* @return Integer value represented as an AMFValue
|
|
*/
|
|
static std::unique_ptr<AMFIntValue> ReadAmfInteger(RakNet::BitStream& inStream);
|
|
|
|
/**
|
|
* List of strings read so far saved to be read by reference.
|
|
*/
|
|
std::vector<std::string> accessedElements;
|
|
|
|
/**
|
|
* How many arrays are being read at the moment, each one inside the one before it.
|
|
*/
|
|
uint32_t m_Depth = 0;
|
|
|
|
// How many values have been read so far.
|
|
uint32_t m_ValuesRead = 0;
|
|
};
|