Add protection against leaking memory during deserialization 07/181507/2
authorTomasz Swierczek <t.swierczek@samsung.com>
Thu, 14 Jun 2018 08:41:26 +0000 (10:41 +0200)
committerTomasz Swierczek <t.swierczek@samsung.com>
Wed, 20 Jun 2018 08:32:45 +0000 (10:32 +0200)
Change-Id: Ie4e2b4fed97e73368554d779f3cb83c2678dcdfc

src/dpl/core/include/dpl/serialization.h

index 240327e..7226c64 100644 (file)
@@ -266,7 +266,9 @@ struct Deserialization {
     static void Deserialize(IStream& stream, char*& value)
     {
         value = new char;
+        std::unique_ptr<char> ptr(value);
         stream.Read(sizeof(*value), value);
+        ptr.release();
     }
 
     // unsigned char
@@ -277,7 +279,9 @@ struct Deserialization {
     static void Deserialize(IStream& stream, unsigned char*& value)
     {
         value = new unsigned char;
+        std::unique_ptr<unsigned char> ptr(value);
         stream.Read(sizeof(*value), value);
+        ptr.release();
     }
 
     // unsigned int
@@ -288,7 +292,9 @@ struct Deserialization {
     static void Deserialize(IStream& stream, unsigned*& value)
     {
         value = new unsigned;
+        std::unique_ptr<unsigned> ptr(value);
         stream.Read(sizeof(*value), value);
+        ptr.release();
     }
 
     // int
@@ -299,7 +305,9 @@ struct Deserialization {
     static void Deserialize(IStream& stream, int*& value)
     {
         value = new int;
+        std::unique_ptr<int> ptr(value);
         stream.Read(sizeof(*value), value);
+        ptr.release();
     }
 
     // bool
@@ -310,7 +318,9 @@ struct Deserialization {
     static void Deserialize(IStream& stream, bool*& value)
     {
         value = new bool;
+        std::unique_ptr<bool> ptr(value);
         stream.Read(sizeof(*value), value);
+        ptr.release();
     }
 
     // time_t
@@ -321,7 +331,9 @@ struct Deserialization {
     static void Deserialize(IStream& stream, time_t*& value)
     {
         value = new time_t;
+        std::unique_ptr<time_t> ptr(value);
         stream.Read(sizeof(*value), value);
+        ptr.release();
     }
 
     // std::string
@@ -330,20 +342,20 @@ struct Deserialization {
         int length;
         stream.Read(sizeof(length), &length);
         char * buf = new char[length + 1];
+        std::unique_ptr<char[]> ptr(buf);
         stream.Read(length, buf);
         buf[length] = 0;
         str = std::string(buf);
-        delete[] buf;
     }
     static void Deserialize(IStream& stream, std::string*& str)
     {
         int length;
         stream.Read(sizeof(length), &length);
         char * buf = new char[length + 1];
+        std::unique_ptr<char[]> ptr(buf);
         stream.Read(length, buf);
         buf[length] = 0;
         str = new std::string(buf);
-        delete[] buf;
     }
 
     // STL templates
@@ -364,7 +376,9 @@ struct Deserialization {
     static void Deserialize(IStream& stream, std::list<T>*& list)
     {
         list = new std::list<T>;
+        std::unique_ptr<std::list<T>> ptr(list);
         Deserialize(stream, *list);
+        ptr.release();
     }
 
     // std::vector
@@ -383,7 +397,9 @@ struct Deserialization {
     static void Deserialize(IStream& stream, std::vector<T>*& vec)
     {
         vec = new std::vector<T>;
+        std::unique_ptr<std::vector<T>> ptr(vec);
         Deserialize(stream, *vec);
+        ptr.release();
     }
 
     // std::pair
@@ -397,7 +413,9 @@ struct Deserialization {
     static void Deserialize(IStream& stream, std::pair<A, B>*& p)
     {
         p = new std::pair<A, B>;
+        std::unique_ptr<std::pair<A, B>> ptr(p);
         Deserialize(stream, *p);
+        ptr.release();
     }
 
     // std::tuple
@@ -418,7 +436,9 @@ struct Deserialization {
     static void Deserialize(IStream& stream, std::tuple<Tp...>*& t)
     {
         t = new std::tuple<Tp...>;
+        std::unique_ptr<std::tuple<Tp...>> ptr(t);
         Deserialize(stream, *t);
+        ptr.release();
     }
 
     // std::map
@@ -439,7 +459,9 @@ struct Deserialization {
     static void Deserialize(IStream& stream, std::map<K, T>*& map)
     {
         map = new std::map<K, T>;
+        std::unique_ptr<std::map<K, T>> ptr(map);
         Deserialize(stream, *map);
+        ptr.release();
     }
 
     template<typename T1, typename T2, typename... Tail>