| Index: third_party/libtiff/tif_dir.c
|
| diff --git a/third_party/tiff_v403/tif_dir.c b/third_party/libtiff/tif_dir.c
|
| similarity index 95%
|
| rename from third_party/tiff_v403/tif_dir.c
|
| rename to third_party/libtiff/tif_dir.c
|
| index 06951b4d17f5e90ce04ceb5ff43a0b3333749585..73212c02db5aae64ae1f2554f43bb9f9cca2e8b8 100644
|
| --- a/third_party/tiff_v403/tif_dir.c
|
| +++ b/third_party/libtiff/tif_dir.c
|
| @@ -1,4 +1,4 @@
|
| -/* $Id: tif_dir.c,v 1.113 2012-06-14 20:32:53 fwarmerdam 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 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
|
| 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 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
|
| 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 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
|
| * 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 @@ badvalue32:
|
| 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 @@ _TIFFVGetField(TIFF* tif, uint32 tag, va_list ap)
|
| 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 @@ _TIFFVGetField(TIFF* tif, uint32 tag, va_list ap)
|
| * 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 @@ TIFFDefaultDirectory(TIFF* tif)
|
| 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 @@ TIFFAdvanceDirectory(TIFF* tif, uint64* nextdir, uint64* off)
|
| 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 @@ TIFFAdvanceDirectory(TIFF* tif, uint64* nextdir, uint64* off)
|
| (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 @@ TIFFAdvanceDirectory(TIFF* tif, uint64* nextdir, uint64* off)
|
| uint16
|
| TIFFNumberOfDirectories(TIFF* tif)
|
| {
|
| + static const char module[] = "TIFFNumberOfDirectories";
|
| uint64 nextdir;
|
| uint16 n;
|
| if (!(tif->tif_flags&TIFF_BIGTIFF))
|
| @@ -1478,7 +1513,18 @@ TIFFNumberOfDirectories(TIFF* tif)
|
| 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);
|
| }
|
|
|
| @@ -1657,4 +1703,3 @@ TIFFUnlinkDirectory(TIFF* tif, uint16 dirn)
|
| * fill-column: 78
|
| * End:
|
| */
|
| -
|
|
|