@@ -98,7 +98,7 @@ char* TFile::FGets(char* buffer, int buffer_size) {
98
98
return size > 0 ? buffer : nullptr ;
99
99
}
100
100
101
- int TFile::FReadEndian (void * buffer, int size, int count) {
101
+ int TFile::FReadEndian (void * buffer, size_t size, int count) {
102
102
int num_read = FRead (buffer, size, count);
103
103
if (swap_) {
104
104
char * char_buffer = static_cast <char *>(buffer);
@@ -109,12 +109,20 @@ int TFile::FReadEndian(void* buffer, int size, int count) {
109
109
return num_read;
110
110
}
111
111
112
- int TFile::FRead (void * buffer, int size, int count) {
112
+ int TFile::FRead (void * buffer, size_t size, int count) {
113
113
ASSERT_HOST (!is_writing_);
114
- int required_size = size * count;
115
- if (required_size <= 0 ) return 0 ;
116
- if (data_->size () - offset_ < required_size)
114
+ ASSERT_HOST (size > 0 );
115
+ ASSERT_HOST (count > 0 );
116
+ size_t required_size;
117
+ if (SIZE_MAX / size <= count) {
118
+ // Avoid integer overflow.
117
119
required_size = data_->size () - offset_;
120
+ } else {
121
+ required_size = size * count;
122
+ if (data_->size () - offset_ < required_size) {
123
+ required_size = data_->size () - offset_;
124
+ }
125
+ }
118
126
if (required_size > 0 && buffer != nullptr )
119
127
memcpy (buffer, &(*data_)[offset_], required_size);
120
128
offset_ += required_size;
@@ -149,14 +157,16 @@ bool TFile::CloseWrite(const STRING& filename, FileWriter writer) {
149
157
return (*writer)(*data_, filename);
150
158
}
151
159
152
- int TFile::FWrite (const void * buffer, int size, int count) {
160
+ int TFile::FWrite (const void * buffer, size_t size, int count) {
153
161
ASSERT_HOST (is_writing_);
154
- int total = size * count;
155
- if (total <= 0 ) return 0 ;
162
+ ASSERT_HOST (size > 0 );
163
+ ASSERT_HOST (count > 0 );
164
+ ASSERT_HOST (SIZE_MAX / size > count);
165
+ size_t total = size * count;
156
166
const char * buf = static_cast <const char *>(buffer);
157
167
// This isn't very efficient, but memory is so fast compared to disk
158
168
// that it is relatively unimportant, and very simple.
159
- for (int i = 0 ; i < total; ++i)
169
+ for (size_t i = 0 ; i < total; ++i)
160
170
data_->push_back (buf[i]);
161
171
return count;
162
172
}
0 commit comments