From b458226e162fe1ffe7acb4230c114a52ada5131b Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Sat, 5 May 2018 12:01:24 +0200 Subject: gxps-archive: Ensure gxps_archive_read_entry() fills the GError in case of failure And fix the callers to not overwrite the GError. diff --git a/libgxps/gxps-archive.c b/libgxps/gxps-archive.c index e763773..346ba73 100644 --- a/libgxps/gxps-archive.c +++ b/libgxps/gxps-archive.c @@ -406,9 +406,13 @@ gxps_archive_read_entry (GXPSArchive *archive, gboolean retval; stream = gxps_archive_open (archive, path); - if (!stream) - /* TODO: Error */ + if (!stream) { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_NOT_FOUND, + "The entry '%s' was not found in archive", path); return FALSE; + } entry_size = archive_entry_size (GXPS_ARCHIVE_INPUT_STREAM (stream)->entry); if (entry_size <= 0) { @@ -423,7 +427,7 @@ gxps_archive_read_entry (GXPSArchive *archive, *buffer = g_malloc (buffer_size); do { bytes = g_input_stream_read (stream, &buf, BUFFER_SIZE, NULL, error); - if (*error != NULL) { + if (bytes < 0) { g_free (*buffer); g_object_unref (stream); @@ -441,7 +445,10 @@ gxps_archive_read_entry (GXPSArchive *archive, g_object_unref (stream); if (*bytes_read == 0) { - /* TODO: Error */ + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "The entry '%s' is empty in archive", path); g_free (*buffer); return FALSE; } diff --git a/libgxps/gxps-fonts.c b/libgxps/gxps-fonts.c index 882157d..8d02ffc 100644 --- a/libgxps/gxps-fonts.c +++ b/libgxps/gxps-fonts.c @@ -220,19 +220,12 @@ gxps_fonts_new_font_face (GXPSArchive *zip, cairo_font_face_t *font_face; guchar *font_data; gsize font_data_len; - gboolean res; - res = gxps_archive_read_entry (zip, font_uri, - &font_data, &font_data_len, - error); - if (!res) { - g_set_error (error, - GXPS_ERROR, - GXPS_ERROR_SOURCE_NOT_FOUND, - "Font source %s not found in archive", - font_uri); - return NULL; - } + if (!gxps_archive_read_entry (zip, font_uri, + &font_data, &font_data_len, + error)) { + return NULL; + } ft_face.font_data = font_data; ft_face.font_data_len = (gssize)font_data_len; diff --git a/libgxps/gxps-images.c b/libgxps/gxps-images.c index 4dcf9e2..50f899f 100644 --- a/libgxps/gxps-images.c +++ b/libgxps/gxps-images.c @@ -742,17 +742,12 @@ gxps_images_create_from_tiff (GXPSArchive *zip, guchar *data; guchar *p; - if (!gxps_archive_read_entry (zip, image_uri, - &buffer.buffer, - &buffer.buffer_len, - error)) { - g_set_error (error, - GXPS_ERROR, - GXPS_ERROR_SOURCE_NOT_FOUND, - "Image source %s not found in archive", - image_uri); - return NULL; - } + if (!gxps_archive_read_entry (zip, image_uri, + &buffer.buffer, + &buffer.buffer_len, + error)) { + return NULL; + } buffer.pos = 0;