[Mesa-dev] [PATCH 01/11 v2] mesa: Returns a GL_INVALID_VALUE error on several APIs when buffer size is negative

Ian Romanick idr at freedesktop.org
Fri Feb 6 04:13:02 PST 2015


Sorry for the delay...

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

On 01/21/2015 04:32 PM, Eduardo Lima Mitev wrote:
> Section 2.3.1 (Errors) of the OpenGL 4.5 spec says:
> 
>     "If a negative number is provided where an argument of type sizei or
>     sizeiptr is specified, an INVALID_VALUE error is generated.
> 
> This patch adds checks for negative buffer size values passed to different APIs.
> It also moves up the check on other APIs that already had it, making it the first
> error check performed in the function, for consistency.
> 
> While there may be other APIs throughtout the code lacking this check (or at least
> not at the beginning of the function), this patch focuses on the cases that break
> the dEQP tests listed below. It could be a good excersize for the future to check
> all other cases, and improve consistency in the order of the checks throughout the
> whole Mesa code base.
> 
> This fixes 5 dEQP test:
> * dEQP-GLES3.functional.negative_api.state.get_attached_shaders
> * dEQP-GLES3.functional.negative_api.state.get_shader_source
> * dEQP-GLES3.functional.negative_api.state.get_active_uniform
> * dEQP-GLES3.functional.negative_api.state.get_active_attrib
> * dEQP-GLES3.functional.negative_api.shader.program_binary
> ---
>  src/mesa/main/shader_query.cpp  |  5 +++++
>  src/mesa/main/shaderapi.c       | 26 ++++++++++++++++++++------
>  src/mesa/main/uniform_query.cpp | 17 +++++++++++------
>  3 files changed, 36 insertions(+), 12 deletions(-)
> 
> diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp
> index 766ad29..df9081b 100644
> --- a/src/mesa/main/shader_query.cpp
> +++ b/src/mesa/main/shader_query.cpp
> @@ -109,6 +109,11 @@ _mesa_GetActiveAttrib(GLhandleARB program, GLuint desired_index,
>     GET_CURRENT_CONTEXT(ctx);
>     struct gl_shader_program *shProg;
>  
> +   if (maxLength < 0) {
> +      _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttrib(maxLength < 0)");
> +      return;
> +   }
> +
>     shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveAttrib");
>     if (!shProg)
>        return;
> diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
> index 118e8a7..52eab46 100644
> --- a/src/mesa/main/shaderapi.c
> +++ b/src/mesa/main/shaderapi.c
> @@ -448,8 +448,16 @@ static void
>  get_attached_shaders(struct gl_context *ctx, GLuint program, GLsizei maxCount,
>                       GLsizei *count, GLuint *obj)
>  {
> -   struct gl_shader_program *shProg =
> +   struct gl_shader_program *shProg;
> +
> +   if (maxCount < 0) {
> +      _mesa_error(ctx, GL_INVALID_VALUE, "glGetAttachedShaders(maxCount < 0)");
> +      return;
> +   }
> +
> +   shProg =
>        _mesa_lookup_shader_program_err(ctx, program, "glGetAttachedShaders");
> +
>     if (shProg) {
>        GLuint i;
>        for (i = 0; i < (GLuint) maxCount && i < shProg->NumShaders; i++) {
> @@ -786,6 +794,12 @@ get_shader_source(struct gl_context *ctx, GLuint shader, GLsizei maxLength,
>                    GLsizei *length, GLchar *sourceOut)
>  {
>     struct gl_shader *sh;
> +
> +   if (maxLength < 0) {
> +      _mesa_error(ctx, GL_INVALID_VALUE, "glGetShaderSource(bufSize < 0)");
> +      return;
> +   }
> +
>     sh = _mesa_lookup_shader_err(ctx, shader, "glGetShaderSource");
>     if (!sh) {
>        return;
> @@ -1683,6 +1697,11 @@ _mesa_GetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length,
>     GLsizei length_dummy;
>     GET_CURRENT_CONTEXT(ctx);
>  
> +   if (bufSize < 0){
> +      _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramBinary(bufSize < 0)");
> +      return;
> +   }
> +
>     shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetProgramBinary");
>     if (!shProg)
>        return;
> @@ -1712,11 +1731,6 @@ _mesa_GetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length,
>        return;
>     }
>  
> -   if (bufSize < 0){
> -      _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramBinary(bufSize < 0)");
> -      return;
> -   }
> -
>     *length = 0;
>     _mesa_error(ctx, GL_INVALID_OPERATION,
>                 "glGetProgramBinary(driver supports zero binary formats)");
> diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
> index 32870d0..d36f506 100644
> --- a/src/mesa/main/uniform_query.cpp
> +++ b/src/mesa/main/uniform_query.cpp
> @@ -45,9 +45,14 @@ _mesa_GetActiveUniform(GLuint program, GLuint index,
>                         GLenum *type, GLcharARB *nameOut)
>  {
>     GET_CURRENT_CONTEXT(ctx);
> -   struct gl_shader_program *shProg =
> -      _mesa_lookup_shader_program_err(ctx, program, "glGetActiveUniform");
> +   struct gl_shader_program *shProg;
>  
> +   if (maxLength < 0) {
> +      _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniform(maxLength < 0)");
> +      return;
> +   }
> +
> +   shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveUniform");
>     if (!shProg)
>        return;
>  
> @@ -85,16 +90,16 @@ _mesa_GetActiveUniformsiv(GLuint program,
>     struct gl_shader_program *shProg;
>     GLsizei i;
>  
> -   shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveUniform");
> -   if (!shProg)
> -      return;
> -
>     if (uniformCount < 0) {
>        _mesa_error(ctx, GL_INVALID_VALUE,
>  		  "glGetActiveUniformsiv(uniformCount < 0)");
>        return;
>     }
>  
> +   shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveUniform");
> +   if (!shProg)
> +      return;
> +
>     for (i = 0; i < uniformCount; i++) {
>        GLuint index = uniformIndices[i];
>  
> 



More information about the mesa-dev mailing list