[gthumb] make sure to read the requested amount of data from the stream



commit e99f14f9a353acaf12a3904e7b9cfc3cf606af95
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Sun Mar 1 21:15:15 2020 +0100

    make sure to read the requested amount of data from the stream

 extensions/cairo_io/cairo-image-surface-webp.c     | 17 +++++++++------
 extensions/cairo_io/cairo-image-surface-xcf.c      | 24 ++++++++++++++++++----
 extensions/catalogs/gth-catalog.c                  | 15 +++++++++-----
 .../image_viewer/gth-metadata-provider-image.c     | 19 ++++++++++-------
 extensions/jpeg_utils/jpeg-info.c                  | 19 +++++++++++------
 gthumb/glib-utils.c                                | 16 ++++++++-------
 6 files changed, 75 insertions(+), 35 deletions(-)
---
diff --git a/extensions/cairo_io/cairo-image-surface-webp.c b/extensions/cairo_io/cairo-image-surface-webp.c
index b4a4d93c..e0976659 100644
--- a/extensions/cairo_io/cairo-image-surface-webp.c
+++ b/extensions/cairo_io/cairo-image-surface-webp.c
@@ -43,7 +43,7 @@ _cairo_image_surface_create_from_webp (GInputStream  *istream,
        GthImage                  *image;
        WebPDecoderConfig          config;
        guchar                    *buffer;
-       gssize                     bytes_read;
+       gsize                      bytes_read;
        int                        width, height;
        cairo_surface_t           *surface;
        cairo_surface_metadata_t  *metadata;
@@ -55,11 +55,16 @@ _cairo_image_surface_create_from_webp (GInputStream  *istream,
                return image;
 
        buffer = g_new (guchar, BUFFER_SIZE);
-       bytes_read = g_input_stream_read (istream,
-                                         buffer,
-                                         BUFFER_SIZE,
-                                         cancellable,
-                                         error);
+       if (! g_input_stream_read_all (istream,
+                                      buffer,
+                                      BUFFER_SIZE,
+                                      &bytes_read,
+                                      cancellable,
+                                      error))
+       {
+               g_free (buffer);
+               return image;
+       }
 
        if (WebPGetFeatures (buffer, bytes_read, &config.input) != VP8_STATUS_OK) {
                g_free (buffer);
diff --git a/extensions/cairo_io/cairo-image-surface-xcf.c b/extensions/cairo_io/cairo-image-surface-xcf.c
index f200f3dc..0a6940dc 100644
--- a/extensions/cairo_io/cairo-image-surface-xcf.c
+++ b/extensions/cairo_io/cairo-image-surface-xcf.c
@@ -132,12 +132,22 @@ _g_data_input_stream_read_c_string (GDataInputStream  *stream,
                                    GError           **error)
 {
        char *string;
+       gsize bytes_read;
 
        g_return_val_if_fail (size > 0, NULL);
 
        string = g_new (char, size + 1);
-       g_input_stream_read (G_INPUT_STREAM (stream), string, size, cancellable, error);
-       string[size] = 0;
+       if (g_input_stream_read_all (G_INPUT_STREAM (stream),
+                                    string,
+                                    size,
+                                    &bytes_read,
+                                    cancellable,
+                                    error))
+       {
+               string[bytes_read] = 0;
+       }
+       else
+               string[0] = 0;
 
        return string;
 }
@@ -727,9 +737,15 @@ read_pixels_from_hierarchy (GDataInputStream  *data_stream,
                        if (tile_data_size <= 0)
                                continue;
 
-                       data_read = g_input_stream_read (G_INPUT_STREAM (data_stream), tile_data, 
tile_data_size, cancellable, error);
-                       if (*error != NULL)
+                       if (! g_input_stream_read_all (G_INPUT_STREAM (data_stream),
+                                                      tile_data,
+                                                      tile_data_size,
+                                                      &data_read,
+                                                      cancellable,
+                                                      error))
+                       {
                                goto rle_error;
+                       }
 
                        /* decompress the channel streams */
 
diff --git a/extensions/catalogs/gth-catalog.c b/extensions/catalogs/gth-catalog.c
index ff310187..bccc6131 100644
--- a/extensions/catalogs/gth-catalog.c
+++ b/extensions/catalogs/gth-catalog.c
@@ -883,13 +883,18 @@ gth_catalog_update_standard_attributes (GFile     *file,
                        gio_file = gth_catalog_file_to_gio_file (file);
                        istream = g_file_read (gio_file, NULL, NULL);
                        if (istream != NULL) {
-                               gssize n;
-
-                               n = g_input_stream_read (G_INPUT_STREAM (istream), buffer, buffer_size - 1, 
NULL, NULL);
-                               if (n > 0) {
+                               gsize bytes_read;
+
+                               if (g_input_stream_read_all (G_INPUT_STREAM (istream),
+                                                            buffer,
+                                                            buffer_size - 1,
+                                                            &bytes_read,
+                                                            NULL,
+                                                            NULL))
+                               {
                                        char *exif_date;
 
-                                       buffer[n] = '\0';
+                                       buffer[bytes_read] = '\0';
                                        name = get_tag_value (buffer, "<name>", "</name>");
                                        exif_date = get_tag_value (buffer, "<date>", "</date>");
                                        if (exif_date != NULL)
diff --git a/extensions/image_viewer/gth-metadata-provider-image.c 
b/extensions/image_viewer/gth-metadata-provider-image.c
index e45fcdac..e0aa644e 100644
--- a/extensions/image_viewer/gth-metadata-provider-image.c
+++ b/extensions/image_viewer/gth-metadata-provider-image.c
@@ -74,16 +74,21 @@ gth_metadata_provider_image_read (GthMetadataProvider *self,
        if (stream != NULL) {
                int     buffer_size;
                guchar *buffer;
-               gssize  size;
+               gsize   size;
 
                buffer_size = BUFFER_SIZE;
                buffer = g_new (guchar, buffer_size);
-               size = g_input_stream_read (G_INPUT_STREAM (stream),
-                                           buffer,
-                                           buffer_size,
-                                           cancellable,
-                                           NULL);
-               if (size >= 0) {
+               if (! g_input_stream_read_all (G_INPUT_STREAM (stream),
+                                              buffer,
+                                              buffer_size,
+                                              &size,
+                                              cancellable,
+                                              NULL))
+               {
+                       size = 0;
+               }
+
+               if (size > 0) {
                        if ((size >= 24)
 
                            /* PNG signature */
diff --git a/extensions/jpeg_utils/jpeg-info.c b/extensions/jpeg_utils/jpeg-info.c
index d4f2d441..d51d908c 100644
--- a/extensions/jpeg_utils/jpeg-info.c
+++ b/extensions/jpeg_utils/jpeg-info.c
@@ -445,11 +445,12 @@ _jpeg_info_get_from_stream (GInputStream   *stream,
                        app1_segment_size = (h << 8) + l - 2;
 
                        app1_segment = g_new (guchar, app1_segment_size);
-                       if (g_input_stream_read (stream,
-                                                app1_segment,
-                                                app1_segment_size,
-                                                cancellable,
-                                                error) > 0)
+                       if (g_input_stream_read_all (stream,
+                                                    app1_segment,
+                                                    app1_segment_size,
+                                                    NULL,
+                                                    cancellable,
+                                                    error))
                        {
                                _jpeg_exif_tags_from_app1_segment (app1_segment, app1_segment_size, flags, 
data);
                        }
@@ -471,7 +472,13 @@ _jpeg_info_get_from_stream (GInputStream    *stream,
                        app2_segment_size = (h << 8) + l - 2;
 
                        app2_segment = g_new (guchar, app2_segment_size);
-                       if (g_input_stream_read (stream, app2_segment, app2_segment_size, cancellable, error) 
0) {
+                       if (g_input_stream_read_all (stream,
+                                                    app2_segment,
+                                                    app2_segment_size,
+                                                    NULL,
+                                                    cancellable,
+                                                    error))
+                       {
                                ICCProfileChunk *chunk;
 
                                chunk = _jpeg_get_icc_profile_chunk_from_app2_segment (app2_segment, 
app2_segment_size);
diff --git a/gthumb/glib-utils.c b/gthumb/glib-utils.c
index e94efb83..6dbbcd4d 100644
--- a/gthumb/glib-utils.c
+++ b/gthumb/glib-utils.c
@@ -1798,17 +1798,19 @@ _g_content_type_get_from_stream (GInputStream  *istream,
                                 GError       **error)
 {
        guchar      buffer[BUFFER_SIZE_FOR_SNIFFING];
-       gssize      n = 0;
+       gsize       n = 0;
        gboolean    result_uncertain = FALSE;
        const char *content_type;
 
-       n = g_input_stream_read (istream,
-                                buffer,
-                                BUFFER_SIZE_FOR_SNIFFING,
-                                cancellable,
-                                error);
-       if (n < 0)
+       if (! g_input_stream_read_all (istream,
+                                      buffer,
+                                      BUFFER_SIZE_FOR_SNIFFING,
+                                      &n,
+                                      cancellable,
+                                      error))
+       {
                return NULL;
+       }
 
        content_type = get_mime_type_from_magic_numbers (buffer, n);
        if (content_type == NULL)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]