mesa: fix mem leak of glPixelMap data in display list
authorBrian Paul <brianp@vmware.com>
Fri, 29 Nov 2013 13:40:35 +0000 (06:40 -0700)
committerBrian Paul <brianp@vmware.com>
Fri, 29 Nov 2013 13:41:14 +0000 (06:41 -0700)
And simplify save_PixelMapfv() by using the memdup() function.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/mesa/main/dlist.c

index 83c56a7e7286577b35f8c0eb8b82d9cd81e6739c..7f4ad17154be9c1ae181f2ef9c271c191db2b300 100644 (file)
@@ -719,6 +719,9 @@ _mesa_delete_list(struct gl_context *ctx, struct gl_display_list *dlist)
             free(n[4].data);
             n += InstSize[n[0].opcode];
             break;
+         case OPCODE_PIXEL_MAP:
+            free(n[3].data);
+            break;
 
          case OPCODE_CONTINUE:
             n = (Node *) n[1].next;
@@ -897,6 +900,18 @@ unpack_image(struct gl_context *ctx, GLuint dimensions,
    return NULL;
 }
 
+
+/** Return copy of memory */
+static void *
+memdup(const void *src, GLsizei bytes)
+{
+   void *b = bytes >= 0 ? malloc(bytes) : NULL;
+   if (b)
+      memcpy(b, src, bytes);
+   return b;
+}
+
+
 /**
  * Allocate space for a display list instruction (opcode + payload space).
  * \param opcode  the instruction opcode (OPCODE_* value)
@@ -2781,8 +2796,7 @@ save_PixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
    if (n) {
       n[1].e = map;
       n[2].i = mapsize;
-      n[3].data = malloc(mapsize * sizeof(GLfloat));
-      memcpy(n[3].data, (void *) values, mapsize * sizeof(GLfloat));
+      n[3].data = memdup(values, mapsize * sizeof(GLfloat));
    }
    if (ctx->ExecuteFlag) {
       CALL_PixelMapfv(ctx->Exec, (map, mapsize, values));
@@ -5873,17 +5887,6 @@ save_Uniform4fARB(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
 }
 
 
-/** Return copy of memory */
-static void *
-memdup(const void *src, GLsizei bytes)
-{
-   void *b = bytes >= 0 ? malloc(bytes) : NULL;
-   if (b)
-      memcpy(b, src, bytes);
-   return b;
-}
-
-
 static void GLAPIENTRY
 save_Uniform1fvARB(GLint location, GLsizei count, const GLfloat *v)
 {