Added missing validation to CopyBufferSubData
Missing validation for mapped buffers and overlap
was added to CopyBufferSubData.
Change-Id: If1f3f9901f039f5737d41ca46d98ce4c188274d6
Reviewed-on: https://swiftshader-review.googlesource.com/3603
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index e1cef90..fa75133 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -2661,22 +2661,23 @@
if(context)
{
- es2::Buffer *readBuffer = nullptr;
- if(!context->getBuffer(readTarget, &readBuffer))
+ es2::Buffer *readBuffer = nullptr, *writeBuffer = nullptr;
+ if(!context->getBuffer(readTarget, &readBuffer) || !context->getBuffer(writeTarget, &writeBuffer))
{
return error(GL_INVALID_ENUM);
}
- if(static_cast<size_t>(readOffset + size) > readBuffer->size())
+ if(!readBuffer || readBuffer->isMapped() || !writeBuffer || writeBuffer->isMapped())
+ {
+ return error(GL_INVALID_OPERATION);
+ }
+ if((readBuffer == writeBuffer) && // If same buffer, check for overlap
+ ((readOffset >= writeOffset) && (readOffset < (writeOffset + size)) ||
+ (writeOffset >= readOffset) && (writeOffset < (readOffset + size))))
{
return error(GL_INVALID_VALUE);
}
-
- es2::Buffer *writeBuffer = nullptr;
- if(!context->getBuffer(writeTarget, &writeBuffer))
- {
- return error(GL_INVALID_ENUM);
- }
- if(static_cast<size_t>(writeOffset + size) > writeBuffer->size())
+ if((static_cast<size_t>(readOffset + size) > readBuffer->size()) ||
+ (static_cast<size_t>(writeOffset + size) > writeBuffer->size()))
{
return error(GL_INVALID_VALUE);
}