[Mesa-dev] [PATCH 1/5] Mesa: Change save_attrib_data() to return boolean
Juha-Pekka Heikkilä
juhapekka.heikkila at gmail.com
Thu Dec 12 01:19:01 PST 2013
On Thu, Dec 12, 2013 at 3:14 AM, Brian Paul <brianp at vmware.com> wrote:
> On 12/11/2013 02:05 AM, Juha-Pekka Heikkila wrote:
>>
>> Change save_attrib_data() to return true/false depending on success.
>>
>> Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>
>
>
> I'd like to reconsider these changes from scratch.
>
> The basic issue is just null-checking of the malloc calls in
> glPush[Client]Attrib(). Why can't we just do something like the (partial)
> patch below?
>
The patch below is really similar to my original try at this. Ian
pointed out from my first try if save_attrib_data would fail we'd lose
"attr" thus I now have evolved the patch to the way it is. I think now
it would not in any case leak anything. The original patch for this
issue with later comments was here:
http://lists.freedesktop.org/archives/mesa-dev/2013-December/049628.html
As a small bonus using helper in glPushAttrib() make the function more
clean looking and easier to follow.
>
>
> diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c
> index 8a2a268..1ab0406 100644
> --- a/src/mesa/main/attrib.c
> +++ b/src/mesa/main/attrib.c
> @@ -195,7 +195,8 @@ save_attrib_data(struct gl_attrib_node **head,
> *head = n;
> }
> else {
> - /* out of memory! */
> + GET_CURRENT_CONTEXT(ctx);
> + _mesa_error(ctx, GL_OUT_OF_MEMORY, "glPushAttrib");
> }
> }
>
> @@ -222,6 +223,8 @@ _mesa_PushAttrib(GLbitfield mask)
> if (mask & GL_ACCUM_BUFFER_BIT) {
> struct gl_accum_attrib *attr;
> attr = MALLOC_STRUCT( gl_accum_attrib );
> + if (!attr)
> + goto out_of_memory;
> memcpy( attr, &ctx->Accum, sizeof(struct gl_accum_attrib) );
> save_attrib_data(&head, GL_ACCUM_BUFFER_BIT, attr);
> }
> @@ -230,6 +233,8 @@ _mesa_PushAttrib(GLbitfield mask)
> GLuint i;
> struct gl_colorbuffer_attrib *attr;
> attr = MALLOC_STRUCT( gl_colorbuffer_attrib );
> + if (!attr)
> + goto out_of_memory;
> memcpy( attr, &ctx->Color, sizeof(struct gl_colorbuffer_attrib) );
> /* push the Draw FBO's DrawBuffer[] state, not
> ctx->Color.DrawBuffer[] */
> for (i = 0; i < ctx->Const.MaxDrawBuffers; i ++)
> @@ -241,6 +246,8 @@ _mesa_PushAttrib(GLbitfield mask)
> struct gl_current_attrib *attr;
> FLUSH_CURRENT( ctx, 0 );
> attr = MALLOC_STRUCT( gl_current_attrib );
> + if (!attr)
> + goto out_of_memory;
> memcpy( attr, &ctx->Current, sizeof(struct gl_current_attrib) );
> save_attrib_data(&head, GL_CURRENT_BIT, attr);
> }
> @@ -420,8 +427,7 @@ _mesa_PushAttrib(GLbitfield mask)
> GLuint u, tex;
>
> if (!texstate) {
> - _mesa_error(ctx, GL_OUT_OF_MEMORY,
> "glPushAttrib(GL_TEXTURE_BIT)");
> - goto end;
> + goto out_of_memory;
> }
>
> _mesa_lock_context_textures(ctx);
> @@ -476,9 +482,16 @@ _mesa_PushAttrib(GLbitfield mask)
> save_attrib_data(&head, GL_MULTISAMPLE_BIT_ARB, attr);
> }
>
> + goto end;
> +
> +out_of_memory:
> + _mesa_error(ctx, GL_OUT_OF_MEMORY, "glPushAttrib");
> +
> end:
> - ctx->AttribStack[ctx->AttribStackDepth] = head;
> - ctx->AttribStackDepth++;
> + if (head) {
> + ctx->AttribStack[ctx->AttribStackDepth] = head;
> + ctx->AttribStackDepth++;
> + }
> }
>
>
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list