#include <memory>
#include <tuple>
+#include <dpl/exception.h>
+
namespace SecurityManager {
+
+class SerializationException {
+public:
+ DECLARE_EXCEPTION_TYPE(SecurityManager::Exception, Base)
+ DECLARE_EXCEPTION_TYPE(Base, InvalidStreamData)
+};
+
// Abstract data stream buffer
class IStream
{
{
int length;
stream.Read(sizeof(length), &length);
+ if (length < 0)
+ ThrowMsg(SerializationException::InvalidStreamData, "Invalid length of std::string (less than 0)");
char * buf = new char[length + 1];
std::unique_ptr<char[]> ptr(buf);
stream.Read(length, buf);
{
int length;
stream.Read(sizeof(length), &length);
+ if (length < 0)
+ ThrowMsg(SerializationException::InvalidStreamData, "Invalid length of std::string (less than 0)");
char * buf = new char[length + 1];
std::unique_ptr<char[]> ptr(buf);
stream.Read(length, buf);
{
int length;
stream.Read(sizeof(length), &length);
+ if (length < 0)
+ ThrowMsg(SerializationException::InvalidStreamData, "Invalid length of std::list (less than 0)");
for (int i = 0; i < length; ++i) {
T obj;
Deserialize(stream, obj);
{
int length;
stream.Read(sizeof(length), &length);
+ if (length < 0)
+ ThrowMsg(SerializationException::InvalidStreamData, "Invalid length of std::vector (less than 0)");
for (int i = 0; i < length; ++i) {
T obj;
Deserialize(stream, obj);
{
int length;
stream.Read(sizeof(length), &length);
+ if (length < 0)
+ ThrowMsg(SerializationException::InvalidStreamData, "Invalid size of std::map (less than 0)");
for (int i = 0; i < length; ++i) {
K key;
T obj;