Krolyxon
Commit 1f01c67

Branches

Refs →

nsxiv1f01c67

fix: memory leak in img_load_webp (#135)

if `multi.cap` is >0 that means `multi.frames` has already been malloc-ed. by
unconditionally malloc-ing again, we're losing all the old memory.

this makes it so we're only malloc-ing (or realloc-ing) when needed.
Author
N-R-K
Date
2021-10-26 23:41 +0600
Committer
GitHub · 2021-10-26 17:41 +0000
Parent
bbebd45
Commit
1f01c670c5fac1829e46ed8bc6b033e3680e645f

+10 −4

1 file changed

  1. M image.c +10 −4
M image.c View
@@ -380,12 +380,18 @@ bool img_load_webp(const fileinfo_t *file, Imlib_Image *fframe, img_t *img)
380380 flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS);
381381 img->w = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH);
382382 img->h = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT);
383− img->multi.cap = info.frame_count;
384− img->multi.sel = 0;
385− img->multi.frames = emalloc(info.frame_count * sizeof(img_frame_t));
383+
384+ if (img->multi.cap == 0) {
385+ img->multi.cap = info.frame_count;
386+ img->multi.frames = emalloc(img->multi.cap * sizeof(img_frame_t));
387+ } else if (info.frame_count > img->multi.cap) {
388+ img->multi.cap = info.frame_count;
389+ img->multi.frames = erealloc(img->multi.frames,
390+ img->multi.cap * sizeof(img_frame_t));
391+ }
386392
387393 /* Load and decode frames (also works on images with only 1 frame) */
388− img->multi.cnt = 0;
394+ img->multi.cnt = img->multi.sel = 0;
389395 while (WebPAnimDecoderGetNext(dec, &buf, &ts)) {
390396 im = imlib_create_image_using_copied_data(
391397 info.canvas_width, info.canvas_height, (DATA32*)buf);