]> granicus.if.org Git - libass/commitdiff
Fix memory leak in render_overlap
authorGrigori Goronzy <greg@blackbox>
Sat, 27 Jun 2009 13:20:28 +0000 (15:20 +0200)
committerGrigori Goronzy <greg@blackbox>
Sat, 27 Jun 2009 14:31:36 +0000 (16:31 +0200)
render_overlap allocated memory for its hashmap key and values on the
heap, relying on the cache cleanup to free them.  However, these
pointers are not directly inserted into the cache, but memcpy()'ed in
hashmap_insert, leading to a pretty bad memory leak.
Allocate the key and value on the stack instead to fix this problem.

libass/ass_render.c

index 6662e5137c74986500b234700fe24e394259997d..451c1d718c65166c0dd43dbb58e2e9eaa846002d 100644 (file)
@@ -465,7 +465,7 @@ render_overlap(ass_renderer_t *render_priv, ass_image_t **last_tail,
     char m;
     composite_hash_key_t hk;
     composite_hash_val_t *hv;
-    composite_hash_key_t *nhk;
+    composite_hash_val_t chv;
     int ax = (*last_tail)->dst_x;
     int ay = (*last_tail)->dst_y;
     int aw = (*last_tail)->w;
@@ -536,12 +536,9 @@ render_overlap(ass_renderer_t *render_priv, ass_image_t **last_tail,
         }
 
     // Insert bitmaps into the cache
-    nhk = calloc(1, sizeof(*nhk));
-    memcpy(nhk, &hk, sizeof(*nhk));
-    hv = calloc(1, sizeof(*hv));
-    hv->a = (*last_tail)->bitmap;
-    hv->b = (*tail)->bitmap;
-    cache_add_composite(render_priv->cache.composite_cache, nhk, hv);
+    chv.a = (*last_tail)->bitmap;
+    chv.b = (*tail)->bitmap;
+    cache_add_composite(render_priv->cache.composite_cache, &hk, &chv);
 }
 
 /**