@@ -945,9 +945,11 @@ bool GenericVector<T>::Serialize(tesseract::TFile* fp) const {
945
945
// If swap is true, assumes a big/little-endian swap is needed.
946
946
template <typename T>
947
947
bool GenericVector<T>::DeSerialize(bool swap, FILE* fp) {
948
- int32_t reserved;
948
+ uint32_t reserved;
949
949
if (fread (&reserved, sizeof (reserved), 1 , fp) != 1 ) return false ;
950
950
if (swap) Reverse32 (&reserved);
951
+ // Arbitrarily limit the number of elements to protect against bad data.
952
+ if (reserved > UINT16_MAX) return false ;
951
953
reserve (reserved);
952
954
size_used_ = reserved;
953
955
if (fread (data_, sizeof (T), size_used_, fp) != unsigned_size ()) return false ;
@@ -959,15 +961,17 @@ bool GenericVector<T>::DeSerialize(bool swap, FILE* fp) {
959
961
}
960
962
template <typename T>
961
963
bool GenericVector<T>::DeSerialize(tesseract::TFile* fp) {
962
- int32_t reserved;
964
+ uint32_t reserved;
963
965
if (fp->FReadEndian (&reserved, sizeof (reserved), 1 ) != 1 ) return false ;
966
+ // Arbitrarily limit the number of elements to protect against bad data.
967
+ if (reserved > UINT16_MAX) return false ;
964
968
reserve (reserved);
965
969
size_used_ = reserved;
966
970
return fp->FReadEndian (data_, sizeof (T), size_used_) == size_used_;
967
971
}
968
972
template <typename T>
969
973
bool GenericVector<T>::SkipDeSerialize(tesseract::TFile* fp) {
970
- int32_t reserved;
974
+ uint32_t reserved;
971
975
if (fp->FReadEndian (&reserved, sizeof (reserved), 1 ) != 1 ) return false ;
972
976
return fp->FRead (nullptr , sizeof (T), reserved) == reserved;
973
977
}
0 commit comments