[gimp/gimp-2-8] Bug 727832 - file-psd-load infinite loop
- From: Hartmut Kuhse <hartmutkuhse src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/gimp-2-8] Bug 727832 - file-psd-load infinite loop
- Date: Mon, 21 Apr 2014 17:21:13 +0000 (UTC)
commit a6dbdf14be55fc247bf419db1716add45f7efffc
Author: Hartmut Kuhse <hk_priv gmx de>
Date: Mon Apr 21 19:20:57 2014 +0200
Bug 727832 - file-psd-load infinite loop
If a layer mask is completely outside the layer boundaries,
the layer mask is omitted
plug-ins/file-psd/psd-load.c | 67 +++++++++++++++++++++++-------------------
1 files changed, 37 insertions(+), 30 deletions(-)
---
diff --git a/plug-ins/file-psd/psd-load.c b/plug-ins/file-psd/psd-load.c
index 7c6ada5..d9b4763 100644
--- a/plug-ins/file-psd/psd-load.c
+++ b/plug-ins/file-psd/psd-load.c
@@ -1404,16 +1404,15 @@ add_layers (const gint32 image_id,
IFDBG(3) g_debug ("Allocate Pixels %d", layer_size);
/* Crop mask at layer boundry */
IFDBG(3) g_debug ("Original Mask %d %d %d %d", lm_x, lm_y, lm_w, lm_h);
- if (lm_x < 0
- || lm_y < 0
- || lm_w + lm_x > l_w
- || lm_h + lm_y > l_h)
+ if (lm_x < 0 ||
+ lm_y < 0 ||
+ lm_w + lm_x > l_w ||
+ lm_h + lm_y > l_h)
{
- if (CONVERSION_WARNINGS)
- g_message ("Warning\n"
- "The layer mask is partly outside the "
- "layer boundary. The mask will be "
- "cropped which may result in data loss.");
+ g_message (_("Warning\n"
+ "The layer mask is partly outside the "
+ "layer boundary. The mask will be "
+ "cropped which may result in data loss."));
i = 0;
for (rowi = 0; rowi < lm_h; ++rowi)
{
@@ -1446,28 +1445,36 @@ add_layers (const gint32 image_id,
lm_h = l_h - lm_y;
}
else
- memcpy (pixels, lyr_chn[user_mask_chn]->data, layer_size);
- g_free (lyr_chn[user_mask_chn]->data);
- /* Draw layer mask data */
- IFDBG(3) g_debug ("Layer %d %d %d %d", l_x, l_y, l_w, l_h);
- IFDBG(3) g_debug ("Mask %d %d %d %d", lm_x, lm_y, lm_w, lm_h);
-
- if (lyr_a[lidx]->layer_mask.def_color == 255)
- mask_id = gimp_layer_create_mask (layer_id, GIMP_ADD_WHITE_MASK);
- else
- mask_id = gimp_layer_create_mask (layer_id, GIMP_ADD_BLACK_MASK);
+ {
+ memcpy (pixels, lyr_chn[user_mask_chn]->data, layer_size);
+ i = layer_size;
+ }
- IFDBG(3) g_debug ("New layer mask %d", mask_id);
- gimp_layer_add_mask (layer_id, mask_id);
- drawable = gimp_drawable_get (mask_id);
- gimp_pixel_rgn_init (&pixel_rgn, drawable, 0 , 0,
- drawable->width, drawable->height, TRUE, FALSE);
- gimp_pixel_rgn_set_rect (&pixel_rgn, pixels, lm_x, lm_y, lm_w, lm_h);
- gimp_drawable_flush (drawable);
- gimp_drawable_detach (drawable);
- gimp_layer_set_apply_mask (layer_id,
- ! lyr_a[lidx]->layer_mask.mask_flags.disabled);
- g_free (pixels);
+ g_free (lyr_chn[user_mask_chn]->data);
+ /* Draw layer mask data, if any */
+ if (i > 0)
+ {
+ IFDBG(3) g_debug ("Layer %d %d %d %d", l_x, l_y, l_w, l_h);
+ IFDBG(3) g_debug ("Mask %d %d %d %d", lm_x, lm_y, lm_w, lm_h);
+
+ if (lyr_a[lidx]->layer_mask.def_color == 255)
+ mask_id = gimp_layer_create_mask (layer_id, GIMP_ADD_WHITE_MASK);
+ else
+ mask_id = gimp_layer_create_mask (layer_id, GIMP_ADD_BLACK_MASK);
+
+ IFDBG(3) g_debug ("New layer mask %d", mask_id);
+ gimp_layer_add_mask (layer_id, mask_id);
+ drawable = gimp_drawable_get (mask_id);
+ gimp_pixel_rgn_init (&pixel_rgn, drawable, 0 , 0,
+ drawable->width, drawable->height, TRUE, FALSE);
+ gimp_pixel_rgn_set_rect (&pixel_rgn, pixels, lm_x, lm_y, lm_w, lm_h);
+ gimp_drawable_flush (drawable);
+ gimp_drawable_detach (drawable);
+ gimp_layer_set_apply_mask (layer_id,
+ ! lyr_a[lidx]->layer_mask.mask_flags.disabled);
+ }
+ if (pixels)
+ g_free (pixels);
}
}
for (cidx = 0; cidx < lyr_a[lidx]->num_channels; ++cidx)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]