From 8f424002488d9f5ece29228d8ede0e39d838f38b Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 8 Nov 2015 13:22:50 -0500 Subject: [PATCH] https://github.com/ImageMagick/ImageMagick/issues/54 --- MagickCore/cache.c | 38 +++++++++++++++++++++++++++++++------- MagickCore/color.c | 22 ++++++++++++---------- MagickCore/identify.c | 14 +++++++------- coders/jpeg.c | 20 ++++++++++---------- 4 files changed, 60 insertions(+), 34 deletions(-) diff --git a/MagickCore/cache.c b/MagickCore/cache.c index 700b30936..2a9abebb3 100644 --- a/MagickCore/cache.c +++ b/MagickCore/cache.c @@ -3246,6 +3246,11 @@ static inline MagickOffsetType WritePixelCacheRegion( const CacheInfo *restrict cache_info,const MagickOffsetType offset, const MagickSizeType length,const unsigned char *restrict buffer) { +#if !defined(MAGICKCORE_HAVE_PWRITE) + MagickOffsetType + current_offset; +#endif + register MagickOffsetType i; @@ -3253,6 +3258,9 @@ static inline MagickOffsetType WritePixelCacheRegion( count; #if !defined(MAGICKCORE_HAVE_PWRITE) + current_offset=(MagickOffsetType) lseek(cache_info->file,0,SEEK_CUR); + if (current_offset < 0) + return((MagickOffsetType) -1); if (lseek(cache_info->file,offset,SEEK_SET) < 0) return((MagickOffsetType) -1); #endif @@ -3260,10 +3268,10 @@ static inline MagickOffsetType WritePixelCacheRegion( for (i=0; i < (MagickOffsetType) length; i+=count) { #if !defined(MAGICKCORE_HAVE_PWRITE) - count=write(cache_info->file,buffer+i,(size_t) MagickMin(length-i, + count=write(cache_info->file,buffer+i,(size_t) MagickMin(length-i,(size_t) SSIZE_MAX)); #else - count=pwrite(cache_info->file,buffer+i,(size_t) MagickMin(length-i, + count=pwrite(cache_info->file,buffer+i,(size_t) MagickMin(length-i,(size_t) SSIZE_MAX),(off_t) (offset+i)); #endif if (count <= 0) @@ -3273,6 +3281,10 @@ static inline MagickOffsetType WritePixelCacheRegion( break; } } +#if !defined(MAGICKCORE_HAVE_PWRITE) + if (lseek(cache_info->file,current_offset,SEEK_SET) < 0) + return((MagickOffsetType) -1); +#endif return(i); } @@ -3309,8 +3321,8 @@ static MagickBooleanType SetPixelCacheExtent(Image *image,MagickSizeType length) else { extent=(MagickOffsetType) length-1; - count=WritePixelCacheRegion(cache_info,extent,1, - (const unsigned char *) ""); + count=WritePixelCacheRegion(cache_info,extent,1,(const unsigned char *) + ""); #if defined(MAGICKCORE_HAVE_POSIX_FALLOCATE) if (cache_info->synchronize != MagickFalse) (void) posix_fallocate(cache_info->file,offset+1,extent-offset); @@ -4012,6 +4024,11 @@ static inline MagickOffsetType ReadPixelCacheRegion( const CacheInfo *restrict cache_info,const MagickOffsetType offset, const MagickSizeType length,unsigned char *restrict buffer) { +#if !defined(MAGICKCORE_HAVE_PREAD) + MagickOffsetType + current_offset; +#endif + register MagickOffsetType i; @@ -4019,6 +4036,9 @@ static inline MagickOffsetType ReadPixelCacheRegion( count; #if !defined(MAGICKCORE_HAVE_PREAD) + current_offset=(MagickOffsetType) lseek(cache_info->file,0,SEEK_CUR); + if (current_offset < 0) + return((MagickOffsetType) -1); if (lseek(cache_info->file,offset,SEEK_SET) < 0) return((MagickOffsetType) -1); #endif @@ -4026,10 +4046,10 @@ static inline MagickOffsetType ReadPixelCacheRegion( for (i=0; i < (MagickOffsetType) length; i+=count) { #if !defined(MAGICKCORE_HAVE_PREAD) - count=read(cache_info->file,buffer+i,(size_t) MagickMin(length-i, + count=read(cache_info->file,buffer+i,(size_t) MagickMin(length-i,(size_t) SSIZE_MAX)); #else - count=pread(cache_info->file,buffer+i,(size_t) MagickMin(length-i, + count=pread(cache_info->file,buffer+i,(size_t) MagickMin(length-i,(size_t) SSIZE_MAX),(off_t) (offset+i)); #endif if (count <= 0) @@ -4039,6 +4059,10 @@ static inline MagickOffsetType ReadPixelCacheRegion( break; } } +#if !defined(MAGICKCORE_HAVE_PREAD) + if (lseek(cache_info->file,current_offset,SEEK_SET) < 0) + return((MagickOffsetType) -1); +#endif return(i); } @@ -4237,7 +4261,7 @@ static MagickBooleanType ReadPixelCachePixels(CacheInfo *restrict cache_info, if (nexus_info->authentic_pixel_cache != MagickFalse) return(MagickTrue); offset=(MagickOffsetType) nexus_info->region.y*cache_info->columns; - if ((offset/(MagickOffsetType) cache_info->columns) != nexus_info->region.y) + if ((offset/cache_info->columns) != (MagickOffsetType) nexus_info->region.y) return(MagickFalse); offset+=nexus_info->region.x; number_channels=cache_info->number_channels; diff --git a/MagickCore/color.c b/MagickCore/color.c index d77f24ae2..df5b35f42 100644 --- a/MagickCore/color.c +++ b/MagickCore/color.c @@ -2399,18 +2399,20 @@ MagickExport MagickBooleanType QueryColorCompliance(const char *name, if ((flags & PercentValue) != 0) scale=(double) (QuantumRange/100.0); if ((flags & RhoValue) != 0) - color->red=(double) ClampToQuantum(scale*geometry_info.rho); + color->red=(double) ClampToQuantum((MagickRealType) floor(scale* + geometry_info.rho)); if ((flags & SigmaValue) != 0) - color->green=(double) ClampToQuantum(scale* - geometry_info.sigma); + color->green=(double) ClampToQuantum((MagickRealType) floor(scale* + geometry_info.sigma)); if ((flags & XiValue) != 0) - color->blue=(double) ClampToQuantum(scale*geometry_info.xi); + color->blue=(double) ClampToQuantum((MagickRealType) floor(scale* + geometry_info.xi)); color->alpha=(double) OpaqueAlpha; if ((flags & PsiValue) != 0) { if (color->colorspace == CMYKColorspace) - color->black=(double) ClampToQuantum(scale* - geometry_info.psi); + color->black=(double) ClampToQuantum((MagickRealType) floor( + scale*geometry_info.psi)); else if (color->alpha_trait != UndefinedPixelTrait) color->alpha=(double) ClampToQuantum(QuantumRange* @@ -2423,11 +2425,11 @@ MagickExport MagickBooleanType QueryColorCompliance(const char *name, if (color->colorspace == LabColorspace) { if ((flags & SigmaValue) != 0) - color->green=(MagickRealType) ClampToQuantum(scale* - geometry_info.sigma+(QuantumRange+1)/2.0); + color->green=(MagickRealType) ClampToQuantum((MagickRealType) + floor(scale*geometry_info.sigma+(QuantumRange+1)/2.0)); if ((flags & XiValue) != 0) - color->blue=(MagickRealType) ClampToQuantum(scale* - geometry_info.xi+(QuantumRange+1)/2.0); + color->blue=(MagickRealType) ClampToQuantum((MagickRealType) + floor(scale*geometry_info.xi+(QuantumRange+1)/2.0)); } if (LocaleCompare(colorspace,"gray") == 0) { diff --git a/MagickCore/identify.c b/MagickCore/identify.c index 7297dcade..dfcb0a3cc 100644 --- a/MagickCore/identify.c +++ b/MagickCore/identify.c @@ -412,13 +412,13 @@ static ssize_t PrintChannelStatistics(FILE *file,const PixelChannel channel, ssize_t n; - n=FormatLocaleFile(file,StatisticsFormat,name,ClampToQuantum(scale* - channel_statistics[channel].minima),channel_statistics[channel].minima/ - (double) QuantumRange,ClampToQuantum(scale* - channel_statistics[channel].maxima),channel_statistics[channel].maxima/ - (double) QuantumRange,scale*channel_statistics[channel].mean, - channel_statistics[channel].mean/(double) QuantumRange,scale* - channel_statistics[channel].standard_deviation, + n=FormatLocaleFile(file,StatisticsFormat,name,ClampToQuantum((MagickRealType) + (scale*channel_statistics[channel].minima)), + channel_statistics[channel].minima/(double) QuantumRange,ClampToQuantum( + (MagickRealType) (scale*channel_statistics[channel].maxima)), + channel_statistics[channel].maxima/(double) QuantumRange,scale* + channel_statistics[channel].mean,channel_statistics[channel].mean/(double) + QuantumRange,scale*channel_statistics[channel].standard_deviation, channel_statistics[channel].standard_deviation/(double) QuantumRange, channel_statistics[channel].kurtosis,channel_statistics[channel].skewness, channel_statistics[channel].entropy); diff --git a/coders/jpeg.c b/coders/jpeg.c index 20b241272..d58fa00d6 100644 --- a/coders/jpeg.c +++ b/coders/jpeg.c @@ -1745,7 +1745,7 @@ static QuantizationTable *GetQuantizationTable(const char *filename, if (description == (XMLTreeInfo *) NULL) { (void) ThrowMagickException(exception,GetMagickModule(),OptionError, - "XmlMissingElement", ", slot \"%s\"",slot); + "XmlMissingElement",", slot \"%s\"",slot); quantization_tables=DestroyXMLTree(quantization_tables); xml=DestroyString(xml); return(table); @@ -1754,7 +1754,7 @@ static QuantizationTable *GetQuantizationTable(const char *filename, if (levels == (XMLTreeInfo *) NULL) { (void) ThrowMagickException(exception,GetMagickModule(),OptionError, - "XmlMissingElement", ", slot \"%s\"", slot); + "XmlMissingElement",", slot \"%s\"",slot); quantization_tables=DestroyXMLTree(quantization_tables); xml=DestroyString(xml); return(table); @@ -1776,7 +1776,7 @@ static QuantizationTable *GetQuantizationTable(const char *filename, if (attribute == (char *) NULL) { (void) ThrowMagickException(exception,GetMagickModule(),OptionError, - "XmlMissingAttribute", ", slot \"%s\"",slot); + "XmlMissingAttribute",", slot \"%s\"",slot); quantization_tables=DestroyXMLTree(quantization_tables); table=DestroyQuantizationTable(table); xml=DestroyString(xml); @@ -1786,7 +1786,7 @@ static QuantizationTable *GetQuantizationTable(const char *filename, if (table->width == 0) { (void) ThrowMagickException(exception,GetMagickModule(),OptionError, - "XmlInvalidAttribute", ", table \"%s\"",slot); + "XmlInvalidAttribute",", table \"%s\"",slot); quantization_tables=DestroyXMLTree(quantization_tables); table=DestroyQuantizationTable(table); xml=DestroyString(xml); @@ -1796,7 +1796,7 @@ static QuantizationTable *GetQuantizationTable(const char *filename, if (attribute == (char *) NULL) { (void) ThrowMagickException(exception,GetMagickModule(),OptionError, - "XmlMissingAttribute", ", table \"%s\"",slot); + "XmlMissingAttribute",", table \"%s\"",slot); quantization_tables=DestroyXMLTree(quantization_tables); table=DestroyQuantizationTable(table); xml=DestroyString(xml); @@ -1806,7 +1806,7 @@ static QuantizationTable *GetQuantizationTable(const char *filename, if (table->height == 0) { (void) ThrowMagickException(exception,GetMagickModule(),OptionError, - "XmlInvalidAttribute", ", table \"%s\"",slot); + "XmlInvalidAttribute",", table \"%s\"",slot); quantization_tables=DestroyXMLTree(quantization_tables); table=DestroyQuantizationTable(table); xml=DestroyString(xml); @@ -1816,7 +1816,7 @@ static QuantizationTable *GetQuantizationTable(const char *filename, if (attribute == (char *) NULL) { (void) ThrowMagickException(exception,GetMagickModule(),OptionError, - "XmlMissingAttribute", ", table \"%s\"",slot); + "XmlMissingAttribute",", table \"%s\"",slot); quantization_tables=DestroyXMLTree(quantization_tables); table=DestroyQuantizationTable(table); xml=DestroyString(xml); @@ -1826,7 +1826,7 @@ static QuantizationTable *GetQuantizationTable(const char *filename, if (table->divisor == 0.0) { (void) ThrowMagickException(exception,GetMagickModule(),OptionError, - "XmlInvalidAttribute", ", table \"%s\"",slot); + "XmlInvalidAttribute",", table \"%s\"",slot); quantization_tables=DestroyXMLTree(quantization_tables); table=DestroyQuantizationTable(table); xml=DestroyString(xml); @@ -1836,7 +1836,7 @@ static QuantizationTable *GetQuantizationTable(const char *filename, if (content == (char *) NULL) { (void) ThrowMagickException(exception,GetMagickModule(),OptionError, - "XmlMissingContent", ", table \"%s\"",slot); + "XmlMissingContent",", table \"%s\"",slot); quantization_tables=DestroyXMLTree(quantization_tables); table=DestroyQuantizationTable(table); xml=DestroyString(xml); @@ -1865,7 +1865,7 @@ static QuantizationTable *GetQuantizationTable(const char *filename, if (p != content) { (void) ThrowMagickException(exception,GetMagickModule(),OptionError, - "XmlInvalidContent", " too many values, table \"%s\"",slot); + "XmlInvalidContent"," too many values, table \"%s\"",slot); quantization_tables=DestroyXMLTree(quantization_tables); table=DestroyQuantizationTable(table); xml=DestroyString(xml); -- 2.40.0