diff --git a/src/modules/Image/image.c b/src/modules/Image/image.c
index 6de27f27a6b8f524422877cb71e23009129df8f9..797175d7a5d8d2340ae879de33c0b3585f3a1ecf 100644
--- a/src/modules/Image/image.c
+++ b/src/modules/Image/image.c
@@ -1,9 +1,9 @@
-/* $Id: image.c,v 1.100 1998/04/16 04:32:22 mirar Exp $ */
+/* $Id: image.c,v 1.101 1998/04/16 22:59:50 mirar Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: image.c,v 1.100 1998/04/16 04:32:22 mirar Exp $
+**!	$Id: image.c,v 1.101 1998/04/16 22:59:50 mirar Exp $
 **! class image
 **!
 **!	The main object of the <ref>Image</ref> module, this object
@@ -97,7 +97,7 @@
 
 #include "stralloc.h"
 #include "global.h"
-RCSID("$Id: image.c,v 1.100 1998/04/16 04:32:22 mirar Exp $");
+RCSID("$Id: image.c,v 1.101 1998/04/16 22:59:50 mirar Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -501,11 +501,16 @@ int image_too_big(INT_TYPE xsize,INT_TYPE ysize)
 
    if (xsize<0 || ysize<0) return 1;
 
+   if (xsize<0x20000000) xsize*=sizeof(rgb_group);
+   else if (ysize<0x20000000) ysize*=sizeof(rgb_group);
+   else return 1;
+
    a=(xsize>>16);
    b=xsize&0xffff;
    c=(ysize>>16);
    d=ysize&0xffff;
 
+   /* check for overflow */
    if ((a&&c) || ((b*d>>16)&0xffff) + (a*d) + (b*c) > 0x7fff) return 1;
 
    return 0;
diff --git a/src/modules/Image/testsuite.in b/src/modules/Image/testsuite.in
index 103b890743b5401726dcada4c75f8d767d5d281f..8bfe9f6e692fdf3313ca0ef6159dfba224880416 100644
--- a/src/modules/Image/testsuite.in
+++ b/src/modules/Image/testsuite.in
@@ -56,15 +56,16 @@ test_any([[# 1 "-"
 
 #42 "testsuite.in.in"
 int x=1; while ((x<<1)>0) x=(x<<1)+1;
-if (!catch { Image.image(x,2); } ||
-!catch { Image.image(x/32768,32769); }) return ( "permitted" );
+if (!catch { Image.image(x,2); }) return ( x+"x2 permitted" );
+if (!catch { Image.image(x/32768,65537); }) return ( (x/32768)+"x65537 permitted" );
+if (!catch { Image.image(x/(32768*3),65537); }) return ( (x/(32768*3))+"x65537 permitted" );
 return "ok";
 
 ]], "ok")
 test_any([[# 1 "-"
 
 
-#48 "testsuite.in.in"
+#49 "testsuite.in.in"
 object img=Image.image(1000,1000,17,42,96);
 if (!img ||
 img->xsize()!=1000 ||
@@ -77,7 +78,7 @@ return "ok";
 test_any([[# 1 "-"
 
 
-#59 "testsuite.in.in"
+#60 "testsuite.in.in"
 object img=Image.image(10,10);
 img=img->test();
 if (equal(img->max(),({0,0,0}))) return ( "failed" );
@@ -90,7 +91,7 @@ return "ok";
 test_any([[# 1 "-"
 
 
-#70 "testsuite.in.in"
+#71 "testsuite.in.in"
 object img=Image.image(100,100)->test();
 if (img!=img->copy()) return ( "differ" );
 if (img->copy(25,25,75,75)!=img->copy(25,25,75,75)) return ( "subregion differ" );
@@ -103,7 +104,7 @@ return "ok";
 test_any([[# 1 "-"
 
 
-#79 "testsuite.in.in"
+#80 "testsuite.in.in"
 object img=Image.image(100,100)->test();
 if (img->clear()==img) return ( "doesn't differ" );
 if (img->clear(0,0,0)!=0) return ( "wrong color (black)" );
@@ -114,7 +115,7 @@ return "ok";
 test_any([[# 1 "-"
 
 
-#86 "testsuite.in.in"
+#87 "testsuite.in.in"
 object img=Image.image(100,100)->test();
 if (img!=img->clone()) return ( "differ" );
 img->setpixel(2,2,0,255,0);
@@ -126,7 +127,7 @@ return "ok";
 test_any([[# 1 "-"
 
 
-#96 "testsuite.in.in"
+#97 "testsuite.in.in"
 array a=({0,0,0});
 array b=copy_value(a); b[0]=17; b[1]=42; b[2]=128;
 if (!equal( ({0,0,0}), a)) return ( "differ (1)" );
@@ -137,7 +138,7 @@ return "ok";
 test_any([[# 1 "-"
 
 
-#103 "testsuite.in.in"
+#104 "testsuite.in.in"
 if (!equal( ({0,0,0}), 
 Image.image(10,10,0,0,0)->max() ))
 return ( "erranous (1)" );
@@ -162,7 +163,7 @@ return "ok";
 test_any([[# 1 "-"
 
 
-#126 "testsuite.in.in"
+#127 "testsuite.in.in"
 object img=Image.image(10,10,255,0,0);
 if (!equal(img->getpixel(5,5),({255,0,0}))) return ( "getpixel erranous" );
 img->setpixel(5,5,1,2,3);
@@ -173,7 +174,7 @@ return "ok";
 test_any([[# 1 "-"
 
 
-#133 "testsuite.in.in"
+#134 "testsuite.in.in"
 object img=Image.image(10,10,255,0,0);
 img->setpixel(5,5,0,255,0,127);
 if (!equal(img->getpixel(5,5),({127,128,0}))) return ( "failed" );
@@ -183,7 +184,7 @@ return "ok";
 test_any([[# 1 "-"
 
 
-#139 "testsuite.in.in"
+#140 "testsuite.in.in"
 object img=Image.image(100,100,0,0,0);
 foreach (({40,50,60}),int z)
 { 
@@ -201,7 +202,7 @@ return "ok";
 test_any([[# 1 "-"
 
 
-#153 "testsuite.in.in"
+#154 "testsuite.in.in"
 object img=Image.image(100,100,0,0,0);
 img->line(40,0,0,40);
 if (!equal( ({0,0,0}), img->max() )) return ( "differ (reset)" );
diff --git a/src/modules/Image/testsuite.in.in b/src/modules/Image/testsuite.in.in
index 2dfa663da50d1f2fcc1403049b5799639fc2a23d..11c6ad75ea0ffc10ef496939337cb4d987ebc461 100644
--- a/src/modules/Image/testsuite.in.in
+++ b/src/modules/Image/testsuite.in.in
@@ -40,8 +40,9 @@
 
 #test Image.image() too big
    int x=1; while ((x<<1)>0) x=(x<<1)+1;
-   if (!catch { Image.image(x,2); } ||
-       !catch { Image.image(x/32768,32769); }) fail("permitted");
+   if (!catch { Image.image(x,2); }) fail(x+"x2 permitted");
+   if (!catch { Image.image(x/32768,65537); }) fail((x/32768)+"x65537 permitted");
+   if (!catch { Image.image(x/(32768*3),65537); }) fail((x/(32768*3))+"x65537 permitted");
    ok();
 
 #test Image.image() color