1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 07:07:34 +00:00

AK: Correct ByteBuffer::{overwrite,slice*} bounds check

This commit is contained in:
AnotherTest 2020-04-27 21:53:39 +04:30 committed by Andreas Kling
parent 7f1d3f6d62
commit cf5941c972

View file

@ -94,9 +94,9 @@ private:
Wrap, Wrap,
Adopt Adopt
}; };
explicit ByteBufferImpl(size_t); // For ConstructionMode=Uninitialized explicit ByteBufferImpl(size_t); // For ConstructionMode=Uninitialized
ByteBufferImpl(const void*, size_t, ConstructionMode); // For ConstructionMode=Copy ByteBufferImpl(const void*, size_t, ConstructionMode); // For ConstructionMode=Copy
ByteBufferImpl(void*, size_t, ConstructionMode); // For ConstructionMode=Wrap/Adopt ByteBufferImpl(void*, size_t, ConstructionMode); // For ConstructionMode=Wrap/Adopt
ByteBufferImpl() {} ByteBufferImpl() {}
u8* m_data { nullptr }; u8* m_data { nullptr };
@ -183,10 +183,10 @@ public:
{ {
if (is_null()) if (is_null())
return {}; return {};
if (offset >= this->size())
return {}; // I cannot hand you a slice I don't have
if (offset + size >= this->size()) ASSERT(offset + size <= this->size());
size = this->size() - offset;
return wrap(offset_pointer(offset), size); return wrap(offset_pointer(offset), size);
} }
@ -194,10 +194,10 @@ public:
{ {
if (is_null()) if (is_null())
return {}; return {};
if (offset >= this->size())
return {}; // I cannot hand you a slice I don't have
if (offset + size >= this->size()) ASSERT(offset + size <= this->size());
size = this->size() - offset;
return copy(offset_pointer(offset), size); return copy(offset_pointer(offset), size);
} }
@ -222,7 +222,7 @@ public:
void overwrite(size_t offset, const void* data, size_t data_size) void overwrite(size_t offset, const void* data, size_t data_size)
{ {
// make sure we're not told to write past the end // make sure we're not told to write past the end
ASSERT(offset + data_size < size()); ASSERT(offset + data_size <= size());
__builtin_memcpy(this->data() + offset, data, data_size); __builtin_memcpy(this->data() + offset, data, data_size);
} }