@@ -61,12 +61,10 @@ bool TrainingSample::Serialize(FILE* fp) const {
61
61
return false ;
62
62
if (fwrite (&outline_length_, sizeof (outline_length_), 1 , fp) != 1 )
63
63
return false ;
64
- if (static_cast <int >(fwrite (features_, sizeof (*features_), num_features_, fp))
65
- != num_features_)
64
+ if (fwrite (features_, sizeof (*features_), num_features_, fp) != num_features_)
66
65
return false ;
67
- if (static_cast <int >(fwrite (micro_features_, sizeof (*micro_features_),
68
- num_micro_features_,
69
- fp)) != num_micro_features_)
66
+ if (fwrite (micro_features_, sizeof (*micro_features_), num_micro_features_,
67
+ fp) != num_micro_features_)
70
68
return false ;
71
69
if (fwrite (cn_feature_, sizeof (*cn_feature_), kNumCNParams , fp) !=
72
70
kNumCNParams ) return false ;
@@ -102,16 +100,18 @@ bool TrainingSample::DeSerialize(bool swap, FILE* fp) {
102
100
ReverseN (&num_micro_features_, sizeof (num_micro_features_));
103
101
ReverseN (&outline_length_, sizeof (outline_length_));
104
102
}
103
+ // Arbitrarily limit the number of elements to protect against bad data.
104
+ if (num_features_ > UINT16_MAX) return false ;
105
+ if (num_micro_features_ > UINT16_MAX) return false ;
105
106
delete [] features_;
106
107
features_ = new INT_FEATURE_STRUCT[num_features_];
107
- if (static_cast < int >( fread (features_, sizeof (*features_), num_features_, fp) )
108
+ if (fread (features_, sizeof (*features_), num_features_, fp)
108
109
!= num_features_)
109
110
return false ;
110
111
delete [] micro_features_;
111
112
micro_features_ = new MicroFeature[num_micro_features_];
112
- if (static_cast <int >(fread (micro_features_, sizeof (*micro_features_),
113
- num_micro_features_,
114
- fp)) != num_micro_features_)
113
+ if (fread (micro_features_, sizeof (*micro_features_), num_micro_features_,
114
+ fp) != num_micro_features_)
115
115
return false ;
116
116
if (fread (cn_feature_, sizeof (*cn_feature_), kNumCNParams , fp) !=
117
117
kNumCNParams ) return false ;
@@ -165,7 +165,7 @@ TrainingSample* TrainingSample::RandomizedCopy(int index) const {
165
165
++index ; // Remove the first combination.
166
166
const int yshift = kYShiftValues [index / kSampleScaleSize ];
167
167
double scaling = kScaleValues [index % kSampleScaleSize ];
168
- for (int i = 0 ; i < num_features_; ++i) {
168
+ for (uint32_t i = 0 ; i < num_features_; ++i) {
169
169
double result = (features_[i].X - kRandomizingCenter ) * scaling;
170
170
result += kRandomizingCenter ;
171
171
sample->features_ [i].X = ClipToRange<int >(result + 0.5 , 0 , UINT8_MAX);
@@ -217,7 +217,7 @@ void TrainingSample::ExtractCharDesc(int int_feature_type,
217
217
} else {
218
218
num_features_ = char_features->NumFeatures ;
219
219
features_ = new INT_FEATURE_STRUCT[num_features_];
220
- for (int f = 0 ; f < num_features_; ++f) {
220
+ for (uint32_t f = 0 ; f < num_features_; ++f) {
221
221
features_[f].X =
222
222
static_cast <uint8_t >(char_features->Features [f]->Params [IntX]);
223
223
features_[f].Y =
@@ -238,7 +238,7 @@ void TrainingSample::ExtractCharDesc(int int_feature_type,
238
238
} else {
239
239
num_micro_features_ = char_features->NumFeatures ;
240
240
micro_features_ = new MicroFeature[num_micro_features_];
241
- for (int f = 0 ; f < num_micro_features_; ++f) {
241
+ for (uint32_t f = 0 ; f < num_micro_features_; ++f) {
242
242
for (int d = 0 ; d < MFCount; ++d) {
243
243
micro_features_[f][d] = char_features->Features [f]->Params [d];
244
244
}
@@ -294,7 +294,7 @@ void TrainingSample::MapFeatures(const IntFeatureMap& feature_map) {
294
294
// Returns a pix representing the sample. (Int features only.)
295
295
Pix* TrainingSample::RenderToPix (const UNICHARSET* unicharset) const {
296
296
Pix* pix = pixCreate (kIntFeatureExtent , kIntFeatureExtent , 1 );
297
- for (int f = 0 ; f < num_features_; ++f) {
297
+ for (uint32_t f = 0 ; f < num_features_; ++f) {
298
298
int start_x = features_[f].X ;
299
299
int start_y = kIntFeatureExtent - features_[f].Y ;
300
300
double dx = cos ((features_[f].Theta / 256.0 ) * 2.0 * M_PI - M_PI);
@@ -315,7 +315,7 @@ Pix* TrainingSample::RenderToPix(const UNICHARSET* unicharset) const {
315
315
void TrainingSample::DisplayFeatures (ScrollView::Color color,
316
316
ScrollView* window) const {
317
317
#ifndef GRAPHICS_DISABLED
318
- for (int f = 0 ; f < num_features_; ++f) {
318
+ for (uint32_t f = 0 ; f < num_features_; ++f) {
319
319
RenderIntFeature (window, &features_[f], color);
320
320
}
321
321
#endif // GRAPHICS_DISABLED
0 commit comments