[Mesa-dev] [PATCH v2] mesa: Deal with size differences between GLuint and GLhandleARB in GetAttachedObjectsARB

Ian Romanick idr at freedesktop.org
Fri Jan 22 11:05:49 PST 2016


Please revert the version of this patch that has already landed.

On 01/21/2016 08:48 AM, Jeremy Huddleston Sequoia wrote:
> Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
> CC: Nicolai Hähnle <nhaehnle at gmail.com>
> CC: Matt Turner <mattst88 at gmail.com>
> ---
>  src/mesa/main/shaderapi.c | 18 +++++++++++++++++-
>  1 file changed, 17 insertions(+), 1 deletion(-)
> 
> diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
> index a988f41..7a0d19a 100644
> --- a/src/mesa/main/shaderapi.c
> +++ b/src/mesa/main/shaderapi.c
> @@ -1374,10 +1374,26 @@ _mesa_DetachShader(GLuint program, GLuint shader)
>  
>  void GLAPIENTRY
>  _mesa_GetAttachedObjectsARB(GLhandleARB container, GLsizei maxCount,
> -                            GLsizei * count, GLhandleARB * obj)
> +                            GLsizei * count, GLhandleARB * objARB)
>  {
> +   int i;
> +   GLuint *obj;
> +
>     GET_CURRENT_CONTEXT(ctx);
> +
> +   obj = calloc(maxCount, sizeof(GLuint));

calloc is allowed to return NULL when passed 0.  glGetAttachedObjectsARB
is not supposed to generate an error in that condition.

If passed a negative value, glGetAttachedObjectsARB is supposed to
generate GL_INVALID_VALUE.  In this case, since calloc will treat the
negative value as a very large positive value, it will generate
GL_OUT_OF_MEMORY.

> +   if (!obj) {
> +      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
> +      return;
> +   }
> +
>     get_attached_shaders(ctx, container, maxCount, count, obj);
> +
> +   for (i = 0 ; i < *count; i++) {

count can be NULL, so this is completely bogus.

I will submit piglit tests for all three issues.

In addition to the bugs, this patch adds almost as much code to
_mesa_GetAttachedObjectsARB as just open-coding get_attached_shaders
would.  If we have to do anything, I feel like that's a much better option.

> +      objARB[i] = (GLhandleARB)obj[i];
> +   }
> +
> +   free(obj);
>  }
>  
>  



More information about the mesa-dev mailing list