diff --git a/src/modules/Image/layers.c b/src/modules/Image/layers.c
index 9856b7eebdbe332fe9c0d435576a121e42824e9f..a56c06b75e7b858d49429894e5119df0d88c803a 100644
--- a/src/modules/Image/layers.c
+++ b/src/modules/Image/layers.c
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: layers.c,v 1.94 2003/12/12 17:43:54 nilsson Exp $
+|| $Id: layers.c,v 1.95 2004/02/03 17:34:38 grubba Exp $
 */
 
 /*
@@ -15,7 +15,7 @@
 
 #include <math.h> /* floor */
 
-RCSID("$Id: layers.c,v 1.94 2003/12/12 17:43:54 nilsson Exp $");
+RCSID("$Id: layers.c,v 1.95 2004/02/03 17:34:38 grubba Exp $");
 
 #include "image_machine.h"
 
@@ -2867,12 +2867,13 @@ void img_lay(struct layer **layer,
 
 void image_lay(INT32 args)
 {
-   int layers,i;
+   int layers,i,j;
    struct layer **l;
    struct object *o;
    struct layer *dest;
    struct array *a;
    INT_TYPE xoffset=0,yoffset=0,xsize=0,ysize=0;
+   ONERROR err;
 
    if (!args)
       SIMPLE_TOO_FEW_ARGS_ERROR("Image.lay",1);
@@ -2902,11 +2903,13 @@ void image_lay(INT32 args)
 
    l=(struct layer**)xalloc(sizeof(struct layer)*layers);
 
-   for (i=0; i<layers; i++)
+   SET_ONERROR(err, free, l);
+
+   for (i=j=0; i<layers; i++)
    {
       if (a->item[i].type==T_OBJECT)
       {
-	 if (!(l[i]=(struct layer*)get_storage(a->item[i].u.object,
+	 if (!(l[j]=(struct layer*)get_storage(a->item[i].u.object,
 					       image_layer_program)))
 	    SIMPLE_BAD_ARG_ERROR("Image.lay",1,
 				 "array(Image.Layer|mapping)");
@@ -2916,11 +2919,21 @@ void image_lay(INT32 args)
 	 push_svalue(a->item+i);
 	 push_object(o=clone_object(image_layer_program,1));
 	 args++;
-	 l[i]=(struct layer*)get_storage(o,image_layer_program);
+	 l[j]=(struct layer*)get_storage(o,image_layer_program);
       }
       else
 	 SIMPLE_BAD_ARG_ERROR("Image.lay",1,
 			      "array(Image.Layer|mapping)");
+      if (l[j]->xsize && l[j]->ysize)
+	 j++;
+   }
+
+   if (!(layers = j))	/* dummy return empty layer */
+   {
+      CALL_AND_UNSET_ONERROR(err);
+      pop_n_elems(args);
+      push_object(clone_object(image_layer_program,0));
+      return;
    }
 
    if (xsize==0) /* figure offset and size */
@@ -2969,7 +2982,7 @@ void image_lay(INT32 args)
    /* ok, do it! */
    img_lay(l,layers,dest);
 
-   free(l);
+   CALL_AND_UNSET_ONERROR(err);
 
    Pike_sp--;
    pop_n_elems(args);