aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorN-R-K <79544946+N-R-K@users.noreply.github.com>2021-10-26 19:41:11 +0200
committerGitHub <noreply@github.com>2021-10-26 19:41:11 +0200
commit1f01c670c5fac1829e46ed8bc6b033e3680e645f (patch)
tree43b40a97eb1f0779f8ea54ada1eac22604fc9947
parentbbebd45ce614fc0297ed53bcda04a49a0cb292b6 (diff)
downloadnsxiv-1f01c670c5fac1829e46ed8bc6b033e3680e645f.tar.zst
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.
-rw-r--r--image.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/image.c b/image.c
index 062f7ad..4440497 100644
--- a/image.c
+++ b/image.c
@@ -380,12 +380,18 @@ bool img_load_webp(const fileinfo_t *file, Imlib_Image *fframe, img_t *img)
flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS);
img->w = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH);
img->h = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT);
- img->multi.cap = info.frame_count;
- img->multi.sel = 0;
- img->multi.frames = emalloc(info.frame_count * sizeof(img_frame_t));
+
+ if (img->multi.cap == 0) {
+ img->multi.cap = info.frame_count;
+ img->multi.frames = emalloc(img->multi.cap * sizeof(img_frame_t));
+ } else if (info.frame_count > img->multi.cap) {
+ img->multi.cap = info.frame_count;
+ img->multi.frames = erealloc(img->multi.frames,
+ img->multi.cap * sizeof(img_frame_t));
+ }
/* Load and decode frames (also works on images with only 1 frame) */
- img->multi.cnt = 0;
+ img->multi.cnt = img->multi.sel = 0;
while (WebPAnimDecoderGetNext(dec, &buf, &ts)) {
im = imlib_create_image_using_copied_data(
info.canvas_width, info.canvas_height, (DATA32*)buf);