OSDN Git Service

Fix validation of texture level.
authorNicolas Capens <capn@google.com>
Tue, 12 Apr 2016 04:54:08 +0000 (00:54 -0400)
committerNicolas Capens <capn@google.com>
Thu, 14 Apr 2016 19:56:07 +0000 (19:56 +0000)
Early out checks for zero size were skipping the validation.

Change-Id: I1d8173146117be5a7a3330cf6eae46c2ef8231ff
Reviewed-on: https://swiftshader-review.googlesource.com/5093
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
src/OpenGL/libGLES_CM/libGLES_CM.cpp
src/OpenGL/libGLESv2/libGLESv2.cpp
src/OpenGL/libGLESv2/libGLESv3.cpp

index 175be75..0c9dd62 100644 (file)
@@ -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)",\r
              target, level, internalformat, width, height, border, imageSize, data);\r
 \r
-       if(!validImageSize(level, width, height) || border != 0 || imageSize < 0)\r
+       if(level < 0 || level >= es1::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
+       {\r
+               return error(GL_INVALID_VALUE);\r
+       }\r
+\r
+       if(!validImageSize(level, width, height) || imageSize < 0)\r
        {\r
                return error(GL_INVALID_VALUE);\r
        }\r
@@ -737,11 +742,6 @@ void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLs
 \r
        if(context)\r
        {\r
-               if(level > es1::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
-               {\r
-                       return error(GL_INVALID_VALUE);\r
-               }\r
-\r
                switch(target)\r
                {\r
                case GL_TEXTURE_2D:\r
@@ -788,6 +788,11 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo
                return error(GL_INVALID_ENUM);\r
        }\r
 \r
+       if(level < 0 || level >= es1::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
+       {\r
+               return error(GL_INVALID_VALUE);\r
+       }\r
+\r
        if(xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)\r
        {\r
                return error(GL_INVALID_VALUE);\r
@@ -808,7 +813,7 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo
                return error(GL_INVALID_ENUM);\r
        }\r
 \r
-       if(width == 0 || height == 0 || data == NULL)\r
+       if(width == 0 || height == 0 || !data)\r
        {\r
                return;\r
        }\r
@@ -817,11 +822,6 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo
 \r
        if(context)\r
        {\r
-               if(level > es1::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
-               {\r
-                       return error(GL_INVALID_VALUE);\r
-               }\r
-\r
                if(imageSize != egl::ComputeCompressedSize(width, height, format))\r
                {\r
                        return error(GL_INVALID_VALUE);\r
@@ -972,7 +972,12 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
                return error(GL_INVALID_ENUM);\r
        }\r
 \r
-       if(level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)\r
+       if(level < 0 || level >= es1::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
+       {\r
+               return error(GL_INVALID_VALUE);\r
+       }\r
+\r
+       if(xoffset < 0 || yoffset < 0 || width < 0 || height < 0)\r
        {\r
                return error(GL_INVALID_VALUE);\r
        }\r
@@ -991,10 +996,6 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
 \r
        if(context)\r
        {\r
-               if(level > es1::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
-               {\r
-                       return error(GL_INVALID_VALUE);\r
-               }\r
 \r
                es1::Framebuffer *framebuffer = context->getFramebuffer();\r
 \r
@@ -4517,7 +4518,12 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
                return error(GL_INVALID_ENUM);\r
        }\r
 \r
-       if(level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)\r
+       if(level < 0 || level >= es1::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
+       {\r
+               return error(GL_INVALID_VALUE);\r
+       }\r
+\r
+       if(xoffset < 0 || yoffset < 0 || width < 0 || height < 0)\r
        {\r
                return error(GL_INVALID_VALUE);\r
        }\r
@@ -4532,7 +4538,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
                return error(GL_INVALID_ENUM);\r
        }\r
 \r
-       if(width == 0 || height == 0 || pixels == NULL)\r
+       if(width == 0 || height == 0 || !pixels)\r
        {\r
                return;\r
        }\r
@@ -4541,11 +4547,6 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
 \r
        if(context)\r
        {\r
-               if(level > es1::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
-               {\r
-                       return error(GL_INVALID_VALUE);\r
-               }\r
-\r
                if(target == GL_TEXTURE_2D)\r
                {\r
                        es1::Texture2D *texture = context->getTexture2D();\r
index ec8a2fa..467aafe 100644 (file)
@@ -1013,6 +1013,11 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo
                return error(GL_INVALID_ENUM);\r
        }\r
 \r
+       if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
+       {\r
+               return error(GL_INVALID_VALUE);\r
+       }\r
+\r
        if(xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)\r
        {\r
                return error(GL_INVALID_VALUE);\r
@@ -1024,7 +1029,7 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo
                return error(validationError);\r
        }\r
 \r
-       if(width == 0 || height == 0 || data == NULL)\r
+       if(width == 0 || height == 0 || !data)\r
        {\r
                return;\r
        }\r
@@ -1033,11 +1038,6 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo
 \r
        if(context)\r
        {\r
-               if(level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
-               {\r
-                       return error(GL_INVALID_VALUE);\r
-               }\r
-\r
                if(imageSize != egl::ComputeCompressedSize(width, height, format))\r
                {\r
                        return error(GL_INVALID_VALUE);\r
@@ -1193,7 +1193,12 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
                return error(GL_INVALID_ENUM);\r
        }\r
 \r
-       if(level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)\r
+       if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
+       {\r
+               return error(GL_INVALID_VALUE);\r
+       }\r
+\r
+       if(xoffset < 0 || yoffset < 0 || width < 0 || height < 0)\r
        {\r
                return error(GL_INVALID_VALUE);\r
        }\r
@@ -1212,11 +1217,6 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
 \r
        if(context)\r
        {\r
-               if(level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
-               {\r
-                       return error(GL_INVALID_VALUE);\r
-               }\r
-\r
                es2::Framebuffer *framebuffer = context->getReadFramebuffer();\r
 \r
                if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)\r
@@ -1231,7 +1231,7 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
                        return error(GL_INVALID_OPERATION);\r
                }\r
 \r
-               es2::Texture *texture = NULL;\r
+               es2::Texture *texture = nullptr;\r
 \r
                if(target == GL_TEXTURE_2D)\r
                {\r
@@ -6207,7 +6207,12 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
                return error(GL_INVALID_ENUM);\r
        }\r
 \r
-       if(level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)\r
+       if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
+       {\r
+               return error(GL_INVALID_VALUE);\r
+       }\r
+\r
+       if(xoffset < 0 || yoffset < 0 || width < 0 || height < 0)\r
        {\r
                return error(GL_INVALID_VALUE);\r
        }\r
@@ -6222,7 +6227,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
                return error(GL_INVALID_ENUM);\r
        }\r
 \r
-       if(width == 0 || height == 0 || pixels == NULL)\r
+       if(width == 0 || height == 0 || !pixels)\r
        {\r
                return;\r
        }\r
@@ -6231,11 +6236,6 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
 \r
        if(context)\r
        {\r
-               if(level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
-               {\r
-                       return error(GL_INVALID_VALUE);\r
-               }\r
-\r
                GLenum sizedInternalFormat = GetSizedInternalFormat(format, type);\r
 \r
                if(target == GL_TEXTURE_2D)\r
@@ -7263,6 +7263,11 @@ void CompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint
                return error(GL_INVALID_ENUM);\r
        }\r
 \r
+       if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
+       {\r
+               return error(GL_INVALID_VALUE);\r
+       }\r
+\r
        if(xoffset < 0 || yoffset < 0 || zoffset < 0 || !validImageSize(level, width, height) || depth < 0 || imageSize < 0)\r
        {\r
                return error(GL_INVALID_VALUE);\r
@@ -7274,7 +7279,7 @@ void CompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint
                return error(validationError);\r
        }\r
 \r
-       if(width == 0 || height == 0 || depth == 0 || data == NULL)\r
+       if(width == 0 || height == 0 || depth == 0 || !data)\r
        {\r
                return;\r
        }\r
index a83533a..a95908b 100644 (file)
@@ -870,6 +870,11 @@ GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D(GLenum target, GLint level
                return error(GL_INVALID_ENUM);\r
        }\r
 \r
+       if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
+       {\r
+               return error(GL_INVALID_VALUE);\r
+       }\r
+\r
        if(xoffset < 0 || yoffset < 0 || zoffset < 0 || !validImageSize(level, width, height) || depth < 0 || imageSize < 0)\r
        {\r
                return error(GL_INVALID_VALUE);\r
@@ -881,7 +886,7 @@ GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D(GLenum target, GLint level
                return error(validationError);\r
        }\r
 \r
-       if(width == 0 || height == 0 || depth == 0 || data == NULL)\r
+       if(width == 0 || height == 0 || depth == 0 || !data)\r
        {\r
                return;\r
        }\r