check PIBinaryStream negative size to fix memory overflow
This commit is contained in:
@@ -56,17 +56,17 @@
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
# define BINARY_STREAM_FRIEND(T) \
|
# define BINARY_STREAM_FRIEND(T) \
|
||||||
template<typename P> \
|
template<typename P> \
|
||||||
friend PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const T & v); \
|
friend PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const T & v); \
|
||||||
template<typename P> \
|
template<typename P> \
|
||||||
friend PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, T & v);
|
friend PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, T & v);
|
||||||
# define BINARY_STREAM_WRITE(T) \
|
# define BINARY_STREAM_WRITE(T) \
|
||||||
template<typename P> \
|
template<typename P> \
|
||||||
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const T & v)
|
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const T & v)
|
||||||
# define BINARY_STREAM_READ(T) \
|
# define BINARY_STREAM_READ(T) \
|
||||||
template<typename P> \
|
template<typename P> \
|
||||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, T & v)
|
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, T & v)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -410,7 +410,7 @@ template<typename P,
|
|||||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) {
|
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) {
|
||||||
// piCout << ">> vector trivial default";
|
// piCout << ">> vector trivial default";
|
||||||
int sz = s.binaryStreamTakeInt();
|
int sz = s.binaryStreamTakeInt();
|
||||||
if (s.wasReadError()) {
|
if (s.wasReadError() || sz < 0) {
|
||||||
fprintf(stderr, "error with PIVector<%s>\n", __PIP_TYPENAME__(T));
|
fprintf(stderr, "error with PIVector<%s>\n", __PIP_TYPENAME__(T));
|
||||||
v.clear();
|
v.clear();
|
||||||
return s;
|
return s;
|
||||||
@@ -433,7 +433,7 @@ template<typename P,
|
|||||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) {
|
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) {
|
||||||
// piCout << ">> vector trivial custom";
|
// piCout << ">> vector trivial custom";
|
||||||
int sz = s.binaryStreamTakeInt();
|
int sz = s.binaryStreamTakeInt();
|
||||||
if (s.wasReadError()) {
|
if (s.wasReadError() || sz < 0) {
|
||||||
fprintf(stderr, "error with PIVector<%s>\n", __PIP_TYPENAME__(T));
|
fprintf(stderr, "error with PIVector<%s>\n", __PIP_TYPENAME__(T));
|
||||||
v.clear();
|
v.clear();
|
||||||
return s;
|
return s;
|
||||||
@@ -462,7 +462,7 @@ template<typename P,
|
|||||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIDeque<T> & v) {
|
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIDeque<T> & v) {
|
||||||
// piCout << ">> deque trivial default";
|
// piCout << ">> deque trivial default";
|
||||||
int sz = s.binaryStreamTakeInt();
|
int sz = s.binaryStreamTakeInt();
|
||||||
if (s.wasReadError()) {
|
if (s.wasReadError() || sz < 0) {
|
||||||
fprintf(stderr, "error with PIDeque<%s>\n", __PIP_TYPENAME__(T));
|
fprintf(stderr, "error with PIDeque<%s>\n", __PIP_TYPENAME__(T));
|
||||||
v.clear();
|
v.clear();
|
||||||
return s;
|
return s;
|
||||||
@@ -485,7 +485,7 @@ template<typename P,
|
|||||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIDeque<T> & v) {
|
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIDeque<T> & v) {
|
||||||
// piCout << ">> deque trivial custom";
|
// piCout << ">> deque trivial custom";
|
||||||
int sz = s.binaryStreamTakeInt();
|
int sz = s.binaryStreamTakeInt();
|
||||||
if (s.wasReadError()) {
|
if (s.wasReadError() || sz < 0) {
|
||||||
fprintf(stderr, "error with PIDeque<%s>\n", __PIP_TYPENAME__(T));
|
fprintf(stderr, "error with PIDeque<%s>\n", __PIP_TYPENAME__(T));
|
||||||
v.clear();
|
v.clear();
|
||||||
return s;
|
return s;
|
||||||
@@ -516,7 +516,7 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector2D<T> & v)
|
|||||||
int r, c;
|
int r, c;
|
||||||
r = s.binaryStreamTakeInt();
|
r = s.binaryStreamTakeInt();
|
||||||
c = 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));
|
fprintf(stderr, "error with PIVector2D<%s>\n", __PIP_TYPENAME__(T));
|
||||||
v.clear();
|
v.clear();
|
||||||
return s;
|
return s;
|
||||||
@@ -542,6 +542,11 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector2D<T> & v)
|
|||||||
PIVector<T> tmp;
|
PIVector<T> tmp;
|
||||||
r = s.binaryStreamTakeInt();
|
r = s.binaryStreamTakeInt();
|
||||||
c = 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;
|
s >> tmp;
|
||||||
if (s.wasReadError()) {
|
if (s.wasReadError()) {
|
||||||
fprintf(stderr, "error with PIVector2D<%s>\n", __PIP_TYPENAME__(T));
|
fprintf(stderr, "error with PIVector2D<%s>\n", __PIP_TYPENAME__(T));
|
||||||
@@ -618,7 +623,7 @@ template<typename P, typename T, typename std::enable_if<!std::is_trivially_copy
|
|||||||
//! \~russian Восстанавливает %PIVector из нетривиальных элементов по одному.
|
//! \~russian Восстанавливает %PIVector из нетривиальных элементов по одному.
|
||||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) {
|
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) {
|
||||||
int sz = s.binaryStreamTakeInt();
|
int sz = s.binaryStreamTakeInt();
|
||||||
if (s.wasReadError()) {
|
if (s.wasReadError() || sz < 0) {
|
||||||
fprintf(stderr, "error with PIVector<%s>\n", __PIP_TYPENAME__(T));
|
fprintf(stderr, "error with PIVector<%s>\n", __PIP_TYPENAME__(T));
|
||||||
v.clear();
|
v.clear();
|
||||||
return s;
|
return s;
|
||||||
@@ -641,7 +646,7 @@ template<typename P, typename T, typename std::enable_if<!std::is_trivially_copy
|
|||||||
//! \~russian Восстанавливает %PIDeque из нетривиальных элементов по одному.
|
//! \~russian Восстанавливает %PIDeque из нетривиальных элементов по одному.
|
||||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIDeque<T> & v) {
|
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIDeque<T> & v) {
|
||||||
int sz = s.binaryStreamTakeInt();
|
int sz = s.binaryStreamTakeInt();
|
||||||
if (s.wasReadError()) {
|
if (s.wasReadError() || sz < 0) {
|
||||||
fprintf(stderr, "error with PIDeque<%s>\n", __PIP_TYPENAME__(T));
|
fprintf(stderr, "error with PIDeque<%s>\n", __PIP_TYPENAME__(T));
|
||||||
v.clear();
|
v.clear();
|
||||||
return s;
|
return s;
|
||||||
@@ -667,6 +672,11 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector2D<T> & v)
|
|||||||
PIVector<T> tmp;
|
PIVector<T> tmp;
|
||||||
r = s.binaryStreamTakeInt();
|
r = s.binaryStreamTakeInt();
|
||||||
c = 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;
|
s >> tmp;
|
||||||
if (s.wasReadError()) {
|
if (s.wasReadError()) {
|
||||||
fprintf(stderr, "error with PIVector2D<%s>\n", __PIP_TYPENAME__(T));
|
fprintf(stderr, "error with PIVector2D<%s>\n", __PIP_TYPENAME__(T));
|
||||||
@@ -700,7 +710,7 @@ template<typename P, typename Key, typename T>
|
|||||||
//! \~russian Восстанавливает ключи и значения %PIMap.
|
//! \~russian Восстанавливает ключи и значения %PIMap.
|
||||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIMap<Key, T> & v) {
|
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIMap<Key, T> & v) {
|
||||||
int sz = s.binaryStreamTakeInt();
|
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));
|
fprintf(stderr, "error with PIMap<%s, %s>\n", __PIP_TYPENAME__(Key), __PIP_TYPENAME__(T));
|
||||||
v.clear();
|
v.clear();
|
||||||
return s;
|
return s;
|
||||||
@@ -749,7 +759,7 @@ template<typename P, typename Key>
|
|||||||
//! \~russian Восстанавливает ключи %PISet.
|
//! \~russian Восстанавливает ключи %PISet.
|
||||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PISet<Key> & v) {
|
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PISet<Key> & v) {
|
||||||
int sz = s.binaryStreamTakeInt();
|
int sz = s.binaryStreamTakeInt();
|
||||||
if (s.wasReadError()) {
|
if (s.wasReadError() || sz < 0) {
|
||||||
fprintf(stderr, "error with PISet<%s>\n", __PIP_TYPENAME__(Key));
|
fprintf(stderr, "error with PISet<%s>\n", __PIP_TYPENAME__(Key));
|
||||||
v.clear();
|
v.clear();
|
||||||
return s;
|
return s;
|
||||||
|
|||||||
Reference in New Issue
Block a user