Commit f330190f by Nicolas Capens

Fix validation of texture level.

Early out checks for zero size were skipping the validation. Change-Id: I1d8173146117be5a7a3330cf6eae46c2ef8231ff Reviewed-on: https://swiftshader-review.googlesource.com/5093Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 0637eac3
...@@ -703,7 +703,12 @@ void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLs ...@@ -703,7 +703,12 @@ void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLs
"GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = %p)", "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = %p)",
target, level, internalformat, width, height, border, imageSize, data); target, level, internalformat, width, height, border, imageSize, data);
if(!validImageSize(level, width, height) || border != 0 || imageSize < 0) if(level < 0 || level >= es1::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
{
return error(GL_INVALID_VALUE);
}
if(!validImageSize(level, width, height) || imageSize < 0)
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
...@@ -737,11 +742,6 @@ void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLs ...@@ -737,11 +742,6 @@ void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLs
if(context) if(context)
{ {
if(level > es1::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
{
return error(GL_INVALID_VALUE);
}
switch(target) switch(target)
{ {
case GL_TEXTURE_2D: case GL_TEXTURE_2D:
...@@ -788,6 +788,11 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo ...@@ -788,6 +788,11 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
if(level < 0 || level >= es1::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
{
return error(GL_INVALID_VALUE);
}
if(xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0) if(xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
...@@ -808,7 +813,7 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo ...@@ -808,7 +813,7 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
if(width == 0 || height == 0 || data == NULL) if(width == 0 || height == 0 || !data)
{ {
return; return;
} }
...@@ -817,11 +822,6 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo ...@@ -817,11 +822,6 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo
if(context) if(context)
{ {
if(level > es1::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
{
return error(GL_INVALID_VALUE);
}
if(imageSize != egl::ComputeCompressedSize(width, height, format)) if(imageSize != egl::ComputeCompressedSize(width, height, format))
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
...@@ -972,7 +972,12 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, ...@@ -972,7 +972,12 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
if(level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0) if(level < 0 || level >= es1::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
{
return error(GL_INVALID_VALUE);
}
if(xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
...@@ -991,10 +996,6 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, ...@@ -991,10 +996,6 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
if(context) if(context)
{ {
if(level > es1::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
{
return error(GL_INVALID_VALUE);
}
es1::Framebuffer *framebuffer = context->getFramebuffer(); es1::Framebuffer *framebuffer = context->getFramebuffer();
...@@ -4517,7 +4518,12 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs ...@@ -4517,7 +4518,12 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
if(level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0) if(level < 0 || level >= es1::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
{
return error(GL_INVALID_VALUE);
}
if(xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
...@@ -4532,7 +4538,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs ...@@ -4532,7 +4538,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
if(width == 0 || height == 0 || pixels == NULL) if(width == 0 || height == 0 || !pixels)
{ {
return; return;
} }
...@@ -4541,11 +4547,6 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs ...@@ -4541,11 +4547,6 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
if(context) if(context)
{ {
if(level > es1::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
{
return error(GL_INVALID_VALUE);
}
if(target == GL_TEXTURE_2D) if(target == GL_TEXTURE_2D)
{ {
es1::Texture2D *texture = context->getTexture2D(); es1::Texture2D *texture = context->getTexture2D();
......
...@@ -1013,6 +1013,11 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo ...@@ -1013,6 +1013,11 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
{
return error(GL_INVALID_VALUE);
}
if(xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0) if(xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
...@@ -1024,7 +1029,7 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo ...@@ -1024,7 +1029,7 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo
return error(validationError); return error(validationError);
} }
if(width == 0 || height == 0 || data == NULL) if(width == 0 || height == 0 || !data)
{ {
return; return;
} }
...@@ -1033,11 +1038,6 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo ...@@ -1033,11 +1038,6 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo
if(context) if(context)
{ {
if(level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
{
return error(GL_INVALID_VALUE);
}
if(imageSize != egl::ComputeCompressedSize(width, height, format)) if(imageSize != egl::ComputeCompressedSize(width, height, format))
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
...@@ -1193,7 +1193,12 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, ...@@ -1193,7 +1193,12 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
if(level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0) if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
{
return error(GL_INVALID_VALUE);
}
if(xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
...@@ -1212,11 +1217,6 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, ...@@ -1212,11 +1217,6 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
if(context) if(context)
{ {
if(level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
{
return error(GL_INVALID_VALUE);
}
es2::Framebuffer *framebuffer = context->getReadFramebuffer(); es2::Framebuffer *framebuffer = context->getReadFramebuffer();
if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE) if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
...@@ -1231,7 +1231,7 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, ...@@ -1231,7 +1231,7 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
es2::Texture *texture = NULL; es2::Texture *texture = nullptr;
if(target == GL_TEXTURE_2D) if(target == GL_TEXTURE_2D)
{ {
...@@ -6207,7 +6207,12 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs ...@@ -6207,7 +6207,12 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
if(level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0) if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
{
return error(GL_INVALID_VALUE);
}
if(xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
...@@ -6222,7 +6227,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs ...@@ -6222,7 +6227,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
if(width == 0 || height == 0 || pixels == NULL) if(width == 0 || height == 0 || !pixels)
{ {
return; return;
} }
...@@ -6231,11 +6236,6 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs ...@@ -6231,11 +6236,6 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
if(context) if(context)
{ {
if(level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
{
return error(GL_INVALID_VALUE);
}
GLenum sizedInternalFormat = GetSizedInternalFormat(format, type); GLenum sizedInternalFormat = GetSizedInternalFormat(format, type);
if(target == GL_TEXTURE_2D) if(target == GL_TEXTURE_2D)
...@@ -7263,6 +7263,11 @@ void CompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint ...@@ -7263,6 +7263,11 @@ void CompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
{
return error(GL_INVALID_VALUE);
}
if(xoffset < 0 || yoffset < 0 || zoffset < 0 || !validImageSize(level, width, height) || depth < 0 || imageSize < 0) if(xoffset < 0 || yoffset < 0 || zoffset < 0 || !validImageSize(level, width, height) || depth < 0 || imageSize < 0)
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
...@@ -7274,7 +7279,7 @@ void CompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint ...@@ -7274,7 +7279,7 @@ void CompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint
return error(validationError); return error(validationError);
} }
if(width == 0 || height == 0 || depth == 0 || data == NULL) if(width == 0 || height == 0 || depth == 0 || !data)
{ {
return; return;
} }
......
...@@ -870,6 +870,11 @@ GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D(GLenum target, GLint level ...@@ -870,6 +870,11 @@ GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D(GLenum target, GLint level
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
{
return error(GL_INVALID_VALUE);
}
if(xoffset < 0 || yoffset < 0 || zoffset < 0 || !validImageSize(level, width, height) || depth < 0 || imageSize < 0) if(xoffset < 0 || yoffset < 0 || zoffset < 0 || !validImageSize(level, width, height) || depth < 0 || imageSize < 0)
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
...@@ -881,7 +886,7 @@ GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D(GLenum target, GLint level ...@@ -881,7 +886,7 @@ GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D(GLenum target, GLint level
return error(validationError); return error(validationError);
} }
if(width == 0 || height == 0 || depth == 0 || data == NULL) if(width == 0 || height == 0 || depth == 0 || !data)
{ {
return; return;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment