From d54665c64bfddcb9825721a7254cfcbfec0edcd2 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Tue, 28 Feb 2017 18:38:04 +0100 Subject: tracker-extract: Avoid allocating full image in memory at once Just read it line by line reusing the same buffer, it will still let us to fetch metadata at the end of the file. https://bugzilla.gnome.org/show_bug.cgi?id=778090 --- src/tracker-extract/tracker-extract-png.c | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/tracker-extract/tracker-extract-png.c b/src/tracker-extract/tracker-extract-png.c index fcfd5f40e..0e1976541 100644 --- a/src/tracker-extract/tracker-extract-png.c +++ b/src/tracker-extract/tracker-extract-png.c @@ -621,7 +621,7 @@ tracker_extract_get_metadata (TrackerExtractInfo *info) png_structp png_ptr; png_infop info_ptr; png_infop end_ptr; - png_bytepp row_pointers; + png_bytep row_data; guint row; png_uint_32 width, height; gint bit_depth, color_type; @@ -694,20 +694,10 @@ tracker_extract_get_metadata (TrackerExtractInfo *info) /* Read the image. FIXME We should be able to skip this step and * just get the info from the end. This causes some errors atm. */ - row_pointers = g_new0 (png_bytep, height); - - for (row = 0; row < height; row++) { - row_pointers[row] = png_malloc (png_ptr, - png_get_rowbytes (png_ptr,info_ptr)); - } - - png_read_image (png_ptr, row_pointers); - - for (row = 0; row < height; row++) { - png_free (png_ptr, row_pointers[row]); - } - - g_free (row_pointers); + row_data = png_malloc (png_ptr, png_get_rowbytes (png_ptr, info_ptr)); + for (row = 0; row < height; row++) + png_read_row (png_ptr, row_data, NULL); + png_free (png_ptr, row_data); png_read_end (png_ptr, end_ptr); -- cgit v1.2.1