[gthumb] make sure to read the requested amount of data from the stream
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] make sure to read the requested amount of data from the stream
- Date: Sun, 1 Mar 2020 20:19:16 +0000 (UTC)
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]