From d473ac13e7b70e8ad7a009a0f8c6d793934d03f1 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Sat, 5 Dec 2020 21:28:11 +0100 Subject: free accompanying EXIF data when freeing an image This fixes two memory bugs that only manifest with exif=1 and long-running slideshows. * when feh loads an image, it writes exif data to file->ed. Previously, this data was never free'd, causing a memory leak on subsequent loads of the same file. * As file->ed is never free'd, the accumulated EXIF data consumes a significant amount of memory over time. with slideshow-delay = 10 and two days of runtime, feh may exceed 1 GB of memory usage. If the slideshow is so large that feh does not encounter the same image twice in this time, this is not detected as a memory leak, as each EXIF data chunk is referenced from the filelist. See for details. Closes #553 --- src/imlib.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/imlib.c') diff --git a/src/imlib.c b/src/imlib.c index 4e8e790..ae9c1be 100644 --- a/src/imlib.c +++ b/src/imlib.c @@ -366,6 +366,13 @@ int feh_load_image(Imlib_Image * im, feh_file * file) file->filename = real_filename; #ifdef HAVE_LIBEXIF + /* + * if we're called from within feh_reload_image, file->ed is already + * populated. + */ + if (file->ed) { + exif_data_unref(file->ed); + } file->ed = exif_get_data(tmpname); #endif } -- cgit v1.2.3