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