Skip to content
Snippets Groups Projects
Commit d8c78052 authored by Jonathan Kew's avatar Jonathan Kew
Browse files

Bug 1874489 - patch 2 - Avoid potential arithmetic overflow during Buffer read...

Bug 1874489 - patch 2 - Avoid potential arithmetic overflow during Buffer read operations.  a=RyanVM

Original Revision: https://phabricator.services.mozilla.com/D204917

Differential Revision: https://phabricator.services.mozilla.com/D206178
parent 755ed732
No related branches found
No related tags found
No related merge requests found
...@@ -87,8 +87,7 @@ class Buffer { ...@@ -87,8 +87,7 @@ class Buffer {
if (n_bytes > 1024 * 1024 * 1024) { if (n_bytes > 1024 * 1024 * 1024) {
return OTS_FAILURE(); return OTS_FAILURE();
} }
if ((offset_ + n_bytes > length_) || if (length_ < n_bytes || offset_ > length_ - n_bytes) {
(offset_ > length_ - n_bytes)) {
return OTS_FAILURE(); return OTS_FAILURE();
} }
if (buf) { if (buf) {
...@@ -99,7 +98,7 @@ class Buffer { ...@@ -99,7 +98,7 @@ class Buffer {
} }
inline bool ReadU8(uint8_t *value) { inline bool ReadU8(uint8_t *value) {
if (offset_ + 1 > length_) { if (length_ < 1 || offset_ > length_ - 1) {
return OTS_FAILURE(); return OTS_FAILURE();
} }
*value = buffer_[offset_]; *value = buffer_[offset_];
...@@ -108,7 +107,7 @@ class Buffer { ...@@ -108,7 +107,7 @@ class Buffer {
} }
bool ReadU16(uint16_t *value) { bool ReadU16(uint16_t *value) {
if (offset_ + 2 > length_) { if (length_ < 2 || offset_ > length_ - 2) {
return OTS_FAILURE(); return OTS_FAILURE();
} }
std::memcpy(value, buffer_ + offset_, sizeof(uint16_t)); std::memcpy(value, buffer_ + offset_, sizeof(uint16_t));
...@@ -122,7 +121,7 @@ class Buffer { ...@@ -122,7 +121,7 @@ class Buffer {
} }
bool ReadU24(uint32_t *value) { bool ReadU24(uint32_t *value) {
if (offset_ + 3 > length_) { if (length_ < 3 || offset_ > length_ - 3) {
return OTS_FAILURE(); return OTS_FAILURE();
} }
*value = static_cast<uint32_t>(buffer_[offset_]) << 16 | *value = static_cast<uint32_t>(buffer_[offset_]) << 16 |
...@@ -133,7 +132,7 @@ class Buffer { ...@@ -133,7 +132,7 @@ class Buffer {
} }
bool ReadU32(uint32_t *value) { bool ReadU32(uint32_t *value) {
if (offset_ + 4 > length_) { if (length_ < 4 || offset_ > length_ - 4) {
return OTS_FAILURE(); return OTS_FAILURE();
} }
std::memcpy(value, buffer_ + offset_, sizeof(uint32_t)); std::memcpy(value, buffer_ + offset_, sizeof(uint32_t));
...@@ -147,7 +146,7 @@ class Buffer { ...@@ -147,7 +146,7 @@ class Buffer {
} }
bool ReadR64(uint64_t *value) { bool ReadR64(uint64_t *value) {
if (offset_ + 8 > length_) { if (length_ < 8 || offset_ > length_ - 8) {
return OTS_FAILURE(); return OTS_FAILURE();
} }
std::memcpy(value, buffer_ + offset_, sizeof(uint64_t)); std::memcpy(value, buffer_ + offset_, sizeof(uint64_t));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment