|
9 | 9 | #include <serialize.h>
|
10 | 10 | #include <span.h>
|
11 | 11 | #include <support/allocators/zeroafterfree.h>
|
| 12 | +#include <util/overflow.h> |
12 | 13 |
|
13 | 14 | #include <algorithm>
|
14 | 15 | #include <assert.h>
|
@@ -281,36 +282,32 @@ class CDataStream
|
281 | 282 | if (dst.size() == 0) return;
|
282 | 283 |
|
283 | 284 | // Read from the beginning of the buffer
|
284 |
| - unsigned int nReadPosNext = nReadPos + dst.size(); |
285 |
| - if (nReadPosNext > vch.size()) { |
| 285 | + auto next_read_pos{CheckedAdd<uint32_t>(nReadPos, dst.size())}; |
| 286 | + if (!next_read_pos.has_value() || next_read_pos.value() > vch.size()) { |
286 | 287 | throw std::ios_base::failure("CDataStream::read(): end of data");
|
287 | 288 | }
|
288 | 289 | memcpy(dst.data(), &vch[nReadPos], dst.size());
|
289 |
| - if (nReadPosNext == vch.size()) |
290 |
| - { |
| 290 | + if (next_read_pos.value() == vch.size()) { |
291 | 291 | nReadPos = 0;
|
292 | 292 | vch.clear();
|
293 | 293 | return;
|
294 | 294 | }
|
295 |
| - nReadPos = nReadPosNext; |
| 295 | + nReadPos = next_read_pos.value(); |
296 | 296 | }
|
297 | 297 |
|
298 |
| - void ignore(int nSize) |
| 298 | + void ignore(size_t num_ignore) |
299 | 299 | {
|
300 | 300 | // Ignore from the beginning of the buffer
|
301 |
| - if (nSize < 0) { |
302 |
| - throw std::ios_base::failure("CDataStream::ignore(): nSize negative"); |
| 301 | + auto next_read_pos{CheckedAdd<uint32_t>(nReadPos, num_ignore)}; |
| 302 | + if (!next_read_pos.has_value() || next_read_pos.value() > vch.size()) { |
| 303 | + throw std::ios_base::failure("CDataStream::ignore(): end of data"); |
303 | 304 | }
|
304 |
| - unsigned int nReadPosNext = nReadPos + nSize; |
305 |
| - if (nReadPosNext >= vch.size()) |
306 |
| - { |
307 |
| - if (nReadPosNext > vch.size()) |
308 |
| - throw std::ios_base::failure("CDataStream::ignore(): end of data"); |
| 305 | + if (next_read_pos.value() == vch.size()) { |
309 | 306 | nReadPos = 0;
|
310 | 307 | vch.clear();
|
311 | 308 | return;
|
312 | 309 | }
|
313 |
| - nReadPos = nReadPosNext; |
| 310 | + nReadPos = next_read_pos.value(); |
314 | 311 | }
|
315 | 312 |
|
316 | 313 | void write(Span<const value_type> src)
|
|
0 commit comments