diff -aur FreeImage/Source/LibTIFF4/mkg3states.c FreeImage-tiff4.0.4/Source/LibTIFF4/mkg3states.c --- FreeImage/Source/LibTIFF4/mkg3states.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/mkg3states.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* "$Id: mkg3states.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* "$Id: mkg3states.c,v 1.12 2015-06-21 01:09:09 bfriesen Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler @@ -383,8 +383,11 @@ FILE* fd; char* outputfile; int c; + +#if !HAVE_DECL_OPTARG extern int optind; extern char* optarg; +#endif while ((c = getopt(argc, argv, "c:s:bp")) != -1) switch (c) { diff -aur FreeImage/Source/LibTIFF4/t4.h FreeImage-tiff4.0.4/Source/LibTIFF4/t4.h --- FreeImage/Source/LibTIFF4/t4.h 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/t4.h 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: t4.h,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: t4.h,v 1.3 2010-03-10 18:56:48 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tif_aux.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_aux.c --- FreeImage/Source/LibTIFF4/tif_aux.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_aux.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_aux.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_aux.c,v 1.26 2010-07-01 15:33:28 dron Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tif_close.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_close.c --- FreeImage/Source/LibTIFF4/tif_close.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_close.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_close.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_close.c,v 1.19 2010-03-10 18:56:48 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tif_codec.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_codec.c --- FreeImage/Source/LibTIFF4/tif_codec.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_codec.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_codec.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_codec.c,v 1.16 2013-05-02 14:44:29 tgl Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -108,7 +108,8 @@ const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression); char compression_code[20]; - sprintf( compression_code, "%d", tif->tif_dir.td_compression ); + snprintf(compression_code, sizeof(compression_code), "%d", + tif->tif_dir.td_compression ); TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "%s compression support is not configured", c ? c->name : compression_code ); diff -aur FreeImage/Source/LibTIFF4/tif_color.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_color.c --- FreeImage/Source/LibTIFF4/tif_color.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_color.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_color.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_color.c,v 1.19 2010-12-14 02:22:42 faxguy Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tif_compress.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_compress.c --- FreeImage/Source/LibTIFF4/tif_compress.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_compress.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_compress.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_compress.c,v 1.22 2010-03-10 18:56:48 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tif_config.h.in FreeImage-tiff4.0.4/Source/LibTIFF4/tif_config.h.in --- FreeImage/Source/LibTIFF4/tif_config.h.in 2012-09-18 00:58:46.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_config.h.in 2015-09-04 19:54:56.000000000 +0200 @@ -27,6 +27,10 @@ /* Define to 1 if you have the <assert.h> header file. */ #undef HAVE_ASSERT_H +/* Define to 1 if you have the declaration of `optarg', and to 0 if you don't. + */ +#undef HAVE_DECL_OPTARG + /* Define to 1 if you have the <dlfcn.h> header file. */ #undef HAVE_DLFCN_H @@ -79,9 +83,6 @@ /* Define to 1 if you have the `lfind' function. */ #undef HAVE_LFIND -/* Define to 1 if you have the `m' library (-lm). */ -#undef HAVE_LIBM - /* Define to 1 if you have the <limits.h> header file. */ #undef HAVE_LIMITS_H @@ -194,8 +195,7 @@ /* Support LogLuv high dynamic range encoding */ #undef LOGLUV_SUPPORT -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ +/* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Support LZMA2 compression */ @@ -210,9 +210,6 @@ /* Support NeXT 2-bit RLE algorithm */ #undef NEXT_SUPPORT -/* Define to 1 if your C compiler doesn't accept -c and -o together. */ -#undef NO_MINUS_C_MINUS_O - /* Support Old JPEG compresson (read-only) */ #undef OJPEG_SUPPORT @@ -259,6 +256,9 @@ /* The size of `signed short', as computed by sizeof. */ #undef SIZEOF_SIGNED_SHORT +/* The size of `size_t', as computed by sizeof. */ +#undef SIZEOF_SIZE_T + /* The size of `unsigned char *', as computed by sizeof. */ #undef SIZEOF_UNSIGNED_CHAR_P @@ -314,6 +314,12 @@ /* Pointer difference type */ #undef TIFF_PTRDIFF_T +/* Size type formatter */ +#undef TIFF_SIZE_FORMAT + +/* Unsigned size type */ +#undef TIFF_SIZE_T + /* Signed size type formatter */ #undef TIFF_SSIZE_FORMAT diff -aur FreeImage/Source/LibTIFF4/tif_config.vc.h FreeImage-tiff4.0.4/Source/LibTIFF4/tif_config.vc.h --- FreeImage/Source/LibTIFF4/tif_config.vc.h 2011-09-14 02:50:50.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_config.vc.h 2015-09-04 19:54:56.000000000 +0200 @@ -1,3 +1,6 @@ +#ifndef _TIF_CONFIG_H_ +#define _TIF_CONFIG_H_ + /* Define to 1 if you have the <assert.h> header file. */ #define HAVE_ASSERT_H 1 @@ -26,6 +29,9 @@ /* Define to 1 if you have the `setmode' function. */ #define HAVE_SETMODE 1 +/* Define to 1 if you have the declaration of `optarg', and to 0 if you don't. */ +#define HAVE_DECL_OPTARG 0 + /* The size of a `int', as computed by sizeof. */ #define SIZEOF_INT 4 @@ -44,10 +50,64 @@ /* Unsigned 64-bit type */ #define TIFF_UINT64_T unsigned __int64 +#if _WIN64 +/* + Windows 64-bit build +*/ + +/* Pointer difference type */ +# define TIFF_PTRDIFF_T TIFF_INT64_T + +/* The size of `size_t', as computed by sizeof. */ +# define SIZEOF_SIZE_T 8 + +/* Size type formatter */ +# define TIFF_SIZE_FORMAT TIFF_INT64_FORMAT + +/* Unsigned size type */ +# define TIFF_SIZE_T TIFF_UINT64_T + +/* Signed size type formatter */ +# define TIFF_SSIZE_FORMAT TIFF_INT64_FORMAT + +/* Signed size type */ +# define TIFF_SSIZE_T TIFF_INT64_T + +#else +/* + Windows 32-bit build +*/ + +/* Pointer difference type */ +# define TIFF_PTRDIFF_T signed int + +/* The size of `size_t', as computed by sizeof. */ +# define SIZEOF_SIZE_T 4 + +/* Size type formatter */ +# define TIFF_SIZE_FORMAT "%u" + +/* Size type formatter */ +# define TIFF_SIZE_FORMAT "%u" + +/* Unsigned size type */ +# define TIFF_SIZE_T unsigned int + +/* Signed size type formatter */ +# define TIFF_SSIZE_FORMAT "%d" + +/* Signed size type */ +# define TIFF_SSIZE_T signed int + +#endif + /* Set the native cpu bit order */ #define HOST_FILLORDER FILLORDER_LSB2MSB +/* Visual Studio 2015 / VC 14 / MSVC 19.00 finally has snprintf() */ +#if defined(_MSC_VER) && _MSC_VER < 1900 #define snprintf _snprintf +#endif /* Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ @@ -62,6 +122,10 @@ #endif #define lfind _lfind + +#pragma warning(disable : 4996) /* function deprecation warnings */ + +#endif /* _TIF_CONFIG_H_ */ /* * Local Variables: * mode: c diff -aur FreeImage/Source/LibTIFF4/tif_config.wince.h FreeImage-tiff4.0.4/Source/LibTIFF4/tif_config.wince.h --- FreeImage/Source/LibTIFF4/tif_config.wince.h 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_config.wince.h 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_config.wince.h,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_config.wince.h,v 1.3 2010-03-10 18:56:48 bfriesen Exp $ */ /* * TIFF library configuration header for Windows CE platform. diff -aur FreeImage/Source/LibTIFF4/tif_dir.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_dir.c --- FreeImage/Source/LibTIFF4/tif_dir.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_dir.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_dir.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_dir.c,v 1.121 2015-05-31 23:11:43 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -160,10 +160,12 @@ TIFFDirectory* td = &tif->tif_dir; int status = 1; uint32 v32, i, v; + double dblval; char* s; const TIFFField *fip = TIFFFindField(tif, tag, TIFF_ANY); uint32 standard_tag = tag; - + if( fip == NULL ) /* cannot happen since OkToChangeTag() already checks it */ + return 0; /* * We want to force the custom code to be used for custom * fields even if the tag happens to match a well known @@ -283,10 +285,16 @@ setDoubleArrayOneValue(&td->td_smaxsamplevalue, va_arg(ap, double), td->td_samplesperpixel); break; case TIFFTAG_XRESOLUTION: - td->td_xresolution = (float) va_arg(ap, double); + dblval = va_arg(ap, double); + if( dblval < 0 ) + goto badvaluedouble; + td->td_xresolution = (float) dblval; break; case TIFFTAG_YRESOLUTION: - td->td_yresolution = (float) va_arg(ap, double); + dblval = va_arg(ap, double); + if( dblval < 0 ) + goto badvaluedouble; + td->td_yresolution = (float) dblval; break; case TIFFTAG_PLANARCONFIG: v = (uint16) va_arg(ap, uint16_vap); @@ -449,11 +457,11 @@ * happens, for example, when tiffcp is used to convert between * compression schemes and codec-specific tags are blindly copied. */ - if(fip == NULL || fip->field_bit != FIELD_CUSTOM) { + if(fip->field_bit != FIELD_CUSTOM) { TIFFErrorExt(tif->tif_clientdata, module, "%s: Invalid %stag \"%s\" (not supported by codec)", tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "", - fip ? fip->field_name : "Unknown"); + fip->field_name); status = 0; break; } @@ -693,6 +701,16 @@ va_end(ap); } return (0); +badvaluedouble: + { + const TIFFField* fip=TIFFFieldWithTag(tif,tag); + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Bad value %f for \"%s\" tag", + tif->tif_name, dblval, + fip ? fip->field_name : "Unknown"); + va_end(ap); + } + return (0); } /* @@ -809,6 +827,8 @@ int ret_val = 1; uint32 standard_tag = tag; const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY); + if( fip == NULL ) /* cannot happen since TIFFGetField() already checks it */ + return 0; /* * We want to force the custom code to be used for custom @@ -1006,14 +1026,14 @@ * get a tag that is not valid for the image's * codec then we'll arrive here. */ - if( fip == NULL || fip->field_bit != FIELD_CUSTOM ) + if( fip->field_bit != FIELD_CUSTOM ) { TIFFErrorExt(tif->tif_clientdata, "_TIFFVGetField", "%s: Invalid %stag \"%s\" " "(not supported by codec)", tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "", - fip ? fip->field_name : "Unknown"); + fip->field_name); ret_val = 0; break; } @@ -1302,8 +1322,20 @@ tif->tif_tagmethods.printdir = NULL; /* * Give client code a chance to install their own - * tag extensions & methods, prior to compression overloads. + * tag extensions & methods, prior to compression overloads, + * but do some prior cleanup first. (http://trac.osgeo.org/gdal/ticket/5054) */ + if (tif->tif_nfieldscompat > 0) { + uint32 i; + + for (i = 0; i < tif->tif_nfieldscompat; i++) { + if (tif->tif_fieldscompat[i].allocated_size) + _TIFFfree(tif->tif_fieldscompat[i].fields); + } + _TIFFfree(tif->tif_fieldscompat); + tif->tif_nfieldscompat = 0; + tif->tif_fieldscompat = NULL; + } if (_TIFFextender) (*_TIFFextender)(tif); (void) TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE); @@ -1344,6 +1376,7 @@ if (((uint64)poffa!=poff)||(poffb<poffa)||(poffb<(tmsize_t)sizeof(uint16))||(poffb>tif->tif_size)) { TIFFErrorExt(tif->tif_clientdata,module,"Error fetching directory count"); + *nextdir=0; return(0); } _TIFFmemcpy(&dircount,tif->tif_base+poffa,sizeof(uint16)); @@ -1453,7 +1486,8 @@ (void) TIFFSeekFile(tif, dircount16*20, SEEK_CUR); if (!ReadOK(tif, nextdir, sizeof (uint64))) { - TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory link", + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Error fetching directory link", tif->tif_name); return (0); } @@ -1470,6 +1504,7 @@ uint16 TIFFNumberOfDirectories(TIFF* tif) { + static const char module[] = "TIFFNumberOfDirectories"; uint64 nextdir; uint16 n; if (!(tif->tif_flags&TIFF_BIGTIFF)) @@ -1478,7 +1513,18 @@ nextdir = tif->tif_header.big.tiff_diroff; n = 0; while (nextdir != 0 && TIFFAdvanceDirectory(tif, &nextdir, NULL)) - n++; + { + if (n != 65535) { + ++n; + } + else + { + TIFFErrorExt(tif->tif_clientdata, module, + "Directory count exceeded 65535 limit," + " giving up on counting."); + return (65535); + } + } return (n); } diff -aur FreeImage/Source/LibTIFF4/tif_dir.h FreeImage-tiff4.0.4/Source/LibTIFF4/tif_dir.h --- FreeImage/Source/LibTIFF4/tif_dir.h 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_dir.h 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_dir.h,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_dir.h,v 1.54 2011-02-18 20:53:05 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tif_dirinfo.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_dirinfo.c --- FreeImage/Source/LibTIFF4/tif_dirinfo.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_dirinfo.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_dirinfo.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_dirinfo.c,v 1.121 2014-05-07 01:58:46 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -128,6 +128,8 @@ { TIFFTAG_PIXAR_FOVCOT, 1, 1, TIFF_FLOAT, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FieldOfViewCotangent", NULL }, { TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN, 16, 16, TIFF_FLOAT, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MatrixWorldToScreen", NULL }, { TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA, 16, 16, TIFF_FLOAT, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MatrixWorldToCamera", NULL }, + { TIFFTAG_CFAREPEATPATTERNDIM, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CFARepeatPatternDim", NULL }, + { TIFFTAG_CFAPATTERN, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CFAPattern" , NULL}, { TIFFTAG_COPYRIGHT, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Copyright", NULL }, /* end Pixar tags */ { TIFFTAG_RICHTIFFIPTC, -3, -3, TIFF_LONG, 0, TIFF_SETGET_C32_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "RichTIFFIPTC", NULL }, @@ -193,19 +195,19 @@ { TIFFTAG_PERSAMPLE, 0, 0, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "PerSample", NULL}, /* end DNG tags */ /* begin TIFF/FX tags */ - { TIFFTAG_INDEXED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "Indexed" }, - { TIFFTAG_GLOBALPARAMETERSIFD, 1, 1, TIFF_IFD, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "GlobalParametersIFD", NULL }, - { TIFFTAG_PROFILETYPE, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ProfileType", NULL }, - { TIFFTAG_FAXPROFILE, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "FaxProfile", NULL }, - { TIFFTAG_CODINGMETHODS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CodingMethods", NULL }, - { TIFFTAG_VERSIONYEAR, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "VersionYear", NULL }, - { TIFFTAG_MODENUMBER, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ModeNumber", NULL }, - { TIFFTAG_DECODE, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "Decode", NULL }, - { TIFFTAG_IMAGEBASECOLOR, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ImageBaseColor", NULL }, - { TIFFTAG_T82OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "T82Options", NULL }, - { TIFFTAG_STRIPROWCOUNTS, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "StripRowCounts", NULL }, - { TIFFTAG_IMAGELAYER, 2, 2, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ImageLayer", NULL }, - /* end DNG tags */ + { TIFFTAG_INDEXED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "Indexed", NULL }, + { TIFFTAG_GLOBALPARAMETERSIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "GlobalParametersIFD", NULL }, + { TIFFTAG_PROFILETYPE, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ProfileType", NULL }, + { TIFFTAG_FAXPROFILE, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "FaxProfile", NULL }, + { TIFFTAG_CODINGMETHODS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CodingMethods", NULL }, + { TIFFTAG_VERSIONYEAR, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "VersionYear", NULL }, + { TIFFTAG_MODENUMBER, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ModeNumber", NULL }, + { TIFFTAG_DECODE, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "Decode", NULL }, + { TIFFTAG_IMAGEBASECOLOR, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ImageBaseColor", NULL }, + { TIFFTAG_T82OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "T82Options", NULL }, + { TIFFTAG_STRIPROWCOUNTS, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "StripRowCounts", NULL }, + { TIFFTAG_IMAGELAYER, 2, 2, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ImageLayer", NULL }, + /* end TIFF/FX tags */ /* begin pseudo tags */ }; @@ -711,7 +713,7 @@ * note that this name is a special sign to TIFFClose() and * _TIFFSetupFields() to free the field */ - sprintf(fld->field_name, "Tag %d", (int) tag); + snprintf(fld->field_name, 32, "Tag %d", (int) tag); return fld; } diff -aur FreeImage/Source/LibTIFF4/tif_dirread.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_dirread.c --- FreeImage/Source/LibTIFF4/tif_dirread.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_dirread.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_dirread.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_dirread.c,v 1.187 2015-05-31 21:09:33 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -2172,11 +2172,6 @@ break; } _TIFFfree(origdata); - if (err!=TIFFReadDirEntryErrOk) - { - _TIFFfree(data); - return(err); - } *value=data; return(TIFFReadDirEntryErrOk); } @@ -2414,11 +2409,6 @@ break; } _TIFFfree(origdata); - if (err!=TIFFReadDirEntryErrOk) - { - _TIFFfree(data); - return(err); - } *value=data; return(TIFFReadDirEntryErrOk); } @@ -2657,11 +2647,6 @@ break; } _TIFFfree(origdata); - if (err!=TIFFReadDirEntryErrOk) - { - _TIFFfree(data); - return(err); - } *value=data; return(TIFFReadDirEntryErrOk); } @@ -2723,11 +2708,6 @@ break; } _TIFFfree(origdata); - if (err!=TIFFReadDirEntryErrOk) - { - _TIFFfree(data); - return(err); - } *value=data; return(TIFFReadDirEntryErrOk); } @@ -3374,7 +3354,7 @@ } else { switch (err) { case TIFFReadDirEntryErrCount: - TIFFErrorExt(tif->tif_clientdata, module, + TIFFWarningExt(tif->tif_clientdata, module, "Incorrect count for \"%s\"; tag ignored", tagname); break; @@ -3430,6 +3410,8 @@ const TIFFField* fip; uint32 fii=FAILED_FII; toff_t nextdiroff; + int bitspersample_read = FALSE; + tif->tif_diroff=tif->tif_nextdiroff; if (!TIFFCheckDirOffset(tif,tif->tif_nextdiroff)) return 0; /* last offset or bad offset (IFD looping) */ @@ -3706,6 +3688,8 @@ } if (!TIFFSetField(tif,dp->tdir_tag,value)) goto bad; + if( dp->tdir_tag == TIFFTAG_BITSPERSAMPLE ) + bitspersample_read = TRUE; } break; case TIFFTAG_SMINSAMPLEVALUE: @@ -3763,6 +3747,19 @@ uint32 countrequired; uint32 incrementpersample; uint16* value=NULL; + /* It would be dangerous to instanciate those tag values */ + /* since if td_bitspersample has not yet been read (due to */ + /* unordered tags), it could be read afterwards with a */ + /* values greater than the default one (1), which may cause */ + /* crashes in user code */ + if( !bitspersample_read ) + { + fip = TIFFFieldWithTag(tif,dp->tdir_tag); + TIFFWarningExt(tif->tif_clientdata,module, + "Ignoring %s since BitsPerSample tag not found", + fip ? fip->field_name : "unknown tagname"); + continue; + } countpersample=(1L<<tif->tif_dir.td_bitspersample); if ((dp->tdir_tag==TIFFTAG_TRANSFERFUNCTION)&&(dp->tdir_count==(uint64)countpersample)) { @@ -4278,7 +4275,8 @@ TIFFDirectory *td = &tif->tif_dir; uint32 strip; - _TIFFFillStriles( tif ); + if( !_TIFFFillStriles( tif ) ) + return -1; if (td->td_stripbytecount) _TIFFfree(td->td_stripbytecount); @@ -4377,6 +4375,11 @@ if (diroff == 0) /* no more directories */ return 0; + if (tif->tif_dirnumber == 65535) { + TIFFErrorExt(tif->tif_clientdata, "TIFFCheckDirOffset", + "Cannot handle more than 65535 TIFF directories"); + return 0; + } for (n = 0; n < tif->tif_dirnumber && tif->tif_dirlist; n++) { if (tif->tif_dirlist[n] == diroff) @@ -4396,7 +4399,10 @@ tif->tif_dirnumber, 2 * sizeof(uint64), "for IFD list"); if (!new_dirlist) return 0; - tif->tif_dirlistsize = 2 * tif->tif_dirnumber; + if( tif->tif_dirnumber >= 32768 ) + tif->tif_dirlistsize = 65535; + else + tif->tif_dirlistsize = 2 * tif->tif_dirnumber; tif->tif_dirlist = new_dirlist; } @@ -4708,6 +4714,7 @@ return 0; } fip=tif->tif_fields[fii]; + assert(fip != NULL); /* should not happen */ assert(fip->set_field_type!=TIFF_SETGET_OTHER); /* if so, we shouldn't arrive here but deal with this in specialized code */ assert(fip->set_field_type!=TIFF_SETGET_INT); /* if so, we shouldn't arrive here as this is only the case for pseudo-tags */ err=TIFFReadDirEntryErrOk; @@ -5355,7 +5362,7 @@ } if (err!=TIFFReadDirEntryErrOk) { - TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",recover); + TIFFReadDirEntryOutputErr(tif,err,module,fip->field_name,recover); return(0); } return(1); diff -aur FreeImage/Source/LibTIFF4/tif_dirwrite.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_dirwrite.c --- FreeImage/Source/LibTIFF4/tif_dirwrite.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_dirwrite.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_dirwrite.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_dirwrite.c,v 1.78 2015-05-31 00:38:46 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -2839,14 +2839,15 @@ "Error writing directory link"); return (0); } - - _TIFFfree( buf_to_write ); } else { memcpy( &entry_offset, buf_to_write, count*TIFFDataWidth(datatype)); } + _TIFFfree( buf_to_write ); + buf_to_write = 0; + /* -------------------------------------------------------------------- */ /* Adjust the directory entry. */ /* -------------------------------------------------------------------- */ diff -aur FreeImage/Source/LibTIFF4/tif_dumpmode.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_dumpmode.c --- FreeImage/Source/LibTIFF4/tif_dumpmode.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_dumpmode.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Header: /cvsroot/freeimage/FreeImage/Source/LibTIFF4/tif_dumpmode.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_dumpmode.c,v 1.14 2011-04-02 20:54:09 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tif_error.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_error.c --- FreeImage/Source/LibTIFF4/tif_error.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_error.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Header: /cvsroot/freeimage/FreeImage/Source/LibTIFF4/tif_error.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_error.c,v 1.5 2010-03-10 18:56:48 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tif_extension.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_extension.c --- FreeImage/Source/LibTIFF4/tif_extension.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_extension.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Header: /cvsroot/freeimage/FreeImage/Source/LibTIFF4/tif_extension.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_extension.c,v 1.7 2010-03-10 18:56:48 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tif_fax3.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_fax3.c --- FreeImage/Source/LibTIFF4/tif_fax3.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_fax3.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_fax3.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_fax3.c,v 1.74 2012-06-21 02:01:31 fwarmerdam Exp $ */ /* * Copyright (c) 1990-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tif_fax3.h FreeImage-tiff4.0.4/Source/LibTIFF4/tif_fax3.h --- FreeImage/Source/LibTIFF4/tif_fax3.h 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_fax3.h 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_fax3.h,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_fax3.h,v 1.9 2011-03-10 20:23:07 fwarmerdam Exp $ */ /* * Copyright (c) 1990-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tiffconf.vc.h FreeImage-tiff4.0.4/Source/LibTIFF4/tiffconf.vc.h --- FreeImage/Source/LibTIFF4/tiffconf.vc.h 2010-03-15 03:46:58.000000000 +0100 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tiffconf.vc.h 2015-09-04 19:54:56.000000000 +0200 @@ -55,22 +55,23 @@ /* Unsigned 64-bit type */ #define TIFF_UINT64_T unsigned __int64 +#if _WIN64 +/* + Windows 64-bit build +*/ + /* Signed size type */ -#if defined(_WIN64) -#define TIFF_SSIZE_T signed __int64 -#else -#define TIFF_SSIZE_T signed int -#endif +# define TIFF_SSIZE_T TIFF_INT64_T -/* Signed size type formatter */ -#if defined(_WIN64) -#define TIFF_SSIZE_FORMAT "%I64d" #else -#define TIFF_SSIZE_FORMAT "%ld" -#endif +/* + Windows 32-bit build +*/ -/* Pointer difference type */ -#define TIFF_PTRDIFF_T long +/* Signed size type */ +# define TIFF_SSIZE_T signed int + +#endif /* Compatibility stuff. */ diff -aur FreeImage/Source/LibTIFF4/tiffconf.wince.h FreeImage-tiff4.0.4/Source/LibTIFF4/tiffconf.wince.h --- FreeImage/Source/LibTIFF4/tiffconf.wince.h 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tiffconf.wince.h 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tiffconf.wince.h,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tiffconf.wince.h,v 1.3 2010-03-10 18:56:49 bfriesen Exp $ */ /* * Windows CE platform tiffconf.wince.h diff -aur FreeImage/Source/LibTIFF4/tiff.h FreeImage-tiff4.0.4/Source/LibTIFF4/tiff.h --- FreeImage/Source/LibTIFF4/tiff.h 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tiff.h 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tiff.h,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tiff.h,v 1.69 2014-04-02 17:23:06 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -201,6 +201,7 @@ #define PHOTOMETRIC_CIELAB 8 /* !1976 CIE L*a*b* */ #define PHOTOMETRIC_ICCLAB 9 /* ICC L*a*b* [Adobe TIFF Technote 4] */ #define PHOTOMETRIC_ITULAB 10 /* ITU L*a*b* */ +#define PHOTOMETRIC_CFA 32803 /* color filter array */ #define PHOTOMETRIC_LOGL 32844 /* CIE Log2(L) */ #define PHOTOMETRIC_LOGLUV 32845 /* CIE Log2(L) (u',v') */ #define TIFFTAG_THRESHHOLDING 263 /* +thresholding used on data */ @@ -402,6 +403,8 @@ #define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306 /* tag 33405 is a private tag registered to Eastman Kodak */ #define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */ +#define TIFFTAG_CFAREPEATPATTERNDIM 33421 /* dimensions of CFA pattern */ +#define TIFFTAG_CFAPATTERN 33422 /* color filter array pattern */ /* tag 33432 is listed in the 6.0 spec w/ unknown ownership */ #define TIFFTAG_COPYRIGHT 33432 /* copyright string */ /* IPTC TAG from RichTIFF specifications */ diff -aur FreeImage/Source/LibTIFF4/tiffio.h FreeImage-tiff4.0.4/Source/LibTIFF4/tiffio.h --- FreeImage/Source/LibTIFF4/tiffio.h 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tiffio.h 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tiffio.h,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tiffio.h,v 1.91 2012-07-29 15:45:29 tgl Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tiffio.hxx FreeImage-tiff4.0.4/Source/LibTIFF4/tiffio.hxx --- FreeImage/Source/LibTIFF4/tiffio.hxx 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tiffio.hxx 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tiffio.hxx,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tiffio.hxx,v 1.3 2010-06-08 18:55:15 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tiffiop.h FreeImage-tiff4.0.4/Source/LibTIFF4/tiffiop.h --- FreeImage/Source/LibTIFF4/tiffiop.h 2015-09-04 19:55:45.570567476 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tiffiop.h 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tiffiop.h,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tiffiop.h,v 1.84 2012-05-30 01:50:17 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -30,9 +30,7 @@ * ``Library-private'' definitions. */ -#include <tiffconf.h> -#define HAVE_SEARCH_H -#define HAVE_FCNTL_H +#include "tif_config.h" #ifdef HAVE_FCNTL_H # include <fcntl.h> diff -aur FreeImage/Source/LibTIFF4/tif_flush.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_flush.c --- FreeImage/Source/LibTIFF4/tif_flush.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_flush.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_flush.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_flush.c,v 1.9 2010-03-31 06:40:10 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tiffvers.h FreeImage-tiff4.0.4/Source/LibTIFF4/tiffvers.h --- FreeImage/Source/LibTIFF4/tiffvers.h 2012-10-07 23:28:28.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tiffvers.h 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -#define TIFFLIB_VERSION_STR "LIBTIFF, Version 4.0.3\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc." +#define TIFFLIB_VERSION_STR "LIBTIFF, Version 4.0.4\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc." /* * This define can be used in code that requires * compilation-related definitions specific to a @@ -6,4 +6,4 @@ * version checking should be done based on the * string returned by TIFFGetVersion. */ -#define TIFFLIB_VERSION 20120922 +#define TIFFLIB_VERSION 20150621 diff -aur FreeImage/Source/LibTIFF4/tif_getimage.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_getimage.c --- FreeImage/Source/LibTIFF4/tif_getimage.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_getimage.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_getimage.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_getimage.c,v 1.90 2015-06-17 01:34:08 bfriesen Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler @@ -182,8 +182,23 @@ "Planarconfiguration", td->td_planarconfig); return (0); } + if( td->td_samplesperpixel != 3 ) + { + sprintf(emsg, + "Sorry, can not handle image with %s=%d", + "Samples/pixel", td->td_samplesperpixel); + return 0; + } break; case PHOTOMETRIC_CIELAB: + if( td->td_samplesperpixel != 3 || td->td_bitspersample != 8 ) + { + sprintf(emsg, + "Sorry, can not handle image with %s=%d and %s=%d", + "Samples/pixel", td->td_samplesperpixel, + "Bits/sample", td->td_bitspersample); + return 0; + } break; default: sprintf(emsg, "Sorry, can not handle image with %s=%d", @@ -597,6 +612,10 @@ int32 fromskew, toskew; uint32 nrow; int ret = 1, flip; + uint32 this_tw, tocol; + int32 this_toskew, leftmost_toskew; + int32 leftmost_fromskew; + uint32 leftmost_tw; buf = (unsigned char*) _TIFFmalloc(TIFFTileSize(tif)); if (buf == 0) { @@ -617,37 +636,50 @@ toskew = -(int32)(tw - w); } + /* + * Leftmost tile is clipped on left side if col_offset > 0. + */ + leftmost_fromskew = img->col_offset % tw; + leftmost_tw = tw - leftmost_fromskew; + leftmost_toskew = toskew + leftmost_fromskew; for (row = 0; row < h; row += nrow) { rowstoread = th - (row + img->row_offset) % th; nrow = (row + rowstoread > h ? h - row : rowstoread); - for (col = 0; col < w; col += tw) + fromskew = leftmost_fromskew; + this_tw = leftmost_tw; + this_toskew = leftmost_toskew; + tocol = 0; + col = img->col_offset; + while (tocol < w) { - if (TIFFReadTile(tif, buf, col+img->col_offset, + if (TIFFReadTile(tif, buf, col, row+img->row_offset, 0, 0)==(tmsize_t)(-1) && img->stoponerr) { ret = 0; break; } - - pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif); - - if (col + tw > w) - { - /* - * Tile is clipped horizontally. Calculate - * visible portion and skewing factors. - */ - uint32 npix = w - col; - fromskew = tw - npix; - (*put)(img, raster+y*w+col, col, y, - npix, nrow, fromskew, toskew + fromskew, buf + pos); - } - else - { - (*put)(img, raster+y*w+col, col, y, tw, nrow, 0, toskew, buf + pos); - } - } + pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif) + \ + ((tmsize_t) fromskew * img->samplesperpixel); + if (tocol + this_tw > w) + { + /* + * Rightmost tile is clipped on right side. + */ + fromskew = tw - (w - tocol); + this_tw = tw - fromskew; + this_toskew = toskew + fromskew; + } + (*put)(img, raster+y*w+tocol, tocol, y, this_tw, nrow, fromskew, this_toskew, buf + pos); + tocol += this_tw; + col += this_tw; + /* + * After the leftmost tile, tiles are no longer clipped on left side. + */ + fromskew = 0; + this_tw = tw; + this_toskew = toskew; + } y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow); } @@ -698,6 +730,10 @@ uint32 nrow; int ret = 1, flip; int colorchannels; + uint32 this_tw, tocol; + int32 this_toskew, leftmost_toskew; + int32 leftmost_fromskew; + uint32 leftmost_tw; tilesize = TIFFTileSize(tif); bufsize = TIFFSafeMultiply(tmsize_t,alpha?4:3,tilesize); @@ -742,20 +778,31 @@ break; } + /* + * Leftmost tile is clipped on left side if col_offset > 0. + */ + leftmost_fromskew = img->col_offset % tw; + leftmost_tw = tw - leftmost_fromskew; + leftmost_toskew = toskew + leftmost_fromskew; for (row = 0; row < h; row += nrow) { rowstoread = th - (row + img->row_offset) % th; nrow = (row + rowstoread > h ? h - row : rowstoread); - for (col = 0; col < w; col += tw) + fromskew = leftmost_fromskew; + this_tw = leftmost_tw; + this_toskew = leftmost_toskew; + tocol = 0; + col = img->col_offset; + while (tocol < w) { - if (TIFFReadTile(tif, p0, col+img->col_offset, + if (TIFFReadTile(tif, p0, col, row+img->row_offset,0,0)==(tmsize_t)(-1) && img->stoponerr) { ret = 0; break; } if (colorchannels > 1 - && TIFFReadTile(tif, p1, col+img->col_offset, + && TIFFReadTile(tif, p1, col, row+img->row_offset,0,1) == (tmsize_t)(-1) && img->stoponerr) { @@ -763,7 +810,7 @@ break; } if (colorchannels > 1 - && TIFFReadTile(tif, p2, col+img->col_offset, + && TIFFReadTile(tif, p2, col, row+img->row_offset,0,2) == (tmsize_t)(-1) && img->stoponerr) { @@ -771,7 +818,7 @@ break; } if (alpha - && TIFFReadTile(tif,pa,col+img->col_offset, + && TIFFReadTile(tif,pa,col, row+img->row_offset,0,colorchannels) == (tmsize_t)(-1) && img->stoponerr) { @@ -779,23 +826,27 @@ break; } - pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif); - - if (col + tw > w) + pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif) + \ + ((tmsize_t) fromskew * img->samplesperpixel); + if (tocol + this_tw > w) { /* - * Tile is clipped horizontally. Calculate - * visible portion and skewing factors. + * Rightmost tile is clipped on right side. */ - uint32 npix = w - col; - fromskew = tw - npix; - (*put)(img, raster+y*w+col, col, y, - npix, nrow, fromskew, toskew + fromskew, - p0 + pos, p1 + pos, p2 + pos, (alpha?(pa+pos):NULL)); - } else { - (*put)(img, raster+y*w+col, col, y, - tw, nrow, 0, toskew, p0 + pos, p1 + pos, p2 + pos, (alpha?(pa+pos):NULL)); - } + fromskew = tw - (w - tocol); + this_tw = tw - fromskew; + this_toskew = toskew + fromskew; + } + (*put)(img, raster+y*w+tocol, tocol, y, this_tw, nrow, fromskew, this_toskew, \ + p0 + pos, p1 + pos, p2 + pos, (alpha?(pa+pos):NULL)); + tocol += this_tw; + col += this_tw; + /* + * After the leftmost tile, tiles are no longer clipped on left side. + */ + fromskew = 0; + this_tw = tw; + this_toskew = toskew; } y += (flip & FLIP_VERTICALLY ?-(int32) nrow : (int32) nrow); @@ -842,6 +893,12 @@ int32 fromskew, toskew; int ret = 1, flip; + TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING, &subsamplinghor, &subsamplingver); + if( subsamplingver == 0 ) { + TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "Invalid vertical YCbCr subsampling"); + return (0); + } + buf = (unsigned char*) _TIFFmalloc(TIFFStripSize(tif)); if (buf == 0) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "No space for strip buffer"); @@ -859,7 +916,7 @@ } TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); - TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING, &subsamplinghor, &subsamplingver); + scanline = TIFFScanlineSize(tif); fromskew = (w < imagewidth ? imagewidth - w : 0); for (row = 0; row < h; row += nrow) @@ -879,7 +936,8 @@ break; } - pos = ((row + img->row_offset) % rowsperstrip) * scanline; + pos = ((row + img->row_offset) % rowsperstrip) * scanline + \ + ((tmsize_t) img->col_offset * img->samplesperpixel); (*put)(img, raster+y*w, 0, y, w, nrow, fromskew, toskew, buf + pos); y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow); } @@ -1010,7 +1068,8 @@ } } - pos = ((row + img->row_offset) % rowsperstrip) * scanline; + pos = ((row + img->row_offset) % rowsperstrip) * scanline + \ + ((tmsize_t) img->col_offset * img->samplesperpixel); (*put)(img, raster+y*w, 0, y, w, nrow, fromskew, toskew, p0 + pos, p1 + pos, p2 + pos, (alpha?(pa+pos):NULL)); y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow); @@ -1852,7 +1911,7 @@ (void) y; fromskew = (fromskew * 10) / 4; - if ((h & 3) == 0 && (w & 1) == 0) { + if ((w & 3) == 0 && (h & 1) == 0) { for (; h >= 2; h -= 2) { x = w>>2; do { @@ -1929,7 +1988,7 @@ /* XXX adjust fromskew */ do { x = w>>2; - do { + while(x>0) { int32 Cb = pp[4]; int32 Cr = pp[5]; @@ -1940,7 +1999,8 @@ cp += 4; pp += 6; - } while (--x); + x--; + } if( (w&3) != 0 ) { @@ -2031,7 +2091,7 @@ fromskew = (fromskew * 4) / 2; do { x = w>>1; - do { + while(x>0) { int32 Cb = pp[2]; int32 Cr = pp[3]; @@ -2040,7 +2100,8 @@ cp += 2; pp += 4; - } while (--x); + x --; + } if( (w&1) != 0 ) { @@ -2541,7 +2602,7 @@ * must always be <= horizontal subsampling; so * there are only a few possibilities and we just * enumerate the cases. - * Joris: added support for the [1,2] case, nonetheless, to accomodate + * Joris: added support for the [1,2] case, nonetheless, to accommodate * some OJPEG files */ uint16 SubsamplingHor; diff -aur FreeImage/Source/LibTIFF4/tif_jbig.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_jbig.c --- FreeImage/Source/LibTIFF4/tif_jbig.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_jbig.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_jbig.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_jbig.c,v 1.15 2010-03-10 18:56:48 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tif_jpeg.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_jpeg.c --- FreeImage/Source/LibTIFF4/tif_jpeg.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_jpeg.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_jpeg.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_jpeg.c,v 1.118 2015-06-10 13:17:41 bfriesen Exp $ */ /* * Copyright (c) 1994-1997 Sam Leffler @@ -85,8 +85,8 @@ # define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ #endif -#include "../LibJPEG/jpeglib.h" -#include "../LibJPEG/jerror.h" +#include "jpeglib.h" +#include "jerror.h" /* * Do we want to do special processing suitable for when JSAMPLE is a @@ -658,7 +658,9 @@ #define JPEG_MARKER_SOF0 0xC0 #define JPEG_MARKER_SOF1 0xC1 -#define JPEG_MARKER_SOF3 0xC3 +#define JPEG_MARKER_SOF2 0xC2 +#define JPEG_MARKER_SOF9 0xC9 +#define JPEG_MARKER_SOF10 0xCA #define JPEG_MARKER_DHT 0xC4 #define JPEG_MARKER_SOI 0xD8 #define JPEG_MARKER_SOS 0xDA @@ -729,6 +731,7 @@ _TIFFFillStriles( tif ); if( tif->tif_dir.td_stripbytecount == NULL + || tif->tif_dir.td_stripoffset == NULL || tif->tif_dir.td_stripbytecount[0] == 0 ) { /* Do not even try to check if the first strip/tile does not @@ -816,8 +819,11 @@ JPEGFixupTagsSubsamplingSkip(data,n); } break; - case JPEG_MARKER_SOF0: - case JPEG_MARKER_SOF1: + case JPEG_MARKER_SOF0: /* Baseline sequential Huffman */ + case JPEG_MARKER_SOF1: /* Extended sequential Huffman */ + case JPEG_MARKER_SOF2: /* Progressive Huffman: normally not allowed by TechNote, but that doesn't hurt supporting it */ + case JPEG_MARKER_SOF9: /* Extended sequential arithmetic */ + case JPEG_MARKER_SOF10: /* Progressive arithmetic: normally not allowed by TechNote, but that doesn't hurt supporting it */ /* this marker contains the subsampling factors we're scanning for */ { uint16 n; @@ -992,7 +998,7 @@ /* * Set up for decoding a strip or tile. */ -static int +/*ARGSUSED*/ static int JPEGPreDecode(TIFF* tif, uint16 s) { JPEGState *sp = JState(tif); @@ -1168,7 +1174,8 @@ * Decode a chunk of pixels. * "Standard" case: returned data is not downsampled. */ -/*ARGSUSED*/ static int +#if !JPEG_LIB_MK1_OR_12BIT +static int JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) { JPEGState *sp = JState(tif); @@ -1187,91 +1194,137 @@ nrows = cc / sp->bytesperline; if (cc % sp->bytesperline) - TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "fractional scanline not read"); + TIFFWarningExt(tif->tif_clientdata, tif->tif_name, + "fractional scanline not read"); if( nrows > (tmsize_t) sp->cinfo.d.image_height ) nrows = sp->cinfo.d.image_height; /* data is expected to be read in multiples of a scanline */ if (nrows) - { - JSAMPROW line_work_buf = NULL; + { + do + { + /* + * In the libjpeg6b-9a 8bit case. We read directly into + * the TIFF buffer. + */ + JSAMPROW bufptr = (JSAMPROW)buf; - /* - * For 6B, only use temporary buffer for 12 bit imagery. - * For Mk1 always use it. - */ -#if !defined(JPEG_LIB_MK1) - if( sp->cinfo.d.data_precision == 12 ) -#endif - { - line_work_buf = (JSAMPROW) - _TIFFmalloc(sizeof(short) * sp->cinfo.d.output_width - * sp->cinfo.d.num_components ); - } + if (TIFFjpeg_read_scanlines(sp, &bufptr, 1) != 1) + return (0); - do { - if( line_work_buf != NULL ) - { - /* - * In the MK1 case, we aways read into a 16bit buffer, and then - * pack down to 12bit or 8bit. In 6B case we only read into 16 - * bit buffer for 12bit data, which we need to repack. - */ - if (TIFFjpeg_read_scanlines(sp, &line_work_buf, 1) != 1) - return (0); + ++tif->tif_row; + buf += sp->bytesperline; + cc -= sp->bytesperline; + } while (--nrows > 0); + } - if( sp->cinfo.d.data_precision == 12 ) - { - int value_pairs = (sp->cinfo.d.output_width - * sp->cinfo.d.num_components) / 2; - int iPair; + /* Update information on consumed data */ + tif->tif_rawcp = (uint8*) sp->src.next_input_byte; + tif->tif_rawcc = sp->src.bytes_in_buffer; + + /* Close down the decompressor if we've finished the strip or tile. */ + return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height + || TIFFjpeg_finish_decompress(sp); +} +#endif /* !JPEG_LIB_MK1_OR_12BIT */ - for( iPair = 0; iPair < value_pairs; iPair++ ) - { - unsigned char *out_ptr = - ((unsigned char *) buf) + iPair * 3; - JSAMPLE *in_ptr = line_work_buf + iPair * 2; +#if JPEG_LIB_MK1_OR_12BIT +/*ARGSUSED*/ static int +JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) +{ + JPEGState *sp = JState(tif); + tmsize_t nrows; + (void) s; - out_ptr[0] = (in_ptr[0] & 0xff0) >> 4; - out_ptr[1] = ((in_ptr[0] & 0xf) << 4) - | ((in_ptr[1] & 0xf00) >> 8); - out_ptr[2] = ((in_ptr[1] & 0xff) >> 0); - } - } - else if( sp->cinfo.d.data_precision == 8 ) - { - int value_count = (sp->cinfo.d.output_width - * sp->cinfo.d.num_components); - int iValue; + /* + ** Update available information, buffer may have been refilled + ** between decode requests + */ + sp->src.next_input_byte = (const JOCTET*) tif->tif_rawcp; + sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc; - for( iValue = 0; iValue < value_count; iValue++ ) - { - ((unsigned char *) buf)[iValue] = - line_work_buf[iValue] & 0xff; - } - } - } - else - { - /* - * In the libjpeg6b 8bit case. We read directly into the - * TIFF buffer. - */ - JSAMPROW bufptr = (JSAMPROW)buf; + if( sp->bytesperline == 0 ) + return 0; + + nrows = cc / sp->bytesperline; + if (cc % sp->bytesperline) + TIFFWarningExt(tif->tif_clientdata, tif->tif_name, + "fractional scanline not read"); - if (TIFFjpeg_read_scanlines(sp, &bufptr, 1) != 1) - return (0); - } + if( nrows > (tmsize_t) sp->cinfo.d.image_height ) + nrows = sp->cinfo.d.image_height; - ++tif->tif_row; - buf += sp->bytesperline; - cc -= sp->bytesperline; - } while (--nrows > 0); + /* data is expected to be read in multiples of a scanline */ + if (nrows) + { + JSAMPROW line_work_buf = NULL; - if( line_work_buf != NULL ) - _TIFFfree( line_work_buf ); - } + /* + * For 6B, only use temporary buffer for 12 bit imagery. + * For Mk1 always use it. + */ + if( sp->cinfo.d.data_precision == 12 ) + { + line_work_buf = (JSAMPROW) + _TIFFmalloc(sizeof(short) * sp->cinfo.d.output_width + * sp->cinfo.d.num_components ); + } + + do + { + if( line_work_buf != NULL ) + { + /* + * In the MK1 case, we aways read into a 16bit + * buffer, and then pack down to 12bit or 8bit. + * In 6B case we only read into 16 bit buffer + * for 12bit data, which we need to repack. + */ + if (TIFFjpeg_read_scanlines(sp, &line_work_buf, 1) != 1) + return (0); + + if( sp->cinfo.d.data_precision == 12 ) + { + int value_pairs = (sp->cinfo.d.output_width + * sp->cinfo.d.num_components) / 2; + int iPair; + + for( iPair = 0; iPair < value_pairs; iPair++ ) + { + unsigned char *out_ptr = + ((unsigned char *) buf) + iPair * 3; + JSAMPLE *in_ptr = line_work_buf + iPair * 2; + + out_ptr[0] = (in_ptr[0] & 0xff0) >> 4; + out_ptr[1] = ((in_ptr[0] & 0xf) << 4) + | ((in_ptr[1] & 0xf00) >> 8); + out_ptr[2] = ((in_ptr[1] & 0xff) >> 0); + } + } + else if( sp->cinfo.d.data_precision == 8 ) + { + int value_count = (sp->cinfo.d.output_width + * sp->cinfo.d.num_components); + int iValue; + + for( iValue = 0; iValue < value_count; iValue++ ) + { + ((unsigned char *) buf)[iValue] = + line_work_buf[iValue] & 0xff; + } + } + } + + ++tif->tif_row; + buf += sp->bytesperline; + cc -= sp->bytesperline; + } while (--nrows > 0); + + if( line_work_buf != NULL ) + _TIFFfree( line_work_buf ); + } /* Update information on consumed data */ tif->tif_rawcp = (uint8*) sp->src.next_input_byte; @@ -1279,8 +1332,9 @@ /* Close down the decompressor if we've finished the strip or tile. */ return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height - || TIFFjpeg_finish_decompress(sp); + || TIFFjpeg_finish_decompress(sp); } +#endif /* JPEG_LIB_MK1_OR_12BIT */ /*ARGSUSED*/ static int DecodeRowError(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) @@ -1451,6 +1505,15 @@ } static void +suppress_quant_table (JPEGState* sp, int tblno) +{ + JQUANT_TBL* qtbl; + + if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL) + qtbl->sent_table = TRUE; +} + +static void unsuppress_huff_table (JPEGState* sp, int tblno) { JHUFF_TBL* htbl; @@ -1461,6 +1524,17 @@ htbl->sent_table = FALSE; } +static void +suppress_huff_table (JPEGState* sp, int tblno) +{ + JHUFF_TBL* htbl; + + if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL) + htbl->sent_table = TRUE; + if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL) + htbl->sent_table = TRUE; +} + static int prepare_JPEGTables(TIFF* tif) { @@ -1510,17 +1584,38 @@ assert(sp != NULL); assert(!sp->cinfo.comm.is_decompressor); + sp->photometric = td->td_photometric; + /* * Initialize all JPEG parameters to default values. * Note that jpeg_set_defaults needs legal values for * in_color_space and input_components. */ - sp->cinfo.c.in_color_space = JCS_UNKNOWN; - sp->cinfo.c.input_components = 1; + if (td->td_planarconfig == PLANARCONFIG_CONTIG) { + sp->cinfo.c.input_components = td->td_samplesperpixel; + if (sp->photometric == PHOTOMETRIC_YCBCR) { + if (sp->jpegcolormode == JPEGCOLORMODE_RGB) { + sp->cinfo.c.in_color_space = JCS_RGB; + } else { + sp->cinfo.c.in_color_space = JCS_YCbCr; + } + } else { + if ((td->td_photometric == PHOTOMETRIC_MINISWHITE || td->td_photometric == PHOTOMETRIC_MINISBLACK) && td->td_samplesperpixel == 1) + sp->cinfo.c.in_color_space = JCS_GRAYSCALE; + else if (td->td_photometric == PHOTOMETRIC_RGB && td->td_samplesperpixel == 3) + sp->cinfo.c.in_color_space = JCS_RGB; + else if (td->td_photometric == PHOTOMETRIC_SEPARATED && td->td_samplesperpixel == 4) + sp->cinfo.c.in_color_space = JCS_CMYK; + else + sp->cinfo.c.in_color_space = JCS_UNKNOWN; + } + } else { + sp->cinfo.c.input_components = 1; + sp->cinfo.c.in_color_space = JCS_UNKNOWN; + } if (!TIFFjpeg_set_defaults(sp)) return (0); /* Set per-file parameters */ - sp->photometric = td->td_photometric; switch (sp->photometric) { case PHOTOMETRIC_YCBCR: sp->h_sampling = td->td_ycbcrsubsampling[0]; @@ -1680,10 +1775,7 @@ if (td->td_planarconfig == PLANARCONFIG_CONTIG) { sp->cinfo.c.input_components = td->td_samplesperpixel; if (sp->photometric == PHOTOMETRIC_YCBCR) { - if (sp->jpegcolormode == JPEGCOLORMODE_RGB) { - sp->cinfo.c.in_color_space = JCS_RGB; - } else { - sp->cinfo.c.in_color_space = JCS_YCbCr; + if (sp->jpegcolormode != JPEGCOLORMODE_RGB) { if (sp->h_sampling != 1 || sp->v_sampling != 1) downsampled_input = TRUE; } @@ -1696,21 +1788,11 @@ sp->cinfo.c.comp_info[0].h_samp_factor = sp->h_sampling; sp->cinfo.c.comp_info[0].v_samp_factor = sp->v_sampling; } else { - if ((td->td_photometric == PHOTOMETRIC_MINISWHITE || td->td_photometric == PHOTOMETRIC_MINISBLACK) && td->td_samplesperpixel == 1) - sp->cinfo.c.in_color_space = JCS_GRAYSCALE; - else if (td->td_photometric == PHOTOMETRIC_RGB && td->td_samplesperpixel == 3) - sp->cinfo.c.in_color_space = JCS_RGB; - else if (td->td_photometric == PHOTOMETRIC_SEPARATED && td->td_samplesperpixel == 4) - sp->cinfo.c.in_color_space = JCS_CMYK; - else - sp->cinfo.c.in_color_space = JCS_UNKNOWN; if (!TIFFjpeg_set_colorspace(sp, sp->cinfo.c.in_color_space)) return (0); /* jpeg_set_colorspace set all sampling factors to 1 */ } } else { - sp->cinfo.c.input_components = 1; - sp->cinfo.c.in_color_space = JCS_UNKNOWN; if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN)) return (0); sp->cinfo.c.comp_info[0].component_id = s; @@ -1725,14 +1807,30 @@ sp->cinfo.c.write_JFIF_header = FALSE; sp->cinfo.c.write_Adobe_marker = FALSE; /* set up table handling correctly */ - if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE)) + /* calling TIFFjpeg_set_quality() causes quantization tables to be flagged */ + /* as being to be emitted, which we don't want in the JPEGTABLESMODE_QUANT */ + /* mode, so we must manually suppress them. However TIFFjpeg_set_quality() */ + /* should really be called when dealing with files with directories with */ + /* mixed qualities. see http://trac.osgeo.org/gdal/ticket/3539 */ + if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE)) return (0); - if (! (sp->jpegtablesmode & JPEGTABLESMODE_QUANT)) { + if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT) { + suppress_quant_table(sp, 0); + suppress_quant_table(sp, 1); + } + else { unsuppress_quant_table(sp, 0); unsuppress_quant_table(sp, 1); } if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF) + { + /* Explicit suppression is only needed if we did not go through the */ + /* prepare_JPEGTables() code path, which may be the case if updating */ + /* an existing file */ + suppress_huff_table(sp, 0); + suppress_huff_table(sp, 1); sp->cinfo.c.optimize_coding = FALSE; + } else sp->cinfo.c.optimize_coding = TRUE; if (downsampled_input) { @@ -1966,13 +2064,10 @@ tif->tif_tagmethods.vgetfield = sp->vgetparent; tif->tif_tagmethods.vsetfield = sp->vsetparent; tif->tif_tagmethods.printdir = sp->printdir; - - if( sp != NULL ) { - if( sp->cinfo_initialized ) - TIFFjpeg_destroy(sp); /* release libjpeg resources */ - if (sp->jpegtables) /* tag value */ - _TIFFfree(sp->jpegtables); - } + if( sp->cinfo_initialized ) + TIFFjpeg_destroy(sp); /* release libjpeg resources */ + if (sp->jpegtables) /* tag value */ + _TIFFfree(sp->jpegtables); _TIFFfree(tif->tif_data); /* release local state */ tif->tif_data = NULL; diff -aur FreeImage/Source/LibTIFF4/tif_luv.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_luv.c --- FreeImage/Source/LibTIFF4/tif_luv.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_luv.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_luv.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_luv.c,v 1.40 2015-06-21 01:09:09 bfriesen Exp $ */ /* * Copyright (c) 1997 Greg Ward Larson @@ -379,6 +379,9 @@ { tmsize_t rowlen = TIFFScanlineSize(tif); + if (rowlen == 0) + return 0; + assert(cc%rowlen == 0); while (cc && (*tif->tif_decoderow)(tif, bp, rowlen, s)) bp += rowlen, cc -= rowlen; @@ -395,6 +398,9 @@ { tmsize_t rowlen = TIFFTileRowSize(tif); + if (rowlen == 0) + return 0; + assert(cc%rowlen == 0); while (cc && (*tif->tif_decoderow)(tif, bp, rowlen, s)) bp += rowlen, cc -= rowlen; @@ -644,6 +650,9 @@ { tmsize_t rowlen = TIFFScanlineSize(tif); + if (rowlen == 0) + return 0; + assert(cc%rowlen == 0); while (cc && (*tif->tif_encoderow)(tif, bp, rowlen, s) == 1) bp += rowlen, cc -= rowlen; @@ -659,6 +668,9 @@ { tmsize_t rowlen = TIFFTileRowSize(tif); + if (rowlen == 0) + return 0; + assert(cc%rowlen == 0); while (cc && (*tif->tif_encoderow)(tif, bp, rowlen, s) == 1) bp += rowlen, cc -= rowlen; @@ -683,7 +695,9 @@ #ifndef M_PI #define M_PI 3.14159265358979323846 #endif +#undef log2 /* Conflict with C'99 function */ #define log2(x) ((1./M_LN2)*log(x)) +#undef exp2 /* Conflict with C'99 function */ #define exp2(x) exp(M_LN2*(x)) #define itrunc(x,m) ((m)==SGILOGENCODE_NODITHER ? \ diff -aur FreeImage/Source/LibTIFF4/tif_lzma.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_lzma.c --- FreeImage/Source/LibTIFF4/tif_lzma.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_lzma.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_lzma.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_lzma.c,v 1.4 2011-12-22 00:29:29 bfriesen Exp $ */ /* * Copyright (c) 2010, Andrey Kiselev <dron@ak4719.spb.edu> diff -aur FreeImage/Source/LibTIFF4/tif_lzw.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_lzw.c --- FreeImage/Source/LibTIFF4/tif_lzw.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_lzw.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_lzw.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_lzw.c,v 1.47 2015-06-13 05:03:50 faxguy Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -268,6 +268,8 @@ if( sp->dec_codetab == NULL ) { tif->tif_setupdecode( tif ); + if( sp->dec_codetab == NULL ) + return (0); } /* @@ -434,16 +436,18 @@ if (code == CODE_EOI) break; if (code == CODE_CLEAR) { - free_entp = sp->dec_codetab + CODE_FIRST; - _TIFFmemset(free_entp, 0, - (CSIZE - CODE_FIRST) * sizeof (code_t)); - nbits = BITS_MIN; - nbitsmask = MAXCODE(BITS_MIN); - maxcodep = sp->dec_codetab + nbitsmask-1; - NextCode(tif, sp, bp, code, GetNextCode); + do { + free_entp = sp->dec_codetab + CODE_FIRST; + _TIFFmemset(free_entp, 0, + (CSIZE - CODE_FIRST) * sizeof (code_t)); + nbits = BITS_MIN; + nbitsmask = MAXCODE(BITS_MIN); + maxcodep = sp->dec_codetab + nbitsmask-1; + NextCode(tif, sp, bp, code, GetNextCode); + } while (code == CODE_CLEAR); /* consecutive CODE_CLEAR codes */ if (code == CODE_EOI) break; - if (code >= CODE_CLEAR) { + if (code > CODE_CLEAR) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "LZWDecode: Corrupted LZW table at scanline %d", tif->tif_row); @@ -653,16 +657,18 @@ if (code == CODE_EOI) break; if (code == CODE_CLEAR) { - free_entp = sp->dec_codetab + CODE_FIRST; - _TIFFmemset(free_entp, 0, - (CSIZE - CODE_FIRST) * sizeof (code_t)); - nbits = BITS_MIN; - nbitsmask = MAXCODE(BITS_MIN); - maxcodep = sp->dec_codetab + nbitsmask; - NextCode(tif, sp, bp, code, GetNextCodeCompat); + do { + free_entp = sp->dec_codetab + CODE_FIRST; + _TIFFmemset(free_entp, 0, + (CSIZE - CODE_FIRST) * sizeof (code_t)); + nbits = BITS_MIN; + nbitsmask = MAXCODE(BITS_MIN); + maxcodep = sp->dec_codetab + nbitsmask; + NextCode(tif, sp, bp, code, GetNextCodeCompat); + } while (code == CODE_CLEAR); /* consecutive CODE_CLEAR codes */ if (code == CODE_EOI) break; - if (code >= CODE_CLEAR) { + if (code > CODE_CLEAR) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "LZWDecode: Corrupted LZW table at scanline %d", tif->tif_row); diff -aur FreeImage/Source/LibTIFF4/tif_next.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_next.c --- FreeImage/Source/LibTIFF4/tif_next.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_next.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_next.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_next.c,v 1.16 2014-12-29 12:09:11 erouault Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -71,7 +71,7 @@ TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read"); return (0); } - for (row = buf; occ > 0; occ -= scanline, row += scanline) { + for (row = buf; cc > 0 && occ > 0; occ -= scanline, row += scanline) { n = *bp++, cc--; switch (n) { case LITERALROW: @@ -90,6 +90,8 @@ * The scanline has a literal span that begins at some * offset. */ + if( cc < 4 ) + goto bad; off = (bp[0] * 256) + bp[1]; n = (bp[2] * 256) + bp[3]; if (cc < 4+n || off+n > scanline) @@ -102,6 +104,8 @@ default: { uint32 npixels = 0, grey; uint32 imagewidth = tif->tif_dir.td_imagewidth; + if( isTiled(tif) ) + imagewidth = tif->tif_dir.td_tilewidth; /* * The scanline is composed of a sequence of constant @@ -139,10 +143,27 @@ return (0); } +static int +NeXTPreDecode(TIFF* tif, uint16 s) +{ + static const char module[] = "NeXTPreDecode"; + TIFFDirectory *td = &tif->tif_dir; + (void)s; + + if( td->td_bitspersample != 2 ) + { + TIFFErrorExt(tif->tif_clientdata, module, "Unsupported BitsPerSample = %d", + td->td_bitspersample); + return (0); + } + return (1); +} + int TIFFInitNeXT(TIFF* tif, int scheme) { (void) scheme; + tif->tif_predecode = NeXTPreDecode; tif->tif_decoderow = NeXTDecode; tif->tif_decodestrip = NeXTDecode; tif->tif_decodetile = NeXTDecode; diff -aur FreeImage/Source/LibTIFF4/tif_ojpeg.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_ojpeg.c --- FreeImage/Source/LibTIFF4/tif_ojpeg.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_ojpeg.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_ojpeg.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_ojpeg.c,v 1.60 2015-05-31 00:38:46 bfriesen Exp $ */ /* WARNING: The type of JPEG encapsulation defined by the TIFF Version 6.0 specification is now totally obsolete and deprecated for new applications and @@ -39,7 +39,7 @@ OF THIS SOFTWARE. Joris Van Damme and/or AWare Systems may be available for custom - developement. If you like what you see, and need anything similar or related, + development. If you like what you see, and need anything similar or related, contact <info@awaresystems.be>. */ @@ -141,7 +141,7 @@ * OJPEG_BUFFER: Define the size of the desired buffer here. Should be small enough so as to guarantee * instant processing, optimal streaming and optimal use of processor cache, but also big * enough so as to not result in significant call overhead. It should be at least a few - * bytes to accomodate some structures (this is verified in asserts), but it would not be + * bytes to accommodate some structures (this is verified in asserts), but it would not be * sensible to make it this small anyway, and it should be at most 64K since it is indexed * with uint16. We recommend 2K. * EGYPTIANWALK: You could also define EGYPTIANWALK here, but it is not used anywhere and has @@ -214,8 +214,8 @@ # define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ #endif -#include "../LibJPEG/jpeglib.h" -#include "../LibJPEG/jerror.h" +#include "jpeglib.h" +#include "jerror.h" typedef struct jpeg_error_mgr jpeg_error_mgr; typedef struct jpeg_common_struct jpeg_common_struct; @@ -528,6 +528,8 @@ uint32 ma; uint64* mb; uint32 n; + const TIFFField* fip; + switch(tag) { case TIFFTAG_JPEGIFOFFSET: @@ -597,7 +599,10 @@ default: return (*sp->vsetparent)(tif,tag,ap); } - TIFFSetFieldBit(tif,TIFFFieldWithTag(tif,tag)->field_bit); + fip = TIFFFieldWithTag(tif,tag); + if( fip == NULL ) /* shouldn't happen */ + return(0); + TIFFSetFieldBit(tif,fip->field_bit); tif->tif_flags|=TIFF_DIRTYDIRECT; return(1); } @@ -1492,14 +1497,17 @@ nb[sizeof(uint32)+1]=JPEG_MARKER_DHT; nb[sizeof(uint32)+2]=(m>>8); nb[sizeof(uint32)+3]=(m&255); - if (OJPEGReadBlock(sp,m-2,&nb[sizeof(uint32)+4])==0) + if (OJPEGReadBlock(sp,m-2,&nb[sizeof(uint32)+4])==0) { + _TIFFfree(nb); return(0); + } o=nb[sizeof(uint32)+4]; if ((o&240)==0) { if (3<o) { TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data"); + _TIFFfree(nb); return(0); } if (sp->dctable[o]!=0) @@ -1511,12 +1519,14 @@ if ((o&240)!=16) { TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data"); + _TIFFfree(nb); return(0); } o&=15; if (3<o) { TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data"); + _TIFFfree(nb); return(0); } if (sp->actable[o]!=0) @@ -1955,6 +1965,7 @@ break; case osibsJpegInterchangeFormat: sp->in_buffer_source=osibsStrile; + break; case osibsStrile: if (!_TIFFFillStriles( sp->tif ) || sp->tif->tif_dir.td_stripoffset == NULL diff -aur FreeImage/Source/LibTIFF4/tif_open.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_open.c --- FreeImage/Source/LibTIFF4/tif_open.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_open.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_open.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_open.c,v 1.46 2010-12-06 16:54:54 faxguy Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tif_packbits.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_packbits.c --- FreeImage/Source/LibTIFF4/tif_packbits.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_packbits.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_packbits.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_packbits.c,v 1.22 2012-06-20 05:25:33 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tif_pixarlog.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_pixarlog.c --- FreeImage/Source/LibTIFF4/tif_pixarlog.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_pixarlog.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_pixarlog.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_pixarlog.c,v 1.39 2012-12-10 17:27:13 tgl Exp $ */ /* * Copyright (c) 1996-1997 Sam Leffler @@ -90,7 +90,7 @@ */ #include "tif_predict.h" -#include "../ZLib/zlib.h" +#include "zlib.h" #include <stdio.h> #include <stdlib.h> @@ -644,6 +644,20 @@ return bytes; } +static tmsize_t +add_ms(tmsize_t m1, tmsize_t m2) +{ + tmsize_t bytes = m1 + m2; + + /* if either input is zero, assume overflow already occurred */ + if (m1 == 0 || m2 == 0) + bytes = 0; + else if (bytes <= m1 || bytes <= m2) + bytes = 0; + + return bytes; +} + static int PixarLogFixupTags(TIFF* tif) { @@ -671,9 +685,11 @@ td->td_samplesperpixel : 1); tbuf_size = multiply_ms(multiply_ms(multiply_ms(sp->stride, td->td_imagewidth), td->td_rowsperstrip), sizeof(uint16)); + /* add one more stride in case input ends mid-stride */ + tbuf_size = add_ms(tbuf_size, sizeof(uint16) * sp->stride); if (tbuf_size == 0) return (0); /* TODO: this is an error return without error report through TIFFErrorExt */ - sp->tbuf = (uint16 *) _TIFFmalloc(tbuf_size+sizeof(uint16)*sp->stride); + sp->tbuf = (uint16 *) _TIFFmalloc(tbuf_size); if (sp->tbuf == NULL) return (0); if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) diff -aur FreeImage/Source/LibTIFF4/tif_predict.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_predict.c --- FreeImage/Source/LibTIFF4/tif_predict.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_predict.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_predict.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_predict.c,v 1.32 2010-03-10 18:56:49 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tif_predict.h FreeImage-tiff4.0.4/Source/LibTIFF4/tif_predict.h --- FreeImage/Source/LibTIFF4/tif_predict.h 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_predict.h 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_predict.h,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_predict.h,v 1.8 2010-03-10 18:56:49 bfriesen Exp $ */ /* * Copyright (c) 1995-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tif_print.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_print.c --- FreeImage/Source/LibTIFF4/tif_print.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_print.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_print.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_print.c,v 1.61 2012-12-12 22:50:18 tgl Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -582,10 +582,10 @@ continue; if(fip->field_passcount) { - if (fip->field_readcount == TIFF_VARIABLE ) { + if (fip->field_readcount == TIFF_VARIABLE2 ) { if(TIFFGetField(tif, tag, &value_count, &raw_data) != 1) continue; - } else if (fip->field_readcount == TIFF_VARIABLE2 ) { + } else if (fip->field_readcount == TIFF_VARIABLE ) { uint16 small_value_count; if(TIFFGetField(tif, tag, &small_value_count, &raw_data) != 1) continue; diff -aur FreeImage/Source/LibTIFF4/tif_read.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_read.c --- FreeImage/Source/LibTIFF4/tif_read.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_read.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_read.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_read.c,v 1.45 2015-06-07 22:35:40 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -47,7 +47,7 @@ { static const char module[] = "TIFFFillStripPartial"; register TIFFDirectory *td = &tif->tif_dir; - uint64 unused_data; + tmsize_t unused_data; uint64 read_offset; tmsize_t cc, to_read; /* tmsize_t bytecountm; */ @@ -117,7 +117,7 @@ if( (uint64) to_read > td->td_stripbytecount[strip] - tif->tif_rawdataoff - tif->tif_rawdataloaded ) { - to_read = td->td_stripbytecount[strip] + to_read = (tmsize_t) td->td_stripbytecount[strip] - tif->tif_rawdataoff - tif->tif_rawdataloaded; } @@ -458,7 +458,7 @@ return ((tmsize_t)(-1)); } bytecount = td->td_stripbytecount[strip]; - if (bytecount <= 0) { + if ((int64)bytecount <= 0) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "%I64u: Invalid strip byte count, strip %lu", @@ -498,7 +498,7 @@ if ((tif->tif_flags&TIFF_NOREADRAW)==0) { uint64 bytecount = td->td_stripbytecount[strip]; - if (bytecount <= 0) { + if ((int64)bytecount <= 0) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "Invalid strip byte count %I64u, strip %lu", @@ -801,7 +801,7 @@ if ((tif->tif_flags&TIFF_NOREADRAW)==0) { uint64 bytecount = td->td_stripbytecount[tile]; - if (bytecount <= 0) { + if ((int64)bytecount <= 0) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "%I64u: Invalid tile byte count, tile %lu", @@ -930,8 +930,11 @@ tif->tif_flags &= ~TIFF_MYBUFFER; } else { tif->tif_rawdatasize = (tmsize_t)TIFFroundup_64((uint64)size, 1024); - if (tif->tif_rawdatasize==0) - tif->tif_rawdatasize=(tmsize_t)(-1); + if (tif->tif_rawdatasize==0) { + TIFFErrorExt(tif->tif_clientdata, module, + "Invalid buffer size"); + return (0); + } tif->tif_rawdata = (uint8*) _TIFFmalloc(tif->tif_rawdatasize); tif->tif_flags |= TIFF_MYBUFFER; } @@ -987,10 +990,12 @@ static int TIFFStartTile(TIFF* tif, uint32 tile) { + static const char module[] = "TIFFStartTile"; TIFFDirectory *td = &tif->tif_dir; + uint32 howmany32; - if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount) - return 0; + if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount) + return 0; if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { if (!(*tif->tif_setupdecode)(tif)) @@ -998,12 +1003,18 @@ tif->tif_flags |= TIFF_CODERSETUP; } tif->tif_curtile = tile; - tif->tif_row = - (tile % TIFFhowmany_32(td->td_imagewidth, td->td_tilewidth)) * - td->td_tilelength; - tif->tif_col = - (tile % TIFFhowmany_32(td->td_imagelength, td->td_tilelength)) * - td->td_tilewidth; + howmany32=TIFFhowmany_32(td->td_imagewidth, td->td_tilewidth); + if (howmany32 == 0) { + TIFFErrorExt(tif->tif_clientdata,module,"Zero tiles"); + return 0; + } + tif->tif_row = (tile % howmany32) * td->td_tilelength; + howmany32=TIFFhowmany_32(td->td_imagelength, td->td_tilelength); + if (howmany32 == 0) { + TIFFErrorExt(tif->tif_clientdata,module,"Zero tiles"); + return 0; + } + tif->tif_col = (tile % howmany32) * td->td_tilewidth; tif->tif_flags &= ~TIFF_BUF4WRITE; if (tif->tif_flags&TIFF_NOREADRAW) { diff -aur FreeImage/Source/LibTIFF4/tif_stream.cxx FreeImage-tiff4.0.4/Source/LibTIFF4/tif_stream.cxx --- FreeImage/Source/LibTIFF4/tif_stream.cxx 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_stream.cxx 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_stream.cxx,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_stream.cxx,v 1.13 2015-05-28 01:50:22 bfriesen Exp $ */ /* * Copyright (c) 1988-1996 Sam Leffler @@ -340,12 +340,16 @@ static int _tiffDummyMapProc(thandle_t , void** base, toff_t* size ) { + (void) base; + (void) size; return (0); } static void _tiffDummyUnmapProc(thandle_t , void* base, toff_t size ) { + (void) base; + (void) size; } /* @@ -417,9 +421,10 @@ /* vim: set ts=8 sts=8 sw=8 noet: */ /* - Local Variables: - mode: c - indent-tabs-mode: true - c-basic-offset: 8 - End: -*/ + * Local Variables: + * mode: c + * c-basic-offset: 8 + * fill-column: 78 + * End: + */ + diff -aur FreeImage/Source/LibTIFF4/tif_strip.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_strip.c --- FreeImage/Source/LibTIFF4/tif_strip.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_strip.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_strip.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_strip.c,v 1.36 2015-06-07 22:35:40 bfriesen Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler @@ -317,7 +317,14 @@ } } else + { scanline_size=TIFFhowmany_64(_TIFFMultiply64(tif,td->td_imagewidth,td->td_bitspersample,module),8); + } + if (scanline_size == 0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Computed scanline size is zero"); + return 0; + } return(scanline_size); } tmsize_t @@ -328,8 +335,7 @@ tmsize_t n; m=TIFFScanlineSize64(tif); n=(tmsize_t)m; - if ((uint64)n!=m) - { + if ((uint64)n!=m) { TIFFErrorExt(tif->tif_clientdata,module,"Integer arithmetic overflow"); n=0; } diff -aur FreeImage/Source/LibTIFF4/tif_swab.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_swab.c --- FreeImage/Source/LibTIFF4/tif_swab.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_swab.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_swab.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_swab.c,v 1.13 2010-03-10 18:56:49 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tif_thunder.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_thunder.c --- FreeImage/Source/LibTIFF4/tif_thunder.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_thunder.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_thunder.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_thunder.c,v 1.12 2011-04-02 20:54:09 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tif_tile.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_tile.c --- FreeImage/Source/LibTIFF4/tif_tile.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_tile.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_tile.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_tile.c,v 1.24 2015-06-07 22:35:40 bfriesen Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler @@ -143,17 +143,40 @@ uint64 TIFFTileRowSize64(TIFF* tif) { + static const char module[] = "TIFFTileRowSize64"; TIFFDirectory *td = &tif->tif_dir; uint64 rowsize; + uint64 tilerowsize; - if (td->td_tilelength == 0 || td->td_tilewidth == 0) + if (td->td_tilelength == 0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Tile length is zero"); + return 0; + } + if (td->td_tilewidth == 0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Tile width is zero"); return (0); + } rowsize = _TIFFMultiply64(tif, td->td_bitspersample, td->td_tilewidth, "TIFFTileRowSize"); if (td->td_planarconfig == PLANARCONFIG_CONTIG) + { + if (td->td_samplesperpixel == 0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Samples per pixel is zero"); + return 0; + } rowsize = _TIFFMultiply64(tif, rowsize, td->td_samplesperpixel, "TIFFTileRowSize"); - return (TIFFhowmany8_64(rowsize)); + } + tilerowsize=TIFFhowmany8_64(rowsize); + if (tilerowsize == 0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Computed tile row size is zero"); + return 0; + } + return (tilerowsize); } tmsize_t TIFFTileRowSize(TIFF* tif) diff -aur FreeImage/Source/LibTIFF4/tif_unix.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_unix.c --- FreeImage/Source/LibTIFF4/tif_unix.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_unix.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_unix.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_unix.c,v 1.26 2015-06-16 15:33:17 erouault Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -55,53 +55,69 @@ #include "tiffiop.h" +typedef union fd_as_handle_union +{ + int fd; + thandle_t h; +} fd_as_handle_union_t; + static tmsize_t _tiffReadProc(thandle_t fd, void* buf, tmsize_t size) { + fd_as_handle_union_t fdh; size_t size_io = (size_t) size; if ((tmsize_t) size_io != size) { errno=EINVAL; return (tmsize_t) -1; } - return ((tmsize_t) read((int) fd, buf, size_io)); + fdh.h = fd; + return ((tmsize_t) read(fdh.fd, buf, size_io)); } static tmsize_t _tiffWriteProc(thandle_t fd, void* buf, tmsize_t size) { + fd_as_handle_union_t fdh; size_t size_io = (size_t) size; if ((tmsize_t) size_io != size) { errno=EINVAL; return (tmsize_t) -1; } - return ((tmsize_t) write((int) fd, buf, size_io)); + fdh.h = fd; + return ((tmsize_t) write(fdh.fd, buf, size_io)); } static uint64 _tiffSeekProc(thandle_t fd, uint64 off, int whence) { + fd_as_handle_union_t fdh; off_t off_io = (off_t) off; if ((uint64) off_io != off) { errno=EINVAL; return (uint64) -1; /* this is really gross */ } - return((uint64)lseek((int)fd,off_io,whence)); + fdh.h = fd; + return((uint64)lseek(fdh.fd,off_io,whence)); } static int _tiffCloseProc(thandle_t fd) { - return(close((int)fd)); + fd_as_handle_union_t fdh; + fdh.h = fd; + return(close(fdh.fd)); } static uint64 _tiffSizeProc(thandle_t fd) { struct stat sb; - if (fstat((int)fd,&sb)<0) + fd_as_handle_union_t fdh; + fdh.h = fd; + if (fstat(fdh.fd,&sb)<0) return(0); else return((uint64)sb.st_size); @@ -116,8 +132,10 @@ uint64 size64 = _tiffSizeProc(fd); tmsize_t sizem = (tmsize_t)size64; if ((uint64)sizem==size64) { + fd_as_handle_union_t fdh; + fdh.h = fd; *pbase = (void*) - mmap(0, (size_t)sizem, PROT_READ, MAP_SHARED, (int) fd, 0); + mmap(0, (size_t)sizem, PROT_READ, MAP_SHARED, fdh.fd, 0); if (*pbase != (void*) -1) { *psize = (tmsize_t)sizem; return (1); @@ -155,8 +173,10 @@ { TIFF* tif; + fd_as_handle_union_t fdh; + fdh.fd = fd; tif = TIFFClientOpen(name, mode, - (thandle_t) fd, + fdh.h, _tiffReadProc, _tiffWriteProc, _tiffSeekProc, _tiffCloseProc, _tiffSizeProc, _tiffMapProc, _tiffUnmapProc); @@ -257,6 +277,9 @@ void* _TIFFmalloc(tmsize_t s) { + if (s == 0) + return ((void *) NULL); + return (malloc((size_t) s)); } diff -aur FreeImage/Source/LibTIFF4/tif_version.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_version.c --- FreeImage/Source/LibTIFF4/tif_version.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_version.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Header: /cvsroot/freeimage/FreeImage/Source/LibTIFF4/tif_version.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_version.c,v 1.3 2010-03-10 18:56:49 bfriesen Exp $ */ /* * Copyright (c) 1992-1997 Sam Leffler * Copyright (c) 1992-1997 Silicon Graphics, Inc. diff -aur FreeImage/Source/LibTIFF4/tif_warning.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_warning.c --- FreeImage/Source/LibTIFF4/tif_warning.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_warning.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Header: /cvsroot/freeimage/FreeImage/Source/LibTIFF4/tif_warning.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_warning.c,v 1.3 2010-03-10 18:56:49 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler diff -aur FreeImage/Source/LibTIFF4/tif_win32.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_win32.c --- FreeImage/Source/LibTIFF4/tif_win32.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_win32.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_win32.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_win32.c,v 1.40 2012-11-18 17:51:52 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -329,6 +329,9 @@ void* _TIFFmalloc(tmsize_t s) { + if (s == 0) + return ((void *) NULL); + return (malloc((size_t) s)); } diff -aur FreeImage/Source/LibTIFF4/tif_write.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_write.c --- FreeImage/Source/LibTIFF4/tif_write.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_write.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_write.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_write.c,v 1.42 2015-06-07 23:00:23 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -115,6 +115,10 @@ if (strip >= td->td_stripsperimage && imagegrew) td->td_stripsperimage = TIFFhowmany_32(td->td_imagelength,td->td_rowsperstrip); + if (td->td_stripsperimage == 0) { + TIFFErrorExt(tif->tif_clientdata, module, "Zero strips per image"); + return (-1); + } tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip; if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { @@ -220,6 +224,11 @@ tif->tif_flags |= TIFF_BUF4WRITE; tif->tif_curstrip = strip; + if (td->td_stripsperimage == 0) { + TIFFErrorExt(tif->tif_clientdata, module, "Zero strips per image"); + return ((tmsize_t) -1); + } + tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip; if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { if (!(*tif->tif_setupencode)(tif)) @@ -233,7 +242,7 @@ /* more bytes available in the output buffer than the previous byte count, */ /* so that TIFFAppendToStrip() will detect the overflow when it is called the first */ /* time if the new compressed tile is bigger than the older one. (GDAL #4771) */ - if( tif->tif_rawdatasize <= td->td_stripbytecount[strip] ) + if( tif->tif_rawdatasize <= (tmsize_t)td->td_stripbytecount[strip] ) { if( !(TIFFWriteBufferSetup(tif, NULL, (tmsize_t)TIFFroundup_64((uint64)(td->td_stripbytecount[strip] + 1), 1024))) ) @@ -311,6 +320,10 @@ return ((tmsize_t) -1); } tif->tif_curstrip = strip; + if (td->td_stripsperimage == 0) { + TIFFErrorExt(tif->tif_clientdata, module,"Zero strips per image"); + return ((tmsize_t) -1); + } tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip; return (TIFFAppendToStrip(tif, strip, (uint8*) data, cc) ? cc : (tmsize_t) -1); @@ -353,6 +366,7 @@ static const char module[] = "TIFFWriteEncodedTile"; TIFFDirectory *td; uint16 sample; + uint32 howmany32; if (!WRITECHECKTILES(tif, module)) return ((tmsize_t)(-1)); @@ -379,7 +393,7 @@ /* more bytes available in the output buffer than the previous byte count, */ /* so that TIFFAppendToStrip() will detect the overflow when it is called the first */ /* time if the new compressed tile is bigger than the older one. (GDAL #4771) */ - if( tif->tif_rawdatasize <= td->td_stripbytecount[tile] ) + if( tif->tif_rawdatasize <= (tmsize_t) td->td_stripbytecount[tile] ) { if( !(TIFFWriteBufferSetup(tif, NULL, (tmsize_t)TIFFroundup_64((uint64)(td->td_stripbytecount[tile] + 1), 1024))) ) @@ -391,17 +405,25 @@ tif->tif_curoff = 0; } - tif->tif_rawcc = 0; - tif->tif_rawcp = tif->tif_rawdata; + tif->tif_rawcc = 0; + tif->tif_rawcp = tif->tif_rawdata; /* * Compute tiles per row & per column to compute * current row and column */ - tif->tif_row = (tile % TIFFhowmany_32(td->td_imagelength, td->td_tilelength)) - * td->td_tilelength; - tif->tif_col = (tile % TIFFhowmany_32(td->td_imagewidth, td->td_tilewidth)) - * td->td_tilewidth; + howmany32=TIFFhowmany_32(td->td_imagelength, td->td_tilelength); + if (howmany32 == 0) { + TIFFErrorExt(tif->tif_clientdata,module,"Zero tiles"); + return ((tmsize_t)(-1)); + } + tif->tif_row = (tile % howmany32) * td->td_tilelength; + howmany32=TIFFhowmany_32(td->td_imagewidth, td->td_tilewidth); + if (howmany32 == 0) { + TIFFErrorExt(tif->tif_clientdata,module,"Zero tiles"); + return ((tmsize_t)(-1)); + } + tif->tif_col = (tile % howmany32) * td->td_tilewidth; if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { if (!(*tif->tif_setupencode)(tif)) diff -aur FreeImage/Source/LibTIFF4/tif_zip.c FreeImage-tiff4.0.4/Source/LibTIFF4/tif_zip.c --- FreeImage/Source/LibTIFF4/tif_zip.c 2012-10-07 23:54:04.000000000 +0200 +++ FreeImage-tiff4.0.4/Source/LibTIFF4/tif_zip.c 2015-09-04 19:54:56.000000000 +0200 @@ -1,4 +1,4 @@ -/* $Id: tif_zip.c,v 1.4 2012/10/07 15:54:03 drolon Exp $ */ +/* $Id: tif_zip.c,v 1.33 2014-12-25 18:29:11 erouault Exp $ */ /* * Copyright (c) 1995-1997 Sam Leffler @@ -36,7 +36,7 @@ * of the library: this code assumes the 1.0 API and also depends on * the ability to write the zlib header multiple times (one per strip) * which was not possible with versions prior to 0.95. Note also that - * older versions of this codec avoided this bug by supressing the header + * older versions of this codec avoided this bug by suppressing the header * entirely. This means that files written with the old library cannot * be read; they should be converted to a different compression scheme * and then reconverted. @@ -47,7 +47,7 @@ * last found at ftp://ftp.uu.net/pub/archiving/zip/zlib/zlib-0.99.tar.gz. */ #include "tif_predict.h" -#include "../ZLib/zlib.h" +#include "zlib.h" #include <stdio.h> @@ -61,6 +61,8 @@ #error "Antiquated ZLIB software; you must use version 1.0 or later" #endif +#define SAFE_MSG(sp) ((sp)->stream.msg == NULL ? "" : (sp)->stream.msg) + /* * State block for each open TIFF * file using ZIP compression/decompression. @@ -106,7 +108,7 @@ } if (inflateInit(&sp->stream) != Z_OK) { - TIFFErrorExt(tif->tif_clientdata, module, "%s", sp->stream.msg); + TIFFErrorExt(tif->tif_clientdata, module, "%s", SAFE_MSG(sp)); return (0); } else { sp->state |= ZSTATE_INIT_DECODE; @@ -174,14 +176,14 @@ if (state == Z_DATA_ERROR) { TIFFErrorExt(tif->tif_clientdata, module, "Decoding error at scanline %lu, %s", - (unsigned long) tif->tif_row, sp->stream.msg); + (unsigned long) tif->tif_row, SAFE_MSG(sp)); if (inflateSync(&sp->stream) != Z_OK) return (0); continue; } if (state != Z_OK) { - TIFFErrorExt(tif->tif_clientdata, module, "ZLib error: %s", - sp->stream.msg); + TIFFErrorExt(tif->tif_clientdata, module, + "ZLib error: %s", SAFE_MSG(sp)); return (0); } } while (sp->stream.avail_out > 0); @@ -211,7 +213,7 @@ } if (deflateInit(&sp->stream, sp->zipquality) != Z_OK) { - TIFFErrorExt(tif->tif_clientdata, module, "%s", sp->stream.msg); + TIFFErrorExt(tif->tif_clientdata, module, "%s", SAFE_MSG(sp)); return (0); } else { sp->state |= ZSTATE_INIT_ENCODE; @@ -273,8 +275,9 @@ } do { if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK) { - TIFFErrorExt(tif->tif_clientdata, module, "Encoder error: %s", - sp->stream.msg); + TIFFErrorExt(tif->tif_clientdata, module, + "Encoder error: %s", + SAFE_MSG(sp)); return (0); } if (sp->stream.avail_out == 0) { @@ -313,8 +316,8 @@ } break; default: - TIFFErrorExt(tif->tif_clientdata, module, "ZLib error: %s", - sp->stream.msg); + TIFFErrorExt(tif->tif_clientdata, module, + "ZLib error: %s", SAFE_MSG(sp)); return (0); } } while (state != Z_STREAM_END); @@ -359,7 +362,7 @@ if (deflateParams(&sp->stream, sp->zipquality, Z_DEFAULT_STRATEGY) != Z_OK) { TIFFErrorExt(tif->tif_clientdata, module, "ZLib error: %s", - sp->stream.msg); + SAFE_MSG(sp)); return (0); } }