Skip to content

Commit 992031e

Browse files
committed
Fix CID 1164702 (Untrusted value as argument)
Signed-off-by: Stefan Weil <[email protected]>
1 parent c1da5fb commit 992031e

File tree

1 file changed

+7
-3
lines changed

1 file changed

+7
-3
lines changed

src/ccutil/genericvector.h

+7-3
Original file line numberDiff line numberDiff line change
@@ -945,9 +945,11 @@ bool GenericVector<T>::Serialize(tesseract::TFile* fp) const {
945945
// If swap is true, assumes a big/little-endian swap is needed.
946946
template <typename T>
947947
bool GenericVector<T>::DeSerialize(bool swap, FILE* fp) {
948-
int32_t reserved;
948+
uint32_t reserved;
949949
if (fread(&reserved, sizeof(reserved), 1, fp) != 1) return false;
950950
if (swap) Reverse32(&reserved);
951+
// Arbitrarily limit the number of elements to protect against bad data.
952+
if (reserved > UINT16_MAX) return false;
951953
reserve(reserved);
952954
size_used_ = reserved;
953955
if (fread(data_, sizeof(T), size_used_, fp) != unsigned_size()) return false;
@@ -959,15 +961,17 @@ bool GenericVector<T>::DeSerialize(bool swap, FILE* fp) {
959961
}
960962
template <typename T>
961963
bool GenericVector<T>::DeSerialize(tesseract::TFile* fp) {
962-
int32_t reserved;
964+
uint32_t reserved;
963965
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;
964968
reserve(reserved);
965969
size_used_ = reserved;
966970
return fp->FReadEndian(data_, sizeof(T), size_used_) == size_used_;
967971
}
968972
template <typename T>
969973
bool GenericVector<T>::SkipDeSerialize(tesseract::TFile* fp) {
970-
int32_t reserved;
974+
uint32_t reserved;
971975
if (fp->FReadEndian(&reserved, sizeof(reserved), 1) != 1) return false;
972976
return fp->FRead(nullptr, sizeof(T), reserved) == reserved;
973977
}

0 commit comments

Comments
 (0)