diff --git a/libs/main/serialization/pibinarystream.h b/libs/main/serialization/pibinarystream.h index 80dcbe25..0d4d1ab9 100644 --- a/libs/main/serialization/pibinarystream.h +++ b/libs/main/serialization/pibinarystream.h @@ -56,17 +56,17 @@ #else -# define BINARY_STREAM_FRIEND(T) \ - template \ - friend PIBinaryStream

& operator<<(PIBinaryStream

& s, const T & v); \ - template \ - friend PIBinaryStream

& operator>>(PIBinaryStream

& s, T & v); +# define BINARY_STREAM_FRIEND(T) \ + template \ + friend PIBinaryStream

& operator<<(PIBinaryStream

& s, const T & v); \ + template \ + friend PIBinaryStream

& operator>>(PIBinaryStream

& s, T & v); # define BINARY_STREAM_WRITE(T) \ - template \ - inline PIBinaryStream

& operator<<(PIBinaryStream

& s, const T & v) + template \ + inline PIBinaryStream

& operator<<(PIBinaryStream

& s, const T & v) # define BINARY_STREAM_READ(T) \ - template \ - inline PIBinaryStream

& operator>>(PIBinaryStream

& s, T & v) + template \ + inline PIBinaryStream

& operator>>(PIBinaryStream

& s, T & v) #endif @@ -410,7 +410,7 @@ template & operator>>(PIBinaryStream

& s, PIVector & v) { // piCout << ">> vector trivial default"; int sz = s.binaryStreamTakeInt(); - if (s.wasReadError()) { + if (s.wasReadError() || sz < 0) { fprintf(stderr, "error with PIVector<%s>\n", __PIP_TYPENAME__(T)); v.clear(); return s; @@ -433,7 +433,7 @@ template & operator>>(PIBinaryStream

& s, PIVector & v) { // piCout << ">> vector trivial custom"; int sz = s.binaryStreamTakeInt(); - if (s.wasReadError()) { + if (s.wasReadError() || sz < 0) { fprintf(stderr, "error with PIVector<%s>\n", __PIP_TYPENAME__(T)); v.clear(); return s; @@ -462,7 +462,7 @@ template & operator>>(PIBinaryStream

& s, PIDeque & v) { // piCout << ">> deque trivial default"; int sz = s.binaryStreamTakeInt(); - if (s.wasReadError()) { + if (s.wasReadError() || sz < 0) { fprintf(stderr, "error with PIDeque<%s>\n", __PIP_TYPENAME__(T)); v.clear(); return s; @@ -485,7 +485,7 @@ template & operator>>(PIBinaryStream

& s, PIDeque & v) { // piCout << ">> deque trivial custom"; int sz = s.binaryStreamTakeInt(); - if (s.wasReadError()) { + if (s.wasReadError() || sz < 0) { fprintf(stderr, "error with PIDeque<%s>\n", __PIP_TYPENAME__(T)); v.clear(); return s; @@ -516,7 +516,7 @@ inline PIBinaryStream

& operator>>(PIBinaryStream

& s, PIVector2D & v) int r, c; r = s.binaryStreamTakeInt(); c = s.binaryStreamTakeInt(); - if (s.wasReadError()) { + if (s.wasReadError() || r < 0 || c < 0) { fprintf(stderr, "error with PIVector2D<%s>\n", __PIP_TYPENAME__(T)); v.clear(); return s; @@ -542,6 +542,11 @@ inline PIBinaryStream

& operator>>(PIBinaryStream

& s, PIVector2D & v) PIVector tmp; r = s.binaryStreamTakeInt(); c = s.binaryStreamTakeInt(); + if (s.wasReadError() || r < 0 || c < 0) { + fprintf(stderr, "error with PIVector2D<%s>\n", __PIP_TYPENAME__(T)); + v.clear(); + return s; + } s >> tmp; if (s.wasReadError()) { fprintf(stderr, "error with PIVector2D<%s>\n", __PIP_TYPENAME__(T)); @@ -618,7 +623,7 @@ template & operator>>(PIBinaryStream

& s, PIVector & v) { int sz = s.binaryStreamTakeInt(); - if (s.wasReadError()) { + if (s.wasReadError() || sz < 0) { fprintf(stderr, "error with PIVector<%s>\n", __PIP_TYPENAME__(T)); v.clear(); return s; @@ -641,7 +646,7 @@ template & operator>>(PIBinaryStream

& s, PIDeque & v) { int sz = s.binaryStreamTakeInt(); - if (s.wasReadError()) { + if (s.wasReadError() || sz < 0) { fprintf(stderr, "error with PIDeque<%s>\n", __PIP_TYPENAME__(T)); v.clear(); return s; @@ -667,6 +672,11 @@ inline PIBinaryStream

& operator>>(PIBinaryStream

& s, PIVector2D & v) PIVector tmp; r = s.binaryStreamTakeInt(); c = s.binaryStreamTakeInt(); + if (s.wasReadError() || r < 0 || c < 0) { + fprintf(stderr, "error with PIVector2D<%s>\n", __PIP_TYPENAME__(T)); + v.clear(); + return s; + } s >> tmp; if (s.wasReadError()) { fprintf(stderr, "error with PIVector2D<%s>\n", __PIP_TYPENAME__(T)); @@ -700,7 +710,7 @@ template //! \~russian Восстанавливает ключи и значения %PIMap. inline PIBinaryStream

& operator>>(PIBinaryStream

& s, PIMap & v) { int sz = s.binaryStreamTakeInt(); - if (s.wasReadError()) { + if (s.wasReadError() || sz < 0) { fprintf(stderr, "error with PIMap<%s, %s>\n", __PIP_TYPENAME__(Key), __PIP_TYPENAME__(T)); v.clear(); return s; @@ -749,7 +759,7 @@ template //! \~russian Восстанавливает ключи %PISet. inline PIBinaryStream

& operator>>(PIBinaryStream

& s, PISet & v) { int sz = s.binaryStreamTakeInt(); - if (s.wasReadError()) { + if (s.wasReadError() || sz < 0) { fprintf(stderr, "error with PISet<%s>\n", __PIP_TYPENAME__(Key)); v.clear(); return s;