*/
if (GetBlobSize(image) != (size_t) GetBlobSize(image))
ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
+ if (GetBlobSize(image) < 141)
+ ThrowReaderException(CorruptImageError,"ImproperImageHeader");
buffer=(unsigned char *) AcquireQuantumMemory((size_t) GetBlobSize(image)+
MagickPathExtent,sizeof(*buffer));
if (buffer == (unsigned char *) NULL)
*/
header=SFWScan(buffer,buffer+count-1,(const unsigned char *)
"\377\310\377\320",4);
- if (header == (unsigned char *) NULL)
+ if ((header == (unsigned char *) NULL) ||
+ ((header+140) > (buffer+GetBlobSize(image))))
{
buffer=(unsigned char *) RelinquishMagickMemory(buffer);
ThrowReaderException(CorruptImageError,"ImproperImageHeader");
BImgBuff=(unsigned char *) RelinquishMagickMemory(BImgBuff);
return(-4);
}
- InsertRow(image,BImgBuff,y-1,bpp,exception);
+ if (InsertRow(image,BImgBuff,y-1,bpp,exception) == MagickFalse)
+ {
+ BImgBuff=(unsigned char *) RelinquishMagickMemory(BImgBuff);
+ return(-5);
+ }
}
}
}
status=SetImageExtent(image,image->columns,image->rows,exception);
if (status == MagickFalse)
break;
- if ((image->colors == 0) && (bpp <= 16))
+ if ((image->storage_class != PseudoClass) && (bpp != 24))
{
image->colors=one << bpp;
if (!AcquireImageColormap(image,image->colors,exception))
if (BImgBuff == (unsigned char *) NULL)
goto NoMemory;
- for(i=0; i< (ssize_t) image->rows; i++)
- {
- (void) ReadBlob(image,ldblk,BImgBuff);
- InsertRow(image,BImgBuff,i,bpp,exception);
- }
+ for (i=0; i< (ssize_t) image->rows; i++)
+ {
+ (void) ReadBlob(image,ldblk,BImgBuff);
+ if (InsertRow(image,BImgBuff,i,bpp,exception) == MagickFalse)
+ {
+ if(BImgBuff)
+ BImgBuff=(unsigned char *) RelinquishMagickMemory(BImgBuff);
+ goto DecompressionFailed;
+ }
+ }
if(BImgBuff)
BImgBuff=(unsigned char *) RelinquishMagickMemory(BImgBuff);