[gimp/gimp-2-8] Bug 727832 - file-psd-load infinite loop



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]