[gimp] plug-ins: make various usage of g_file_replace() safer.
- From: Jehan <jehanp src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] plug-ins: make various usage of g_file_replace() safer.
- Date: Tue, 27 Nov 2018 11:43:56 +0000 (UTC)
commit 66ec467217572efb8549bdd6b02fa231861da4b6
Author: Jehan <jehan girinstud io>
Date: Tue Nov 27 12:27:20 2018 +0100
plug-ins: make various usage of g_file_replace() safer.
As I did on app/, finalizing an output stream also implicitly flushes
and closes it. Hence if an export ended with an error, we'd end up with
incomplete data file (possibly overwriting a previously exported image).
Only 2 plug-ins I haven't fixed yet are file-tiff-io and file-gif-save.
The later one don't even clean up its memory (which somehow is good here
as at least the output stream is never finalized hence sane files are
not overwritten in case of errors). As for the former (TIFF plug-in), it
doesn't even seem to have any error control AFAICS, apart from printing
error messages on standard error output.
plug-ins/common/file-cel.c | 6 ++++++
plug-ins/common/file-csource.c | 6 ++++++
plug-ins/common/file-gbr.c | 18 ++++++++++++++++++
plug-ins/common/file-gih.c | 12 ++++++++++++
plug-ins/common/file-header.c | 6 ++++++
plug-ins/common/file-heif.c | 6 ++++++
plug-ins/common/file-html-table.c | 6 ++++++
plug-ins/common/file-pat.c | 18 ++++++++++++++++++
plug-ins/common/file-pix.c | 11 +++++++++++
plug-ins/common/file-pnm.c | 9 +++++++++
plug-ins/common/file-ps.c | 6 ++++++
plug-ins/common/file-xbm.c | 6 ++++++
plug-ins/common/file-xwd.c | 9 +++++++++
13 files changed, 119 insertions(+)
---
diff --git a/plug-ins/common/file-cel.c b/plug-ins/common/file-cel.c
index feaf8a4bc3..bee697e870 100644
--- a/plug-ins/common/file-cel.c
+++ b/plug-ins/common/file-cel.c
@@ -753,6 +753,7 @@ save_image (GFile *file,
GOutputStream *output;
GeglBuffer *buffer;
const Babl *format;
+ GCancellable *cancellable;
gint width;
gint height;
guchar header[32]; /* File header */
@@ -924,6 +925,11 @@ save_image (GFile *file,
fail:
+ cancellable = g_cancellable_new ();
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+ g_object_unref (cancellable);
+
g_free (buf);
g_free (line);
g_object_unref (buffer);
diff --git a/plug-ins/common/file-csource.c b/plug-ins/common/file-csource.c
index c36c094514..c69e90710d 100644
--- a/plug-ins/common/file-csource.c
+++ b/plug-ins/common/file-csource.c
@@ -455,6 +455,7 @@ save_image (GFile *file,
{
GOutputStream *output;
GeglBuffer *buffer;
+ GCancellable *cancellable;
GimpImageType drawable_type = gimp_drawable_type (drawable_ID);
gchar *s_uint_8, *s_uint, *s_char, *s_null;
guint c;
@@ -850,6 +851,11 @@ save_image (GFile *file,
fail:
+ cancellable = g_cancellable_new ();
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+ g_object_unref (cancellable);
+
g_object_unref (output);
g_object_unref (buffer);
diff --git a/plug-ins/common/file-gbr.c b/plug-ins/common/file-gbr.c
index 3f234d504b..d104185be2 100644
--- a/plug-ins/common/file-gbr.c
+++ b/plug-ins/common/file-gbr.c
@@ -734,6 +734,12 @@ save_image (GFile *file,
if (! g_output_stream_write_all (output, &bh, sizeof (GimpBrushHeader),
NULL, NULL, error))
{
+ GCancellable *cancellable = g_cancellable_new ();
+
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+ g_object_unref (cancellable);
+
g_object_unref (output);
return FALSE;
}
@@ -743,6 +749,12 @@ save_image (GFile *file,
strlen (info.description) + 1,
NULL, NULL, error))
{
+ GCancellable *cancellable = g_cancellable_new ();
+
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+ g_object_unref (cancellable);
+
g_object_unref (output);
return FALSE;
}
@@ -783,6 +795,12 @@ save_image (GFile *file,
if (! g_output_stream_write_all (output, brush_buf, width * file_bpp,
NULL, NULL, error))
{
+ GCancellable *cancellable = g_cancellable_new ();
+
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+ g_object_unref (cancellable);
+
g_free (brush_buf);
g_object_unref (output);
return FALSE;
diff --git a/plug-ins/common/file-gih.c b/plug-ins/common/file-gih.c
index 9f6917af90..650cd64299 100644
--- a/plug-ins/common/file-gih.c
+++ b/plug-ins/common/file-gih.c
@@ -1323,6 +1323,12 @@ gih_save_image (GFile *file,
if (! g_output_stream_write_all (output, header, strlen (header),
NULL, NULL, error))
{
+ GCancellable *cancellable = g_cancellable_new ();
+
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+ g_object_unref (cancellable);
+
g_free (parstring);
g_free (header);
g_object_unref (output);
@@ -1389,6 +1395,12 @@ gih_save_image (GFile *file,
thisw, thish),
name, error))
{
+ GCancellable *cancellable = g_cancellable_new ();
+
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+ g_object_unref (cancellable);
+
g_object_unref (output);
return FALSE;
}
diff --git a/plug-ins/common/file-header.c b/plug-ins/common/file-header.c
index dfaa9bd2e0..6b2b4640f5 100644
--- a/plug-ins/common/file-header.c
+++ b/plug-ins/common/file-header.c
@@ -185,6 +185,7 @@ save_image (GFile *file,
guchar *d = NULL;
guchar *data = NULL;
guchar *cmap;
+ GCancellable *cancellable;
gint colors;
gint width;
gint height;
@@ -408,9 +409,14 @@ save_image (GFile *file,
fail:
+ cancellable = g_cancellable_new ();
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+
g_free (data);
g_object_unref (output);
g_object_unref (buffer);
+ g_object_unref (cancellable);
return FALSE;
}
diff --git a/plug-ins/common/file-heif.c b/plug-ins/common/file-heif.c
index 6c7b648821..5ac2f9e566 100644
--- a/plug-ins/common/file-heif.c
+++ b/plug-ins/common/file-heif.c
@@ -708,6 +708,12 @@ save_image (GFile *file,
if (err.code != 0)
{
+ GCancellable *cancellable = g_cancellable_new ();
+
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+ g_object_unref (cancellable);
+
g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
_("Writing HEIF image failed: %s"),
err.message);
diff --git a/plug-ins/common/file-html-table.c b/plug-ins/common/file-html-table.c
index fff22ca438..b37a59c210 100644
--- a/plug-ins/common/file-html-table.c
+++ b/plug-ins/common/file-html-table.c
@@ -221,6 +221,7 @@ save_image (GFile *file,
{
const Babl *format = babl_format ("R'G'B'A u8");
GeglSampler *sampler;
+ GCancellable *cancellable;
GOutputStream *output;
gint row, col;
gint cols, rows;
@@ -438,6 +439,11 @@ save_image (GFile *file,
fail:
+ cancellable = g_cancellable_new ();
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+ g_object_unref (cancellable);
+
g_object_unref (output);
g_object_unref (sampler);
g_free (width);
diff --git a/plug-ins/common/file-pat.c b/plug-ins/common/file-pat.c
index 8ba8566a0a..c1b832de62 100644
--- a/plug-ins/common/file-pat.c
+++ b/plug-ins/common/file-pat.c
@@ -573,6 +573,12 @@ save_image (GFile *file,
if (! g_output_stream_write_all (output, &ph, sizeof (GimpPatternHeader),
NULL, NULL, error))
{
+ GCancellable *cancellable = g_cancellable_new ();
+
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+ g_object_unref (cancellable);
+
g_object_unref (output);
return FALSE;
}
@@ -581,6 +587,12 @@ save_image (GFile *file,
description, strlen (description) + 1,
NULL, NULL, error))
{
+ GCancellable *cancellable = g_cancellable_new ();
+
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+ g_object_unref (cancellable);
+
g_object_unref (output);
return FALSE;
}
@@ -599,6 +611,12 @@ save_image (GFile *file,
if (! g_output_stream_write_all (output, buf, line_size,
NULL, NULL, error))
{
+ GCancellable *cancellable = g_cancellable_new ();
+
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+ g_object_unref (cancellable);
+
g_object_unref (buffer);
g_object_unref (output);
return FALSE;
diff --git a/plug-ins/common/file-pix.c b/plug-ins/common/file-pix.c
index ee518ee6a6..751a5a73be 100644
--- a/plug-ins/common/file-pix.c
+++ b/plug-ins/common/file-pix.c
@@ -527,6 +527,7 @@ save_image (GFile *file,
GOutputStream *output;
GeglBuffer *buffer;
const Babl *format;
+ GCancellable *cancellable;
gint width;
gint height;
gint depth, i, j, row, tile_height, rectHeight;
@@ -567,6 +568,11 @@ save_image (GFile *file,
! put_short (output, 0, error) ||
! put_short (output, 0, error))
{
+ cancellable = g_cancellable_new ();
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+ g_object_unref (cancellable);
+
g_object_unref (output);
g_object_unref (buffer);
return FALSE;
@@ -717,6 +723,11 @@ save_image (GFile *file,
fail:
+ cancellable = g_cancellable_new ();
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+ g_object_unref (cancellable);
+
g_free (src_base);
g_object_unref (output);
g_object_unref (buffer);
diff --git a/plug-ins/common/file-pnm.c b/plug-ins/common/file-pnm.c
index 2d52414f48..00b06ef7eb 100644
--- a/plug-ins/common/file-pnm.c
+++ b/plug-ins/common/file-pnm.c
@@ -1586,6 +1586,15 @@ save_image (GFile *file,
status = TRUE;
out:
+ if (! status)
+ {
+ GCancellable *cancellable = g_cancellable_new ();
+
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+ g_object_unref (cancellable);
+ }
+
if (comment)
g_free (comment);
if (buffer)
diff --git a/plug-ins/common/file-ps.c b/plug-ins/common/file-ps.c
index ca42c273df..68a99eb61c 100644
--- a/plug-ins/common/file-ps.c
+++ b/plug-ins/common/file-ps.c
@@ -1207,6 +1207,7 @@ save_image (GFile *file,
GError **error)
{
GOutputStream *output;
+ GCancellable *cancellable;
GimpImageType drawable_type;
drawable_type = gimp_drawable_type (drawable_ID);
@@ -1289,7 +1290,12 @@ save_image (GFile *file,
fail:
+ cancellable = g_cancellable_new ();
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+
g_object_unref (output);
+ g_object_unref (cancellable);
return FALSE;
}
diff --git a/plug-ins/common/file-xbm.c b/plug-ins/common/file-xbm.c
index c2a1d5df15..f10ee8eb18 100644
--- a/plug-ins/common/file-xbm.c
+++ b/plug-ins/common/file-xbm.c
@@ -979,6 +979,7 @@ save_image (GFile *file,
{
GOutputStream *output;
GeglBuffer *buffer;
+ GCancellable *cancellable;
gint width, height, colors, dark;
gint intbits, lineints, need_comma, nints, rowoffset, tileheight;
gint c, i, j, k, thisbit;
@@ -1221,6 +1222,11 @@ save_image (GFile *file,
fail:
+ cancellable = g_cancellable_new ();
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+ g_object_unref (cancellable);
+
g_free (data);
g_object_unref (buffer);
g_object_unref (output);
diff --git a/plug-ins/common/file-xwd.c b/plug-ins/common/file-xwd.c
index 6e0f8cdfa9..20943c94f3 100644
--- a/plug-ins/common/file-xwd.c
+++ b/plug-ins/common/file-xwd.c
@@ -687,6 +687,15 @@ save_image (GFile *file,
gimp_file_get_utf8_name (file));
success = FALSE;
}
+ else if (! success)
+ {
+ GCancellable *cancellable;
+
+ cancellable = g_cancellable_new ();
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+ g_object_unref (cancellable);
+ }
g_object_unref (output);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]