[gimp] app: fix crash when opening several times an export plug-in.
- From: Jehan <jehanp src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: fix crash when opening several times an export plug-in.
- Date: Sat, 30 Jan 2021 07:40:47 +0000 (UTC)
commit ef3d4cddc43f07478828767dbc38b46998716904
Author: Jehan <jehan girinstud io>
Date: Sat Jan 30 01:02:24 2021 +0100
app: fix crash when opening several times an export plug-in.
When running several times an export plug-in while one is still running,
the export file dialog may get destroyed and the second running plug-in
would try to call functions on a destroyed dialog, hence crashing core
GIMP.
app/dialogs/file-save-dialog.c | 56 +++++++++++++++++++++++++-----------------
1 file changed, 34 insertions(+), 22 deletions(-)
---
diff --git a/app/dialogs/file-save-dialog.c b/app/dialogs/file-save-dialog.c
index b0c1478335..30d94138bb 100644
--- a/app/dialogs/file-save-dialog.c
+++ b/app/dialogs/file-save-dialog.c
@@ -179,7 +179,19 @@ file_save_dialog_response (GtkWidget *dialog,
case CHECK_URI_OK:
{
- gboolean xcf_compression = FALSE;
+ GimpImage *image = file_dialog->image;
+ GimpDisplay *display_to_close = NULL;
+ gboolean xcf_compression = FALSE;
+ gboolean is_save_dialog = GIMP_IS_SAVE_DIALOG (dialog);
+ gboolean close_after_saving = FALSE;
+ gboolean save_a_copy = FALSE;
+
+ if (is_save_dialog)
+ {
+ close_after_saving = GIMP_SAVE_DIALOG (dialog)->close_after_saving;
+ display_to_close = GIMP_DISPLAY (GIMP_SAVE_DIALOG (dialog)->display_to_close);
+ save_a_copy = GIMP_SAVE_DIALOG (dialog)->save_a_copy;
+ }
gimp_file_dialog_set_sensitive (file_dialog, FALSE);
@@ -195,14 +207,17 @@ file_save_dialog_response (GtkWidget *dialog,
if (GIMP_IS_EXPORT_DIALOG (dialog))
gtk_widget_hide (dialog);
+ g_signal_connect (dialog, "destroy",
+ G_CALLBACK (gtk_widget_destroyed),
+ &dialog);
+
if (file_save_dialog_save_image (GIMP_PROGRESS (dialog),
gimp,
- file_dialog->image,
+ image,
file,
save_proc,
GIMP_RUN_INTERACTIVE,
- GIMP_IS_SAVE_DIALOG (dialog) &&
- ! GIMP_SAVE_DIALOG (dialog)->save_a_copy,
+ is_save_dialog && ! save_a_copy,
FALSE,
GIMP_IS_EXPORT_DIALOG (dialog),
xcf_compression,
@@ -213,51 +228,48 @@ file_save_dialog_response (GtkWidget *dialog,
* save. Lower-level URI management is handled in
* file_save()
*/
- if (GIMP_IS_SAVE_DIALOG (dialog))
+ if (is_save_dialog)
{
- if (GIMP_SAVE_DIALOG (dialog)->save_a_copy)
- gimp_image_set_save_a_copy_file (file_dialog->image, file);
+ if (save_a_copy)
+ gimp_image_set_save_a_copy_file (image, file);
- g_object_set_data_full (G_OBJECT (file_dialog->image->gimp),
+ g_object_set_data_full (G_OBJECT (image->gimp),
GIMP_FILE_SAVE_LAST_FILE_KEY,
g_object_ref (file),
(GDestroyNotify) g_object_unref);
}
else
{
- g_object_set_data_full (G_OBJECT (file_dialog->image->gimp),
+ g_object_set_data_full (G_OBJECT (image->gimp),
GIMP_FILE_EXPORT_LAST_FILE_KEY,
g_object_ref (file),
(GDestroyNotify) g_object_unref);
}
/* make sure the menus are updated with the keys we've just set */
- gimp_image_flush (file_dialog->image);
+ gimp_image_flush (image);
/* Handle close-after-saving */
- if (GIMP_IS_SAVE_DIALOG (dialog) &&
- GIMP_SAVE_DIALOG (dialog)->close_after_saving &&
- GIMP_SAVE_DIALOG (dialog)->display_to_close)
+ if (close_after_saving && display_to_close &&
+ ! gimp_image_is_dirty (gimp_display_get_image (display_to_close)))
{
- GimpDisplay *display = GIMP_DISPLAY (GIMP_SAVE_DIALOG (dialog)->display_to_close);
-
- if (! gimp_image_is_dirty (gimp_display_get_image (display)))
- {
- gimp_display_close (display);
- }
+ gimp_display_close (display_to_close);
}
- gtk_widget_destroy (dialog);
+ if (dialog)
+ gtk_widget_destroy (dialog);
}
else
{
- gtk_widget_show (dialog);
+ if (dialog)
+ gtk_widget_show (dialog);
}
g_object_unref (file);
g_free (basename);
- gimp_file_dialog_set_sensitive (file_dialog, TRUE);
+ if (dialog)
+ gimp_file_dialog_set_sensitive (file_dialog, TRUE);
}
break;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]