Blame libtiff/tif_dirread.c

Packit 7838c8
/* $Id: tif_dirread.c,v 1.218 2017-09-09 21:44:42 erouault Exp $ */
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Copyright (c) 1988-1997 Sam Leffler
Packit 7838c8
 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
Packit 7838c8
 *
Packit 7838c8
 * Permission to use, copy, modify, distribute, and sell this software and
Packit 7838c8
 * its documentation for any purpose is hereby granted without fee, provided
Packit 7838c8
 * that (i) the above copyright notices and this permission notice appear in
Packit 7838c8
 * all copies of the software and related documentation, and (ii) the names of
Packit 7838c8
 * Sam Leffler and Silicon Graphics may not be used in any advertising or
Packit 7838c8
 * publicity relating to the software without the specific, prior written
Packit 7838c8
 * permission of Sam Leffler and Silicon Graphics.
Packit 7838c8
 *
Packit 7838c8
 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
Packit 7838c8
 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
Packit 7838c8
 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
Packit 7838c8
 *
Packit 7838c8
 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
Packit 7838c8
 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
Packit 7838c8
 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
Packit 7838c8
 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
Packit 7838c8
 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
Packit 7838c8
 * OF THIS SOFTWARE.
Packit 7838c8
 */
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * TIFF Library.
Packit 7838c8
 *
Packit 7838c8
 * Directory Read Support Routines.
Packit 7838c8
 */
Packit 7838c8
Packit 7838c8
/* Suggested pending improvements:
Packit 7838c8
 * - add a field 'ignore' to the TIFFDirEntry structure, to flag status,
Packit 7838c8
 *   eliminating current use of the IGNORE value, and therefore eliminating
Packit 7838c8
 *   current irrational behaviour on tags with tag id code 0
Packit 7838c8
 * - add a field 'field_info' to the TIFFDirEntry structure, and set that with
Packit 7838c8
 *   the pointer to the appropriate TIFFField structure early on in
Packit 7838c8
 *   TIFFReadDirectory, so as to eliminate current possibly repetitive lookup.
Packit 7838c8
 */
Packit 7838c8
Packit 7838c8
#include "tiffiop.h"
Packit 7838c8
#include <float.h>
Packit 7838c8
#include <stdlib.h>
Packit 7838c8
Packit 7838c8
#define IGNORE 0          /* tag placeholder used below */
Packit 7838c8
#define FAILED_FII    ((uint32) -1)
Packit 7838c8
Packit 7838c8
#ifdef HAVE_IEEEFP
Packit 7838c8
# define TIFFCvtIEEEFloatToNative(tif, n, fp)
Packit 7838c8
# define TIFFCvtIEEEDoubleToNative(tif, n, dp)
Packit 7838c8
#else
Packit 7838c8
extern void TIFFCvtIEEEFloatToNative(TIFF*, uint32, float*);
Packit 7838c8
extern void TIFFCvtIEEEDoubleToNative(TIFF*, uint32, double*);
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
enum TIFFReadDirEntryErr {
Packit 7838c8
	TIFFReadDirEntryErrOk = 0,
Packit 7838c8
	TIFFReadDirEntryErrCount = 1,
Packit 7838c8
	TIFFReadDirEntryErrType = 2,
Packit 7838c8
	TIFFReadDirEntryErrIo = 3,
Packit 7838c8
	TIFFReadDirEntryErrRange = 4,
Packit 7838c8
	TIFFReadDirEntryErrPsdif = 5,
Packit 7838c8
	TIFFReadDirEntryErrSizesan = 6,
Packit 7838c8
	TIFFReadDirEntryErrAlloc = 7,
Packit 7838c8
};
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryFloat(TIFF* tif, TIFFDirEntry* direntry, float* value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryDouble(TIFF* tif, TIFFDirEntry* direntry, double* value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8(TIFF* tif, TIFFDirEntry* direntry, uint64* value);
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryArray(TIFF* tif, TIFFDirEntry* direntry, uint32* count, uint32 desttypesize, void** value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryByteArray(TIFF* tif, TIFFDirEntry* direntry, uint8** value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntrySbyteArray(TIFF* tif, TIFFDirEntry* direntry, int8** value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryShortArray(TIFF* tif, TIFFDirEntry* direntry, uint16** value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntrySshortArray(TIFF* tif, TIFFDirEntry* direntry, int16** value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryLongArray(TIFF* tif, TIFFDirEntry* direntry, uint32** value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntrySlongArray(TIFF* tif, TIFFDirEntry* direntry, int32** value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryLong8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntrySlong8Array(TIFF* tif, TIFFDirEntry* direntry, int64** value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryFloatArray(TIFF* tif, TIFFDirEntry* direntry, float** value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryDoubleArray(TIFF* tif, TIFFDirEntry* direntry, double** value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value);
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value);
Packit 7838c8
#if 0
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleDouble(TIFF* tif, TIFFDirEntry* direntry, double* value);
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static void TIFFReadDirEntryCheckedByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value);
Packit 7838c8
static void TIFFReadDirEntryCheckedSbyte(TIFF* tif, TIFFDirEntry* direntry, int8* value);
Packit 7838c8
static void TIFFReadDirEntryCheckedShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value);
Packit 7838c8
static void TIFFReadDirEntryCheckedSshort(TIFF* tif, TIFFDirEntry* direntry, int16* value);
Packit 7838c8
static void TIFFReadDirEntryCheckedLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value);
Packit 7838c8
static void TIFFReadDirEntryCheckedSlong(TIFF* tif, TIFFDirEntry* direntry, int32* value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSlong8(TIFF* tif, TIFFDirEntry* direntry, int64* value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedRational(TIFF* tif, TIFFDirEntry* direntry, double* value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSrational(TIFF* tif, TIFFDirEntry* direntry, double* value);
Packit 7838c8
static void TIFFReadDirEntryCheckedFloat(TIFF* tif, TIFFDirEntry* direntry, float* value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedDouble(TIFF* tif, TIFFDirEntry* direntry, double* value);
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSbyte(int8 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteShort(uint16 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSshort(int16 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong(uint32 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong(int32 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong8(uint64 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong8(int64 value);
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteByte(uint8 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteShort(uint16 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSshort(int16 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong(uint32 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong(int32 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong8(uint64 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong8(int64 value);
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSbyte(int8 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSshort(int16 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong(uint32 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong(int32 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong8(uint64 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong8(int64 value);
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortShort(uint16 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong(uint32 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong(int32 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong8(uint64 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong8(int64 value);
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSbyte(int8 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSshort(int16 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSlong(int32 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongLong8(uint64 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSlong8(int64 value);
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlongLong(uint32 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlongLong8(uint64 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlongSlong8(int64 value);
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Sbyte(int8 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Sshort(int16 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Slong(int32 value);
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Slong8(int64 value);
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlong8Long8(uint64 value);
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryData(TIFF* tif, uint64 offset, tmsize_t size, void* dest);
Packit 7838c8
static void TIFFReadDirEntryOutputErr(TIFF* tif, enum TIFFReadDirEntryErr err, const char* module, const char* tagname, int recover);
Packit 7838c8
Packit 7838c8
static void TIFFReadDirectoryCheckOrder(TIFF* tif, TIFFDirEntry* dir, uint16 dircount);
Packit 7838c8
static TIFFDirEntry* TIFFReadDirectoryFindEntry(TIFF* tif, TIFFDirEntry* dir, uint16 dircount, uint16 tagid);
Packit 7838c8
static void TIFFReadDirectoryFindFieldInfo(TIFF* tif, uint16 tagid, uint32* fii);
Packit 7838c8
Packit 7838c8
static int EstimateStripByteCounts(TIFF* tif, TIFFDirEntry* dir, uint16 dircount);
Packit 7838c8
static void MissingRequired(TIFF*, const char*);
Packit 7838c8
static int TIFFCheckDirOffset(TIFF* tif, uint64 diroff);
Packit 7838c8
static int CheckDirCount(TIFF*, TIFFDirEntry*, uint32);
Packit 7838c8
static uint16 TIFFFetchDirectory(TIFF* tif, uint64 diroff, TIFFDirEntry** pdir, uint64* nextdiroff);
Packit 7838c8
static int TIFFFetchNormalTag(TIFF*, TIFFDirEntry*, int recover);
Packit 7838c8
static int TIFFFetchStripThing(TIFF* tif, TIFFDirEntry* dir, uint32 nstrips, uint64** lpp);
Packit 7838c8
static int TIFFFetchSubjectDistance(TIFF*, TIFFDirEntry*);
Packit 7838c8
static void ChopUpSingleUncompressedStrip(TIFF*);
Packit 7838c8
static uint64 TIFFReadUInt64(const uint8 *value);
Packit 7838c8
Packit 7838c8
static int _TIFFFillStrilesInternal( TIFF *tif, int loadStripByteCount );
Packit 7838c8
Packit 7838c8
typedef union _UInt64Aligned_t
Packit 7838c8
{
Packit 7838c8
        double d;
Packit 7838c8
	uint64 l;
Packit 7838c8
	uint32 i[2];
Packit 7838c8
	uint16 s[4];
Packit 7838c8
	uint8  c[8];
Packit 7838c8
} UInt64Aligned_t;
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
  Unaligned safe copy of a uint64 value from an octet array.
Packit 7838c8
*/
Packit 7838c8
static uint64 TIFFReadUInt64(const uint8 *value)
Packit 7838c8
{
Packit 7838c8
	UInt64Aligned_t result;
Packit 7838c8
Packit 7838c8
	result.c[0]=value[0];
Packit 7838c8
	result.c[1]=value[1];
Packit 7838c8
	result.c[2]=value[2];
Packit 7838c8
	result.c[3]=value[3];
Packit 7838c8
	result.c[4]=value[4];
Packit 7838c8
	result.c[5]=value[5];
Packit 7838c8
	result.c[6]=value[6];
Packit 7838c8
	result.c[7]=value[7];
Packit 7838c8
Packit 7838c8
	return result.l;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	if (direntry->tdir_count!=1)
Packit 7838c8
		return(TIFFReadDirEntryErrCount);
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
			TIFFReadDirEntryCheckedByte(tif,direntry,value);
Packit 7838c8
			return(TIFFReadDirEntryErrOk);
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
			{
Packit 7838c8
				int8 m;
Packit 7838c8
				TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeByteSbyte(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint8)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
			{
Packit 7838c8
				uint16 m;
Packit 7838c8
				TIFFReadDirEntryCheckedShort(tif,direntry,&m);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeByteShort(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint8)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
			{
Packit 7838c8
				int16 m;
Packit 7838c8
				TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeByteSshort(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint8)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
			{
Packit 7838c8
				uint32 m;
Packit 7838c8
				TIFFReadDirEntryCheckedLong(tif,direntry,&m);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeByteLong(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint8)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
			{
Packit 7838c8
				int32 m;
Packit 7838c8
				TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeByteSlong(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint8)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
			{
Packit 7838c8
				uint64 m;
Packit 7838c8
				err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeByteLong8(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint8)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			{
Packit 7838c8
				int64 m;
Packit 7838c8
				err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeByteSlong8(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint8)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		default:
Packit 7838c8
			return(TIFFReadDirEntryErrType);
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	if (direntry->tdir_count!=1)
Packit 7838c8
		return(TIFFReadDirEntryErrCount);
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
			{
Packit 7838c8
				uint8 m;
Packit 7838c8
				TIFFReadDirEntryCheckedByte(tif,direntry,&m);
Packit 7838c8
				*value=(uint16)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
			{
Packit 7838c8
				int8 m;
Packit 7838c8
				TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeShortSbyte(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint16)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
			TIFFReadDirEntryCheckedShort(tif,direntry,value);
Packit 7838c8
			return(TIFFReadDirEntryErrOk);
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
			{
Packit 7838c8
				int16 m;
Packit 7838c8
				TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeShortSshort(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint16)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
			{
Packit 7838c8
				uint32 m;
Packit 7838c8
				TIFFReadDirEntryCheckedLong(tif,direntry,&m);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeShortLong(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint16)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
			{
Packit 7838c8
				int32 m;
Packit 7838c8
				TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeShortSlong(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint16)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
			{
Packit 7838c8
				uint64 m;
Packit 7838c8
				err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeShortLong8(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint16)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			{
Packit 7838c8
				int64 m;
Packit 7838c8
				err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeShortSlong8(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint16)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		default:
Packit 7838c8
			return(TIFFReadDirEntryErrType);
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	if (direntry->tdir_count!=1)
Packit 7838c8
		return(TIFFReadDirEntryErrCount);
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
			{
Packit 7838c8
				uint8 m;
Packit 7838c8
				TIFFReadDirEntryCheckedByte(tif,direntry,&m);
Packit 7838c8
				*value=(uint32)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
			{
Packit 7838c8
				int8 m;
Packit 7838c8
				TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeLongSbyte(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint32)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
			{
Packit 7838c8
				uint16 m;
Packit 7838c8
				TIFFReadDirEntryCheckedShort(tif,direntry,&m);
Packit 7838c8
				*value=(uint32)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
			{
Packit 7838c8
				int16 m;
Packit 7838c8
				TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeLongSshort(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint32)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
			TIFFReadDirEntryCheckedLong(tif,direntry,value);
Packit 7838c8
			return(TIFFReadDirEntryErrOk);
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
			{
Packit 7838c8
				int32 m;
Packit 7838c8
				TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeLongSlong(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint32)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
			{
Packit 7838c8
				uint64 m;
Packit 7838c8
				err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeLongLong8(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint32)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			{
Packit 7838c8
				int64 m;
Packit 7838c8
				err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeLongSlong8(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint32)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		default:
Packit 7838c8
			return(TIFFReadDirEntryErrType);
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	if (direntry->tdir_count!=1)
Packit 7838c8
		return(TIFFReadDirEntryErrCount);
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
			{
Packit 7838c8
				uint8 m;
Packit 7838c8
				TIFFReadDirEntryCheckedByte(tif,direntry,&m);
Packit 7838c8
				*value=(uint64)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
			{
Packit 7838c8
				int8 m;
Packit 7838c8
				TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeLong8Sbyte(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint64)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
			{
Packit 7838c8
				uint16 m;
Packit 7838c8
				TIFFReadDirEntryCheckedShort(tif,direntry,&m);
Packit 7838c8
				*value=(uint64)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
			{
Packit 7838c8
				int16 m;
Packit 7838c8
				TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeLong8Sshort(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint64)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
			{
Packit 7838c8
				uint32 m;
Packit 7838c8
				TIFFReadDirEntryCheckedLong(tif,direntry,&m);
Packit 7838c8
				*value=(uint64)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
			{
Packit 7838c8
				int32 m;
Packit 7838c8
				TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeLong8Slong(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint64)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
			err=TIFFReadDirEntryCheckedLong8(tif,direntry,value);
Packit 7838c8
			return(err);
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			{
Packit 7838c8
				int64 m;
Packit 7838c8
				err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				err=TIFFReadDirEntryCheckRangeLong8Slong8(m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(uint64)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		default:
Packit 7838c8
			return(TIFFReadDirEntryErrType);
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryFloat(TIFF* tif, TIFFDirEntry* direntry, float* value)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	if (direntry->tdir_count!=1)
Packit 7838c8
		return(TIFFReadDirEntryErrCount);
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
			{
Packit 7838c8
				uint8 m;
Packit 7838c8
				TIFFReadDirEntryCheckedByte(tif,direntry,&m);
Packit 7838c8
				*value=(float)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
			{
Packit 7838c8
				int8 m;
Packit 7838c8
				TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
Packit 7838c8
				*value=(float)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
			{
Packit 7838c8
				uint16 m;
Packit 7838c8
				TIFFReadDirEntryCheckedShort(tif,direntry,&m);
Packit 7838c8
				*value=(float)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
			{
Packit 7838c8
				int16 m;
Packit 7838c8
				TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
Packit 7838c8
				*value=(float)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
			{
Packit 7838c8
				uint32 m;
Packit 7838c8
				TIFFReadDirEntryCheckedLong(tif,direntry,&m);
Packit 7838c8
				*value=(float)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
			{
Packit 7838c8
				int32 m;
Packit 7838c8
				TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
Packit 7838c8
				*value=(float)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
			{
Packit 7838c8
				uint64 m;
Packit 7838c8
				err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
#if defined(__WIN32__) && (_MSC_VER < 1500)
Packit 7838c8
				/*
Packit 7838c8
				 * XXX: MSVC 6.0 does not support conversion
Packit 7838c8
				 * of 64-bit integers into floating point
Packit 7838c8
				 * values.
Packit 7838c8
				 */
Packit 7838c8
				*value = _TIFFUInt64ToFloat(m);
Packit 7838c8
#else
Packit 7838c8
				*value=(float)m;
Packit 7838c8
#endif
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			{
Packit 7838c8
				int64 m;
Packit 7838c8
				err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(float)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_RATIONAL:
Packit 7838c8
			{
Packit 7838c8
				double m;
Packit 7838c8
				err=TIFFReadDirEntryCheckedRational(tif,direntry,&m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(float)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SRATIONAL:
Packit 7838c8
			{
Packit 7838c8
				double m;
Packit 7838c8
				err=TIFFReadDirEntryCheckedSrational(tif,direntry,&m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(float)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_FLOAT:
Packit 7838c8
			TIFFReadDirEntryCheckedFloat(tif,direntry,value);
Packit 7838c8
			return(TIFFReadDirEntryErrOk);
Packit 7838c8
		case TIFF_DOUBLE:
Packit 7838c8
			{
Packit 7838c8
				double m;
Packit 7838c8
				err=TIFFReadDirEntryCheckedDouble(tif,direntry,&m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				if ((m > FLT_MAX) || (m < FLT_MIN))
Packit 7838c8
					return(TIFFReadDirEntryErrRange);
Packit 7838c8
				*value=(float)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		default:
Packit 7838c8
			return(TIFFReadDirEntryErrType);
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryDouble(TIFF* tif, TIFFDirEntry* direntry, double* value)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	if (direntry->tdir_count!=1)
Packit 7838c8
		return(TIFFReadDirEntryErrCount);
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
			{
Packit 7838c8
				uint8 m;
Packit 7838c8
				TIFFReadDirEntryCheckedByte(tif,direntry,&m);
Packit 7838c8
				*value=(double)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
			{
Packit 7838c8
				int8 m;
Packit 7838c8
				TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
Packit 7838c8
				*value=(double)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
			{
Packit 7838c8
				uint16 m;
Packit 7838c8
				TIFFReadDirEntryCheckedShort(tif,direntry,&m);
Packit 7838c8
				*value=(double)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
			{
Packit 7838c8
				int16 m;
Packit 7838c8
				TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
Packit 7838c8
				*value=(double)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
			{
Packit 7838c8
				uint32 m;
Packit 7838c8
				TIFFReadDirEntryCheckedLong(tif,direntry,&m);
Packit 7838c8
				*value=(double)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
			{
Packit 7838c8
				int32 m;
Packit 7838c8
				TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
Packit 7838c8
				*value=(double)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
			{
Packit 7838c8
				uint64 m;
Packit 7838c8
				err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
#if defined(__WIN32__) && (_MSC_VER < 1500)
Packit 7838c8
				/*
Packit 7838c8
				 * XXX: MSVC 6.0 does not support conversion
Packit 7838c8
				 * of 64-bit integers into floating point
Packit 7838c8
				 * values.
Packit 7838c8
				 */
Packit 7838c8
				*value = _TIFFUInt64ToDouble(m);
Packit 7838c8
#else
Packit 7838c8
				*value = (double)m;
Packit 7838c8
#endif
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			{
Packit 7838c8
				int64 m;
Packit 7838c8
				err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
Packit 7838c8
				if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					return(err);
Packit 7838c8
				*value=(double)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_RATIONAL:
Packit 7838c8
			err=TIFFReadDirEntryCheckedRational(tif,direntry,value);
Packit 7838c8
			return(err);
Packit 7838c8
		case TIFF_SRATIONAL:
Packit 7838c8
			err=TIFFReadDirEntryCheckedSrational(tif,direntry,value);
Packit 7838c8
			return(err);
Packit 7838c8
		case TIFF_FLOAT:
Packit 7838c8
			{
Packit 7838c8
				float m;
Packit 7838c8
				TIFFReadDirEntryCheckedFloat(tif,direntry,&m);
Packit 7838c8
				*value=(double)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_DOUBLE:
Packit 7838c8
			err=TIFFReadDirEntryCheckedDouble(tif,direntry,value);
Packit 7838c8
			return(err);
Packit 7838c8
		default:
Packit 7838c8
			return(TIFFReadDirEntryErrType);
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8(TIFF* tif, TIFFDirEntry* direntry, uint64* value)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	if (direntry->tdir_count!=1)
Packit 7838c8
		return(TIFFReadDirEntryErrCount);
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
		case TIFF_IFD:
Packit 7838c8
			{
Packit 7838c8
				uint32 m;
Packit 7838c8
				TIFFReadDirEntryCheckedLong(tif,direntry,&m);
Packit 7838c8
				*value=(uint64)m;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
		case TIFF_IFD8:
Packit 7838c8
			err=TIFFReadDirEntryCheckedLong8(tif,direntry,value);
Packit 7838c8
			return(err);
Packit 7838c8
		default:
Packit 7838c8
			return(TIFFReadDirEntryErrType);
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
Packit 7838c8
#define INITIAL_THRESHOLD (1024 * 1024)
Packit 7838c8
#define THRESHOLD_MULTIPLIER 10
Packit 7838c8
#define MAX_THRESHOLD (THRESHOLD_MULTIPLIER * THRESHOLD_MULTIPLIER * THRESHOLD_MULTIPLIER * INITIAL_THRESHOLD)
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryDataAndRealloc(
Packit 7838c8
                    TIFF* tif, uint64 offset, tmsize_t size, void** pdest)
Packit 7838c8
{
Packit 7838c8
#if SIZEOF_VOIDP == 8 || SIZEOF_SIZE_T == 8
Packit 7838c8
        tmsize_t threshold = INITIAL_THRESHOLD;
Packit 7838c8
#endif
Packit 7838c8
        tmsize_t already_read = 0;
Packit 7838c8
Packit 7838c8
        assert( !isMapped(tif) );
Packit 7838c8
Packit 7838c8
        if (!SeekOK(tif,offset))
Packit 7838c8
                return(TIFFReadDirEntryErrIo);
Packit 7838c8
Packit 7838c8
        /* On 64 bit processes, read first a maximum of 1 MB, then 10 MB, etc */
Packit 7838c8
        /* so as to avoid allocating too much memory in case the file is too */
Packit 7838c8
        /* short. We could ask for the file size, but this might be */
Packit 7838c8
        /* expensive with some I/O layers (think of reading a gzipped file) */
Packit 7838c8
        /* Restrict to 64 bit processes, so as to avoid reallocs() */
Packit 7838c8
        /* on 32 bit processes where virtual memory is scarce.  */
Packit 7838c8
        while( already_read < size )
Packit 7838c8
        {
Packit 7838c8
            void* new_dest;
Packit 7838c8
            tmsize_t bytes_read;
Packit 7838c8
            tmsize_t to_read = size - already_read;
Packit 7838c8
#if SIZEOF_VOIDP == 8 || SIZEOF_SIZE_T == 8
Packit 7838c8
            if( to_read >= threshold && threshold < MAX_THRESHOLD )
Packit 7838c8
            {
Packit 7838c8
                to_read = threshold;
Packit 7838c8
                threshold *= THRESHOLD_MULTIPLIER;
Packit 7838c8
            }
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
            new_dest = (uint8*) _TIFFrealloc(
Packit 7838c8
                            *pdest, already_read + to_read);
Packit 7838c8
            if( new_dest == NULL )
Packit 7838c8
            {
Packit 7838c8
                TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
Packit 7838c8
                            "Failed to allocate memory for %s "
Packit 7838c8
                            "(%ld elements of %ld bytes each)",
Packit 7838c8
                            "TIFFReadDirEntryArray",
Packit 7838c8
                             (long) 1, (long) (already_read + to_read));
Packit 7838c8
                return TIFFReadDirEntryErrAlloc;
Packit 7838c8
            }
Packit 7838c8
            *pdest = new_dest;
Packit 7838c8
Packit 7838c8
            bytes_read = TIFFReadFile(tif,
Packit 7838c8
                (char*)*pdest + already_read, to_read);
Packit 7838c8
            already_read += bytes_read;
Packit 7838c8
            if (bytes_read != to_read) {
Packit 7838c8
                return TIFFReadDirEntryErrIo;
Packit 7838c8
            }
Packit 7838c8
        }
Packit 7838c8
        return TIFFReadDirEntryErrOk;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryArrayWithLimit(
Packit 7838c8
    TIFF* tif, TIFFDirEntry* direntry, uint32* count, uint32 desttypesize,
Packit 7838c8
    void** value, uint64 maxcount)
Packit 7838c8
{
Packit 7838c8
	int typesize;
Packit 7838c8
	uint32 datasize;
Packit 7838c8
	void* data;
Packit 7838c8
        uint64 target_count64;
Packit 7838c8
	typesize=TIFFDataWidth(direntry->tdir_type);
Packit 7838c8
Packit 7838c8
        target_count64 = (direntry->tdir_count > maxcount) ?
Packit 7838c8
                maxcount : direntry->tdir_count;
Packit 7838c8
Packit 7838c8
	if ((target_count64==0)||(typesize==0))
Packit 7838c8
	{
Packit 7838c8
		*value=0;
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
	}
Packit 7838c8
        (void) desttypesize;
Packit 7838c8
Packit 7838c8
        /* 
Packit 7838c8
         * As a sanity check, make sure we have no more than a 2GB tag array 
Packit 7838c8
         * in either the current data type or the dest data type.  This also
Packit 7838c8
         * avoids problems with overflow of tmsize_t on 32bit systems.
Packit 7838c8
         */
Packit 7838c8
	if ((uint64)(2147483647/typesize)
Packit 7838c8
		return(TIFFReadDirEntryErrSizesan);
Packit 7838c8
	if ((uint64)(2147483647/desttypesize)
Packit 7838c8
		return(TIFFReadDirEntryErrSizesan);
Packit 7838c8
Packit 7838c8
	*count=(uint32)target_count64;
Packit 7838c8
	datasize=(*count)*typesize;
Packit 7838c8
	assert((tmsize_t)datasize>0);
Packit 7838c8
Packit 7838c8
	if( isMapped(tif) && datasize > (uint32)tif->tif_size )
Packit 7838c8
		return TIFFReadDirEntryErrIo;
Packit 7838c8
Packit 7838c8
	if( !isMapped(tif) &&
Packit 7838c8
		(((tif->tif_flags&TIFF_BIGTIFF) && datasize > 8) ||
Packit 7838c8
		(!(tif->tif_flags&TIFF_BIGTIFF) && datasize > 4)) )
Packit 7838c8
	{
Packit 7838c8
		data = NULL;
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
	{
Packit 7838c8
		data=_TIFFCheckMalloc(tif, *count, typesize, "ReadDirEntryArray");
Packit 7838c8
		if (data==0)
Packit 7838c8
			return(TIFFReadDirEntryErrAlloc);
Packit 7838c8
	}
Packit 7838c8
	if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
	{
Packit 7838c8
		if (datasize<=4)
Packit 7838c8
			_TIFFmemcpy(data,&direntry->tdir_offset,datasize);
Packit 7838c8
		else
Packit 7838c8
		{
Packit 7838c8
			enum TIFFReadDirEntryErr err;
Packit 7838c8
			uint32 offset = direntry->tdir_offset.toff_long;
Packit 7838c8
			if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
				TIFFSwabLong(&offset);
Packit 7838c8
			if( isMapped(tif) )
Packit 7838c8
				err=TIFFReadDirEntryData(tif,(uint64)offset,(tmsize_t)datasize,data);
Packit 7838c8
			else
Packit 7838c8
				err=TIFFReadDirEntryDataAndRealloc(tif,(uint64)offset,(tmsize_t)datasize,&data);
Packit 7838c8
			if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
			{
Packit 7838c8
				_TIFFfree(data);
Packit 7838c8
				return(err);
Packit 7838c8
			}
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
	{
Packit 7838c8
		if (datasize<=8)
Packit 7838c8
			_TIFFmemcpy(data,&direntry->tdir_offset,datasize);
Packit 7838c8
		else
Packit 7838c8
		{
Packit 7838c8
			enum TIFFReadDirEntryErr err;
Packit 7838c8
			uint64 offset = direntry->tdir_offset.toff_long8;
Packit 7838c8
			if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
				TIFFSwabLong8(&offset);
Packit 7838c8
			if( isMapped(tif) )
Packit 7838c8
				err=TIFFReadDirEntryData(tif,(uint64)offset,(tmsize_t)datasize,data);
Packit 7838c8
			else
Packit 7838c8
				err=TIFFReadDirEntryDataAndRealloc(tif,(uint64)offset,(tmsize_t)datasize,&data);
Packit 7838c8
			if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
			{
Packit 7838c8
				_TIFFfree(data);
Packit 7838c8
				return(err);
Packit 7838c8
			}
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
	*value=data;
Packit 7838c8
	return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryArray(TIFF* tif, TIFFDirEntry* direntry, uint32* count, uint32 desttypesize, void** value)
Packit 7838c8
{
Packit 7838c8
    return TIFFReadDirEntryArrayWithLimit(tif, direntry, count,
Packit 7838c8
                                          desttypesize, value, ~((uint64)0));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryByteArray(TIFF* tif, TIFFDirEntry* direntry, uint8** value)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	uint32 count;
Packit 7838c8
	void* origdata;
Packit 7838c8
	uint8* data;
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_ASCII:
Packit 7838c8
		case TIFF_UNDEFINED:
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			break;
Packit 7838c8
		default:
Packit 7838c8
			return(TIFFReadDirEntryErrType);
Packit 7838c8
	}
Packit 7838c8
	err=TIFFReadDirEntryArray(tif,direntry,&count,1,&origdata);
Packit 7838c8
	if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
Packit 7838c8
	{
Packit 7838c8
		*value=0;
Packit 7838c8
		return(err);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_ASCII:
Packit 7838c8
		case TIFF_UNDEFINED:
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
			*value=(uint8*)origdata;
Packit 7838c8
			return(TIFFReadDirEntryErrOk);
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
			{
Packit 7838c8
				int8* m;
Packit 7838c8
				uint32 n;
Packit 7838c8
				m=(int8*)origdata;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeByteSbyte(*m);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					{
Packit 7838c8
						_TIFFfree(origdata);
Packit 7838c8
						return(err);
Packit 7838c8
					}
Packit 7838c8
					m++;
Packit 7838c8
				}
Packit 7838c8
				*value=(uint8*)origdata;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
	}
Packit 7838c8
	data=(uint8*)_TIFFmalloc(count);
Packit 7838c8
	if (data==0)
Packit 7838c8
	{
Packit 7838c8
		_TIFFfree(origdata);
Packit 7838c8
		return(TIFFReadDirEntryErrAlloc);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
			{
Packit 7838c8
				uint16* ma;
Packit 7838c8
				uint8* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint16*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabShort(ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeByteShort(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(uint8)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
			{
Packit 7838c8
				int16* ma;
Packit 7838c8
				uint8* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int16*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabShort((uint16*)ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeByteSshort(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(uint8)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
			{
Packit 7838c8
				uint32* ma;
Packit 7838c8
				uint8* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong(ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeByteLong(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(uint8)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
			{
Packit 7838c8
				int32* ma;
Packit 7838c8
				uint8* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong((uint32*)ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeByteSlong(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(uint8)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
			{
Packit 7838c8
				uint64* ma;
Packit 7838c8
				uint8* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint64*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong8(ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeByteLong8(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(uint8)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			{
Packit 7838c8
				int64* ma;
Packit 7838c8
				uint8* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int64*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong8((uint64*)ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeByteSlong8(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(uint8)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
	}
Packit 7838c8
	_TIFFfree(origdata);
Packit 7838c8
	if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
	{
Packit 7838c8
		_TIFFfree(data);
Packit 7838c8
		return(err);
Packit 7838c8
	}
Packit 7838c8
	*value=data;
Packit 7838c8
	return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntrySbyteArray(TIFF* tif, TIFFDirEntry* direntry, int8** value)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	uint32 count;
Packit 7838c8
	void* origdata;
Packit 7838c8
	int8* data;
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_UNDEFINED:
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			break;
Packit 7838c8
		default:
Packit 7838c8
			return(TIFFReadDirEntryErrType);
Packit 7838c8
	}
Packit 7838c8
	err=TIFFReadDirEntryArray(tif,direntry,&count,1,&origdata);
Packit 7838c8
	if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
Packit 7838c8
	{
Packit 7838c8
		*value=0;
Packit 7838c8
		return(err);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_UNDEFINED:
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
			{
Packit 7838c8
				uint8* m;
Packit 7838c8
				uint32 n;
Packit 7838c8
				m=(uint8*)origdata;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeSbyteByte(*m);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					{
Packit 7838c8
						_TIFFfree(origdata);
Packit 7838c8
						return(err);
Packit 7838c8
					}
Packit 7838c8
					m++;
Packit 7838c8
				}
Packit 7838c8
				*value=(int8*)origdata;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
			*value=(int8*)origdata;
Packit 7838c8
			return(TIFFReadDirEntryErrOk);
Packit 7838c8
	}
Packit 7838c8
	data=(int8*)_TIFFmalloc(count);
Packit 7838c8
	if (data==0)
Packit 7838c8
	{
Packit 7838c8
		_TIFFfree(origdata);
Packit 7838c8
		return(TIFFReadDirEntryErrAlloc);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
			{
Packit 7838c8
				uint16* ma;
Packit 7838c8
				int8* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint16*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabShort(ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeSbyteShort(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(int8)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
			{
Packit 7838c8
				int16* ma;
Packit 7838c8
				int8* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int16*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabShort((uint16*)ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeSbyteSshort(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(int8)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
			{
Packit 7838c8
				uint32* ma;
Packit 7838c8
				int8* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong(ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeSbyteLong(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(int8)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
			{
Packit 7838c8
				int32* ma;
Packit 7838c8
				int8* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong((uint32*)ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeSbyteSlong(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(int8)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
			{
Packit 7838c8
				uint64* ma;
Packit 7838c8
				int8* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint64*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong8(ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeSbyteLong8(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(int8)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			{
Packit 7838c8
				int64* ma;
Packit 7838c8
				int8* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int64*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong8((uint64*)ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeSbyteSlong8(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(int8)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
	}
Packit 7838c8
	_TIFFfree(origdata);
Packit 7838c8
	if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
	{
Packit 7838c8
		_TIFFfree(data);
Packit 7838c8
		return(err);
Packit 7838c8
	}
Packit 7838c8
	*value=data;
Packit 7838c8
	return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryShortArray(TIFF* tif, TIFFDirEntry* direntry, uint16** value)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	uint32 count;
Packit 7838c8
	void* origdata;
Packit 7838c8
	uint16* data;
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			break;
Packit 7838c8
		default:
Packit 7838c8
			return(TIFFReadDirEntryErrType);
Packit 7838c8
	}
Packit 7838c8
	err=TIFFReadDirEntryArray(tif,direntry,&count,2,&origdata);
Packit 7838c8
	if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
Packit 7838c8
	{
Packit 7838c8
		*value=0;
Packit 7838c8
		return(err);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
			*value=(uint16*)origdata;
Packit 7838c8
			if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
				TIFFSwabArrayOfShort(*value,count);  
Packit 7838c8
			return(TIFFReadDirEntryErrOk);
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
			{
Packit 7838c8
				int16* m;
Packit 7838c8
				uint32 n;
Packit 7838c8
				m=(int16*)origdata;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabShort((uint16*)m);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeShortSshort(*m);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					{
Packit 7838c8
						_TIFFfree(origdata);
Packit 7838c8
						return(err);
Packit 7838c8
					}
Packit 7838c8
					m++;
Packit 7838c8
				}
Packit 7838c8
				*value=(uint16*)origdata;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
	}
Packit 7838c8
	data=(uint16*)_TIFFmalloc(count*2);
Packit 7838c8
	if (data==0)
Packit 7838c8
	{
Packit 7838c8
		_TIFFfree(origdata);
Packit 7838c8
		return(TIFFReadDirEntryErrAlloc);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
			{
Packit 7838c8
				uint8* ma;
Packit 7838c8
				uint16* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint8*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
					*mb++=(uint16)(*ma++);
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
			{
Packit 7838c8
				int8* ma;
Packit 7838c8
				uint16* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int8*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeShortSbyte(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(uint16)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
			{
Packit 7838c8
				uint32* ma;
Packit 7838c8
				uint16* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong(ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeShortLong(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(uint16)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
			{
Packit 7838c8
				int32* ma;
Packit 7838c8
				uint16* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong((uint32*)ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeShortSlong(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(uint16)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
			{
Packit 7838c8
				uint64* ma;
Packit 7838c8
				uint16* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint64*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong8(ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeShortLong8(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(uint16)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			{
Packit 7838c8
				int64* ma;
Packit 7838c8
				uint16* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int64*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong8((uint64*)ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeShortSlong8(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(uint16)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
	}
Packit 7838c8
	_TIFFfree(origdata);
Packit 7838c8
	if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
	{
Packit 7838c8
		_TIFFfree(data);
Packit 7838c8
		return(err);
Packit 7838c8
	}
Packit 7838c8
	*value=data;
Packit 7838c8
	return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntrySshortArray(TIFF* tif, TIFFDirEntry* direntry, int16** value)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	uint32 count;
Packit 7838c8
	void* origdata;
Packit 7838c8
	int16* data;
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			break;
Packit 7838c8
		default:
Packit 7838c8
			return(TIFFReadDirEntryErrType);
Packit 7838c8
	}
Packit 7838c8
	err=TIFFReadDirEntryArray(tif,direntry,&count,2,&origdata);
Packit 7838c8
	if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
Packit 7838c8
	{
Packit 7838c8
		*value=0;
Packit 7838c8
		return(err);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
			{
Packit 7838c8
				uint16* m;
Packit 7838c8
				uint32 n;
Packit 7838c8
				m=(uint16*)origdata;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabShort(m);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeSshortShort(*m);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					{
Packit 7838c8
						_TIFFfree(origdata);
Packit 7838c8
						return(err);
Packit 7838c8
					}
Packit 7838c8
					m++;
Packit 7838c8
				}
Packit 7838c8
				*value=(int16*)origdata;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
			*value=(int16*)origdata;
Packit 7838c8
			if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
				TIFFSwabArrayOfShort((uint16*)(*value),count);
Packit 7838c8
			return(TIFFReadDirEntryErrOk);
Packit 7838c8
	}
Packit 7838c8
	data=(int16*)_TIFFmalloc(count*2);
Packit 7838c8
	if (data==0)
Packit 7838c8
	{
Packit 7838c8
		_TIFFfree(origdata);
Packit 7838c8
		return(TIFFReadDirEntryErrAlloc);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
			{
Packit 7838c8
				uint8* ma;
Packit 7838c8
				int16* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint8*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
					*mb++=(int16)(*ma++);
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
			{
Packit 7838c8
				int8* ma;
Packit 7838c8
				int16* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int8*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
					*mb++=(int16)(*ma++);
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
			{
Packit 7838c8
				uint32* ma;
Packit 7838c8
				int16* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong(ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeSshortLong(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(int16)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
			{
Packit 7838c8
				int32* ma;
Packit 7838c8
				int16* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong((uint32*)ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeSshortSlong(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(int16)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
			{
Packit 7838c8
				uint64* ma;
Packit 7838c8
				int16* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint64*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong8(ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeSshortLong8(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(int16)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			{
Packit 7838c8
				int64* ma;
Packit 7838c8
				int16* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int64*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong8((uint64*)ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeSshortSlong8(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(int16)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
	}
Packit 7838c8
	_TIFFfree(origdata);
Packit 7838c8
	if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
	{
Packit 7838c8
		_TIFFfree(data);
Packit 7838c8
		return(err);
Packit 7838c8
	}
Packit 7838c8
	*value=data;
Packit 7838c8
	return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryLongArray(TIFF* tif, TIFFDirEntry* direntry, uint32** value)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	uint32 count;
Packit 7838c8
	void* origdata;
Packit 7838c8
	uint32* data;
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			break;
Packit 7838c8
		default:
Packit 7838c8
			return(TIFFReadDirEntryErrType);
Packit 7838c8
	}
Packit 7838c8
	err=TIFFReadDirEntryArray(tif,direntry,&count,4,&origdata);
Packit 7838c8
	if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
Packit 7838c8
	{
Packit 7838c8
		*value=0;
Packit 7838c8
		return(err);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
			*value=(uint32*)origdata;
Packit 7838c8
			if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
				TIFFSwabArrayOfLong(*value,count);
Packit 7838c8
			return(TIFFReadDirEntryErrOk);
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
			{
Packit 7838c8
				int32* m;
Packit 7838c8
				uint32 n;
Packit 7838c8
				m=(int32*)origdata;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong((uint32*)m);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeLongSlong(*m);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					{
Packit 7838c8
						_TIFFfree(origdata);
Packit 7838c8
						return(err);
Packit 7838c8
					}
Packit 7838c8
					m++;
Packit 7838c8
				}
Packit 7838c8
				*value=(uint32*)origdata;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
	}
Packit 7838c8
	data=(uint32*)_TIFFmalloc(count*4);
Packit 7838c8
	if (data==0)
Packit 7838c8
	{
Packit 7838c8
		_TIFFfree(origdata);
Packit 7838c8
		return(TIFFReadDirEntryErrAlloc);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
			{
Packit 7838c8
				uint8* ma;
Packit 7838c8
				uint32* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint8*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
					*mb++=(uint32)(*ma++);
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
			{
Packit 7838c8
				int8* ma;
Packit 7838c8
				uint32* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int8*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeLongSbyte(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(uint32)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
			{
Packit 7838c8
				uint16* ma;
Packit 7838c8
				uint32* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint16*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabShort(ma);
Packit 7838c8
					*mb++=(uint32)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
			{
Packit 7838c8
				int16* ma;
Packit 7838c8
				uint32* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int16*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabShort((uint16*)ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeLongSshort(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(uint32)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
			{
Packit 7838c8
				uint64* ma;
Packit 7838c8
				uint32* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint64*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong8(ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeLongLong8(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(uint32)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			{
Packit 7838c8
				int64* ma;
Packit 7838c8
				uint32* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int64*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong8((uint64*)ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeLongSlong8(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(uint32)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
	}
Packit 7838c8
	_TIFFfree(origdata);
Packit 7838c8
	if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
	{
Packit 7838c8
		_TIFFfree(data);
Packit 7838c8
		return(err);
Packit 7838c8
	}
Packit 7838c8
	*value=data;
Packit 7838c8
	return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntrySlongArray(TIFF* tif, TIFFDirEntry* direntry, int32** value)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	uint32 count;
Packit 7838c8
	void* origdata;
Packit 7838c8
	int32* data;
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			break;
Packit 7838c8
		default:
Packit 7838c8
			return(TIFFReadDirEntryErrType);
Packit 7838c8
	}
Packit 7838c8
	err=TIFFReadDirEntryArray(tif,direntry,&count,4,&origdata);
Packit 7838c8
	if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
Packit 7838c8
	{
Packit 7838c8
		*value=0;
Packit 7838c8
		return(err);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
			{
Packit 7838c8
				uint32* m;
Packit 7838c8
				uint32 n;
Packit 7838c8
				m=(uint32*)origdata;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong((uint32*)m);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeSlongLong(*m);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					{
Packit 7838c8
						_TIFFfree(origdata);
Packit 7838c8
						return(err);
Packit 7838c8
					}
Packit 7838c8
					m++;
Packit 7838c8
				}
Packit 7838c8
				*value=(int32*)origdata;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
			*value=(int32*)origdata;
Packit 7838c8
			if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
				TIFFSwabArrayOfLong((uint32*)(*value),count);
Packit 7838c8
			return(TIFFReadDirEntryErrOk);
Packit 7838c8
	}
Packit 7838c8
	data=(int32*)_TIFFmalloc(count*4);
Packit 7838c8
	if (data==0)
Packit 7838c8
	{
Packit 7838c8
		_TIFFfree(origdata);
Packit 7838c8
		return(TIFFReadDirEntryErrAlloc);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
			{
Packit 7838c8
				uint8* ma;
Packit 7838c8
				int32* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint8*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
					*mb++=(int32)(*ma++);
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
			{
Packit 7838c8
				int8* ma;
Packit 7838c8
				int32* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int8*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
					*mb++=(int32)(*ma++);
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
			{
Packit 7838c8
				uint16* ma;
Packit 7838c8
				int32* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint16*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabShort(ma);
Packit 7838c8
					*mb++=(int32)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
			{
Packit 7838c8
				int16* ma;
Packit 7838c8
				int32* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int16*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabShort((uint16*)ma);
Packit 7838c8
					*mb++=(int32)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
			{
Packit 7838c8
				uint64* ma;
Packit 7838c8
				int32* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint64*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong8(ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeSlongLong8(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(int32)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			{
Packit 7838c8
				int64* ma;
Packit 7838c8
				int32* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int64*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong8((uint64*)ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeSlongSlong8(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(int32)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
	}
Packit 7838c8
	_TIFFfree(origdata);
Packit 7838c8
	if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
	{
Packit 7838c8
		_TIFFfree(data);
Packit 7838c8
		return(err);
Packit 7838c8
	}
Packit 7838c8
	*value=data;
Packit 7838c8
	return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryLong8ArrayWithLimit(
Packit 7838c8
        TIFF* tif, TIFFDirEntry* direntry, uint64** value, uint64 maxcount)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	uint32 count;
Packit 7838c8
	void* origdata;
Packit 7838c8
	uint64* data;
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			break;
Packit 7838c8
		default:
Packit 7838c8
			return(TIFFReadDirEntryErrType);
Packit 7838c8
	}
Packit 7838c8
	err=TIFFReadDirEntryArrayWithLimit(tif,direntry,&count,8,&origdata,maxcount);
Packit 7838c8
	if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
Packit 7838c8
	{
Packit 7838c8
		*value=0;
Packit 7838c8
		return(err);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
			*value=(uint64*)origdata;
Packit 7838c8
			if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
				TIFFSwabArrayOfLong8(*value,count);
Packit 7838c8
			return(TIFFReadDirEntryErrOk);
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			{
Packit 7838c8
				int64* m;
Packit 7838c8
				uint32 n;
Packit 7838c8
				m=(int64*)origdata;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong8((uint64*)m);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeLong8Slong8(*m);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					{
Packit 7838c8
						_TIFFfree(origdata);
Packit 7838c8
						return(err);
Packit 7838c8
					}
Packit 7838c8
					m++;
Packit 7838c8
				}
Packit 7838c8
				*value=(uint64*)origdata;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
	}
Packit 7838c8
	data=(uint64*)_TIFFmalloc(count*8);
Packit 7838c8
	if (data==0)
Packit 7838c8
	{
Packit 7838c8
		_TIFFfree(origdata);
Packit 7838c8
		return(TIFFReadDirEntryErrAlloc);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
			{
Packit 7838c8
				uint8* ma;
Packit 7838c8
				uint64* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint8*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
					*mb++=(uint64)(*ma++);
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
			{
Packit 7838c8
				int8* ma;
Packit 7838c8
				uint64* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int8*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeLong8Sbyte(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(uint64)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
			{
Packit 7838c8
				uint16* ma;
Packit 7838c8
				uint64* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint16*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabShort(ma);
Packit 7838c8
					*mb++=(uint64)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
			{
Packit 7838c8
				int16* ma;
Packit 7838c8
				uint64* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int16*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabShort((uint16*)ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeLong8Sshort(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(uint64)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
			{
Packit 7838c8
				uint32* ma;
Packit 7838c8
				uint64* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong(ma);
Packit 7838c8
					*mb++=(uint64)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
			{
Packit 7838c8
				int32* ma;
Packit 7838c8
				uint64* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong((uint32*)ma);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeLong8Slong(*ma);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
						break;
Packit 7838c8
					*mb++=(uint64)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
	}
Packit 7838c8
	_TIFFfree(origdata);
Packit 7838c8
	if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
	{
Packit 7838c8
		_TIFFfree(data);
Packit 7838c8
		return(err);
Packit 7838c8
	}
Packit 7838c8
	*value=data;
Packit 7838c8
	return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryLong8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value)
Packit 7838c8
{
Packit 7838c8
    return TIFFReadDirEntryLong8ArrayWithLimit(tif, direntry, value, ~((uint64)0));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntrySlong8Array(TIFF* tif, TIFFDirEntry* direntry, int64** value)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	uint32 count;
Packit 7838c8
	void* origdata;
Packit 7838c8
	int64* data;
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			break;
Packit 7838c8
		default:
Packit 7838c8
			return(TIFFReadDirEntryErrType);
Packit 7838c8
	}
Packit 7838c8
	err=TIFFReadDirEntryArray(tif,direntry,&count,8,&origdata);
Packit 7838c8
	if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
Packit 7838c8
	{
Packit 7838c8
		*value=0;
Packit 7838c8
		return(err);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
			{
Packit 7838c8
				uint64* m;
Packit 7838c8
				uint32 n;
Packit 7838c8
				m=(uint64*)origdata;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong8(m);
Packit 7838c8
					err=TIFFReadDirEntryCheckRangeSlong8Long8(*m);
Packit 7838c8
					if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
					{
Packit 7838c8
						_TIFFfree(origdata);
Packit 7838c8
						return(err);
Packit 7838c8
					}
Packit 7838c8
					m++;
Packit 7838c8
				}
Packit 7838c8
				*value=(int64*)origdata;
Packit 7838c8
				return(TIFFReadDirEntryErrOk);
Packit 7838c8
			}
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			*value=(int64*)origdata;
Packit 7838c8
			if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
				TIFFSwabArrayOfLong8((uint64*)(*value),count);
Packit 7838c8
			return(TIFFReadDirEntryErrOk);
Packit 7838c8
	}
Packit 7838c8
	data=(int64*)_TIFFmalloc(count*8);
Packit 7838c8
	if (data==0)
Packit 7838c8
	{
Packit 7838c8
		_TIFFfree(origdata);
Packit 7838c8
		return(TIFFReadDirEntryErrAlloc);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
			{
Packit 7838c8
				uint8* ma;
Packit 7838c8
				int64* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint8*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
					*mb++=(int64)(*ma++);
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
			{
Packit 7838c8
				int8* ma;
Packit 7838c8
				int64* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int8*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
					*mb++=(int64)(*ma++);
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
			{
Packit 7838c8
				uint16* ma;
Packit 7838c8
				int64* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint16*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabShort(ma);
Packit 7838c8
					*mb++=(int64)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
			{
Packit 7838c8
				int16* ma;
Packit 7838c8
				int64* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int16*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabShort((uint16*)ma);
Packit 7838c8
					*mb++=(int64)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
			{
Packit 7838c8
				uint32* ma;
Packit 7838c8
				int64* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong(ma);
Packit 7838c8
					*mb++=(int64)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
			{
Packit 7838c8
				int32* ma;
Packit 7838c8
				int64* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong((uint32*)ma);
Packit 7838c8
					*mb++=(int64)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
	}
Packit 7838c8
	_TIFFfree(origdata);
Packit 7838c8
	*value=data;
Packit 7838c8
	return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryFloatArray(TIFF* tif, TIFFDirEntry* direntry, float** value)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	uint32 count;
Packit 7838c8
	void* origdata;
Packit 7838c8
	float* data;
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
		case TIFF_RATIONAL:
Packit 7838c8
		case TIFF_SRATIONAL:
Packit 7838c8
		case TIFF_FLOAT:
Packit 7838c8
		case TIFF_DOUBLE:
Packit 7838c8
			break;
Packit 7838c8
		default:
Packit 7838c8
			return(TIFFReadDirEntryErrType);
Packit 7838c8
	}
Packit 7838c8
	err=TIFFReadDirEntryArray(tif,direntry,&count,4,&origdata);
Packit 7838c8
	if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
Packit 7838c8
	{
Packit 7838c8
		*value=0;
Packit 7838c8
		return(err);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_FLOAT:
Packit 7838c8
			if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
				TIFFSwabArrayOfLong((uint32*)origdata,count);  
Packit 7838c8
			TIFFCvtIEEEDoubleToNative(tif,count,(float*)origdata);
Packit 7838c8
			*value=(float*)origdata;
Packit 7838c8
			return(TIFFReadDirEntryErrOk);
Packit 7838c8
	}
Packit 7838c8
	data=(float*)_TIFFmalloc(count*sizeof(float));
Packit 7838c8
	if (data==0)
Packit 7838c8
	{
Packit 7838c8
		_TIFFfree(origdata);
Packit 7838c8
		return(TIFFReadDirEntryErrAlloc);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
			{
Packit 7838c8
				uint8* ma;
Packit 7838c8
				float* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint8*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
					*mb++=(float)(*ma++);
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
			{
Packit 7838c8
				int8* ma;
Packit 7838c8
				float* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int8*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
					*mb++=(float)(*ma++);
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
			{
Packit 7838c8
				uint16* ma;
Packit 7838c8
				float* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint16*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabShort(ma);
Packit 7838c8
					*mb++=(float)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
			{
Packit 7838c8
				int16* ma;
Packit 7838c8
				float* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int16*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabShort((uint16*)ma);
Packit 7838c8
					*mb++=(float)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
			{
Packit 7838c8
				uint32* ma;
Packit 7838c8
				float* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong(ma);
Packit 7838c8
					*mb++=(float)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
			{
Packit 7838c8
				int32* ma;
Packit 7838c8
				float* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong((uint32*)ma);
Packit 7838c8
					*mb++=(float)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
			{
Packit 7838c8
				uint64* ma;
Packit 7838c8
				float* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint64*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong8(ma);
Packit 7838c8
#if defined(__WIN32__) && (_MSC_VER < 1500)
Packit 7838c8
					/*
Packit 7838c8
					 * XXX: MSVC 6.0 does not support
Packit 7838c8
					 * conversion of 64-bit integers into
Packit 7838c8
					 * floating point values.
Packit 7838c8
					 */
Packit 7838c8
					*mb++ = _TIFFUInt64ToFloat(*ma++);
Packit 7838c8
#else
Packit 7838c8
					*mb++ = (float)(*ma++);
Packit 7838c8
#endif
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			{
Packit 7838c8
				int64* ma;
Packit 7838c8
				float* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int64*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong8((uint64*)ma);
Packit 7838c8
					*mb++=(float)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_RATIONAL:
Packit 7838c8
			{
Packit 7838c8
				uint32* ma;
Packit 7838c8
				uint32 maa;
Packit 7838c8
				uint32 mab;
Packit 7838c8
				float* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong(ma);
Packit 7838c8
					maa=*ma++;
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong(ma);
Packit 7838c8
					mab=*ma++;
Packit 7838c8
					if (mab==0)
Packit 7838c8
						*mb++=0.0;
Packit 7838c8
					else
Packit 7838c8
						*mb++=(float)maa/(float)mab;
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SRATIONAL:
Packit 7838c8
			{
Packit 7838c8
				uint32* ma;
Packit 7838c8
				int32 maa;
Packit 7838c8
				uint32 mab;
Packit 7838c8
				float* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong(ma);
Packit 7838c8
					maa=*(int32*)ma;
Packit 7838c8
					ma++;
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong(ma);
Packit 7838c8
					mab=*ma++;
Packit 7838c8
					if (mab==0)
Packit 7838c8
						*mb++=0.0;
Packit 7838c8
					else
Packit 7838c8
						*mb++=(float)maa/(float)mab;
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_DOUBLE:
Packit 7838c8
			{
Packit 7838c8
				double* ma;
Packit 7838c8
				float* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
					TIFFSwabArrayOfLong8((uint64*)origdata,count);
Packit 7838c8
				TIFFCvtIEEEDoubleToNative(tif,count,(double*)origdata);
Packit 7838c8
				ma=(double*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
                                {
Packit 7838c8
                                    double val = *ma++;
Packit 7838c8
                                    if( val > FLT_MAX )
Packit 7838c8
                                        val = FLT_MAX;
Packit 7838c8
                                    else if( val < -FLT_MAX )
Packit 7838c8
                                        val = -FLT_MAX;
Packit 7838c8
                                    *mb++=(float)val;
Packit 7838c8
                                }
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
	}
Packit 7838c8
	_TIFFfree(origdata);
Packit 7838c8
	*value=data;
Packit 7838c8
	return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr
Packit 7838c8
TIFFReadDirEntryDoubleArray(TIFF* tif, TIFFDirEntry* direntry, double** value)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	uint32 count;
Packit 7838c8
	void* origdata;
Packit 7838c8
	double* data;
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
		case TIFF_RATIONAL:
Packit 7838c8
		case TIFF_SRATIONAL:
Packit 7838c8
		case TIFF_FLOAT:
Packit 7838c8
		case TIFF_DOUBLE:
Packit 7838c8
			break;
Packit 7838c8
		default:
Packit 7838c8
			return(TIFFReadDirEntryErrType);
Packit 7838c8
	}
Packit 7838c8
	err=TIFFReadDirEntryArray(tif,direntry,&count,8,&origdata);
Packit 7838c8
	if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
Packit 7838c8
	{
Packit 7838c8
		*value=0;
Packit 7838c8
		return(err);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_DOUBLE:
Packit 7838c8
			if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
				TIFFSwabArrayOfLong8((uint64*)origdata,count);
Packit 7838c8
			TIFFCvtIEEEDoubleToNative(tif,count,(double*)origdata);
Packit 7838c8
			*value=(double*)origdata;
Packit 7838c8
			return(TIFFReadDirEntryErrOk);
Packit 7838c8
	}
Packit 7838c8
	data=(double*)_TIFFmalloc(count*sizeof(double));
Packit 7838c8
	if (data==0)
Packit 7838c8
	{
Packit 7838c8
		_TIFFfree(origdata);
Packit 7838c8
		return(TIFFReadDirEntryErrAlloc);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_BYTE:
Packit 7838c8
			{
Packit 7838c8
				uint8* ma;
Packit 7838c8
				double* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint8*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
					*mb++=(double)(*ma++);
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SBYTE:
Packit 7838c8
			{
Packit 7838c8
				int8* ma;
Packit 7838c8
				double* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int8*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
					*mb++=(double)(*ma++);
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SHORT:
Packit 7838c8
			{
Packit 7838c8
				uint16* ma;
Packit 7838c8
				double* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint16*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabShort(ma);
Packit 7838c8
					*mb++=(double)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SSHORT:
Packit 7838c8
			{
Packit 7838c8
				int16* ma;
Packit 7838c8
				double* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int16*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabShort((uint16*)ma);
Packit 7838c8
					*mb++=(double)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
			{
Packit 7838c8
				uint32* ma;
Packit 7838c8
				double* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong(ma);
Packit 7838c8
					*mb++=(double)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SLONG:
Packit 7838c8
			{
Packit 7838c8
				int32* ma;
Packit 7838c8
				double* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong((uint32*)ma);
Packit 7838c8
					*mb++=(double)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
			{
Packit 7838c8
				uint64* ma;
Packit 7838c8
				double* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint64*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong8(ma);
Packit 7838c8
#if defined(__WIN32__) && (_MSC_VER < 1500)
Packit 7838c8
					/*
Packit 7838c8
					 * XXX: MSVC 6.0 does not support
Packit 7838c8
					 * conversion of 64-bit integers into
Packit 7838c8
					 * floating point values.
Packit 7838c8
					 */
Packit 7838c8
					*mb++ = _TIFFUInt64ToDouble(*ma++);
Packit 7838c8
#else
Packit 7838c8
					*mb++ = (double)(*ma++);
Packit 7838c8
#endif
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SLONG8:
Packit 7838c8
			{
Packit 7838c8
				int64* ma;
Packit 7838c8
				double* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(int64*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong8((uint64*)ma);
Packit 7838c8
					*mb++=(double)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_RATIONAL:
Packit 7838c8
			{
Packit 7838c8
				uint32* ma;
Packit 7838c8
				uint32 maa;
Packit 7838c8
				uint32 mab;
Packit 7838c8
				double* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong(ma);
Packit 7838c8
					maa=*ma++;
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong(ma);
Packit 7838c8
					mab=*ma++;
Packit 7838c8
					if (mab==0)
Packit 7838c8
						*mb++=0.0;
Packit 7838c8
					else
Packit 7838c8
						*mb++=(double)maa/(double)mab;
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_SRATIONAL:
Packit 7838c8
			{
Packit 7838c8
				uint32* ma;
Packit 7838c8
				int32 maa;
Packit 7838c8
				uint32 mab;
Packit 7838c8
				double* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong(ma);
Packit 7838c8
					maa=*(int32*)ma;
Packit 7838c8
					ma++;
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong(ma);
Packit 7838c8
					mab=*ma++;
Packit 7838c8
					if (mab==0)
Packit 7838c8
						*mb++=0.0;
Packit 7838c8
					else
Packit 7838c8
						*mb++=(double)maa/(double)mab;
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case TIFF_FLOAT:
Packit 7838c8
			{
Packit 7838c8
				float* ma;
Packit 7838c8
				double* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
					TIFFSwabArrayOfLong((uint32*)origdata,count);  
Packit 7838c8
				TIFFCvtIEEEFloatToNative(tif,count,(float*)origdata);
Packit 7838c8
				ma=(float*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
					*mb++=(double)(*ma++);
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
	}
Packit 7838c8
	_TIFFfree(origdata);
Packit 7838c8
	*value=data;
Packit 7838c8
	return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	uint32 count;
Packit 7838c8
	void* origdata;
Packit 7838c8
	uint64* data;
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
		case TIFF_IFD:
Packit 7838c8
		case TIFF_IFD8:
Packit 7838c8
			break;
Packit 7838c8
		default:
Packit 7838c8
			return(TIFFReadDirEntryErrType);
Packit 7838c8
	}
Packit 7838c8
	err=TIFFReadDirEntryArray(tif,direntry,&count,8,&origdata);
Packit 7838c8
	if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
Packit 7838c8
	{
Packit 7838c8
		*value=0;
Packit 7838c8
		return(err);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_LONG8:
Packit 7838c8
		case TIFF_IFD8:
Packit 7838c8
			*value=(uint64*)origdata;
Packit 7838c8
			if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
				TIFFSwabArrayOfLong8(*value,count);
Packit 7838c8
			return(TIFFReadDirEntryErrOk);
Packit 7838c8
	}
Packit 7838c8
	data=(uint64*)_TIFFmalloc(count*8);
Packit 7838c8
	if (data==0)
Packit 7838c8
	{
Packit 7838c8
		_TIFFfree(origdata);
Packit 7838c8
		return(TIFFReadDirEntryErrAlloc);
Packit 7838c8
	}
Packit 7838c8
	switch (direntry->tdir_type)
Packit 7838c8
	{
Packit 7838c8
		case TIFF_LONG:
Packit 7838c8
		case TIFF_IFD:
Packit 7838c8
			{
Packit 7838c8
				uint32* ma;
Packit 7838c8
				uint64* mb;
Packit 7838c8
				uint32 n;
Packit 7838c8
				ma=(uint32*)origdata;
Packit 7838c8
				mb=data;
Packit 7838c8
				for (n=0; n
Packit 7838c8
				{
Packit 7838c8
					if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
						TIFFSwabLong(ma);
Packit 7838c8
					*mb++=(uint64)(*ma++);
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
	}
Packit 7838c8
	_TIFFfree(origdata);
Packit 7838c8
	*value=data;
Packit 7838c8
	return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	uint16* m;
Packit 7838c8
	uint16* na;
Packit 7838c8
	uint16 nb;
Packit 7838c8
	if (direntry->tdir_count<(uint64)tif->tif_dir.td_samplesperpixel)
Packit 7838c8
		return(TIFFReadDirEntryErrCount);
Packit 7838c8
	err=TIFFReadDirEntryShortArray(tif,direntry,&m);
Packit 7838c8
	if (err!=TIFFReadDirEntryErrOk || m == NULL)
Packit 7838c8
		return(err);
Packit 7838c8
	na=m;
Packit 7838c8
	nb=tif->tif_dir.td_samplesperpixel;
Packit 7838c8
	*value=*na++;
Packit 7838c8
	nb--;
Packit 7838c8
	while (nb>0)
Packit 7838c8
	{
Packit 7838c8
		if (*na++!=*value)
Packit 7838c8
		{
Packit 7838c8
			err=TIFFReadDirEntryErrPsdif;
Packit 7838c8
			break;
Packit 7838c8
		}
Packit 7838c8
		nb--;
Packit 7838c8
	}
Packit 7838c8
	_TIFFfree(m);
Packit 7838c8
	return(err);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#if 0
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleDouble(TIFF* tif, TIFFDirEntry* direntry, double* value)
Packit 7838c8
{
Packit 7838c8
	enum TIFFReadDirEntryErr err;
Packit 7838c8
	double* m;
Packit 7838c8
	double* na;
Packit 7838c8
	uint16 nb;
Packit 7838c8
	if (direntry->tdir_count<(uint64)tif->tif_dir.td_samplesperpixel)
Packit 7838c8
		return(TIFFReadDirEntryErrCount);
Packit 7838c8
	err=TIFFReadDirEntryDoubleArray(tif,direntry,&m);
Packit 7838c8
	if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
		return(err);
Packit 7838c8
	na=m;
Packit 7838c8
	nb=tif->tif_dir.td_samplesperpixel;
Packit 7838c8
	*value=*na++;
Packit 7838c8
	nb--;
Packit 7838c8
	while (nb>0)
Packit 7838c8
	{
Packit 7838c8
		if (*na++!=*value)
Packit 7838c8
		{
Packit 7838c8
			err=TIFFReadDirEntryErrPsdif;
Packit 7838c8
			break;
Packit 7838c8
		}
Packit 7838c8
		nb--;
Packit 7838c8
	}
Packit 7838c8
	_TIFFfree(m);
Packit 7838c8
	return(err);
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static void TIFFReadDirEntryCheckedByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value)
Packit 7838c8
{
Packit 7838c8
	(void) tif;
Packit 7838c8
	*value=*(uint8*)(&direntry->tdir_offset);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void TIFFReadDirEntryCheckedSbyte(TIFF* tif, TIFFDirEntry* direntry, int8* value)
Packit 7838c8
{
Packit 7838c8
	(void) tif;
Packit 7838c8
	*value=*(int8*)(&direntry->tdir_offset);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void TIFFReadDirEntryCheckedShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value)
Packit 7838c8
{
Packit 7838c8
	*value = direntry->tdir_offset.toff_short;
Packit 7838c8
	/* *value=*(uint16*)(&direntry->tdir_offset); */
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabShort(value);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void TIFFReadDirEntryCheckedSshort(TIFF* tif, TIFFDirEntry* direntry, int16* value)
Packit 7838c8
{
Packit 7838c8
	*value=*(int16*)(&direntry->tdir_offset);
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabShort((uint16*)value);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void TIFFReadDirEntryCheckedLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value)
Packit 7838c8
{
Packit 7838c8
	*value=*(uint32*)(&direntry->tdir_offset);
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabLong(value);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void TIFFReadDirEntryCheckedSlong(TIFF* tif, TIFFDirEntry* direntry, int32* value)
Packit 7838c8
{
Packit 7838c8
	*value=*(int32*)(&direntry->tdir_offset);
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabLong((uint32*)value);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value)
Packit 7838c8
{
Packit 7838c8
	if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
	{
Packit 7838c8
		enum TIFFReadDirEntryErr err;
Packit 7838c8
		uint32 offset = direntry->tdir_offset.toff_long;
Packit 7838c8
		if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
			TIFFSwabLong(&offset);
Packit 7838c8
		err=TIFFReadDirEntryData(tif,offset,8,value);
Packit 7838c8
		if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
			return(err);
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
		*value = direntry->tdir_offset.toff_long8;
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabLong8(value);
Packit 7838c8
	return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSlong8(TIFF* tif, TIFFDirEntry* direntry, int64* value)
Packit 7838c8
{
Packit 7838c8
	if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
	{
Packit 7838c8
		enum TIFFReadDirEntryErr err;
Packit 7838c8
		uint32 offset = direntry->tdir_offset.toff_long;
Packit 7838c8
		if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
			TIFFSwabLong(&offset);
Packit 7838c8
		err=TIFFReadDirEntryData(tif,offset,8,value);
Packit 7838c8
		if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
			return(err);
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
		*value=*(int64*)(&direntry->tdir_offset);
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabLong8((uint64*)value);
Packit 7838c8
	return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedRational(TIFF* tif, TIFFDirEntry* direntry, double* value)
Packit 7838c8
{
Packit 7838c8
	UInt64Aligned_t m;
Packit 7838c8
Packit 7838c8
	assert(sizeof(double)==8);
Packit 7838c8
	assert(sizeof(uint64)==8);
Packit 7838c8
	assert(sizeof(uint32)==4);
Packit 7838c8
	if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
	{
Packit 7838c8
		enum TIFFReadDirEntryErr err;
Packit 7838c8
		uint32 offset = direntry->tdir_offset.toff_long;
Packit 7838c8
		if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
			TIFFSwabLong(&offset);
Packit 7838c8
		err=TIFFReadDirEntryData(tif,offset,8,m.i);
Packit 7838c8
		if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
			return(err);
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
		m.l = direntry->tdir_offset.toff_long8;
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabArrayOfLong(m.i,2);
Packit 7838c8
        /* Not completely sure what we should do when m.i[1]==0, but some */
Packit 7838c8
        /* sanitizers do not like division by 0.0: */
Packit 7838c8
        /* http://bugzilla.maptools.org/show_bug.cgi?id=2644 */
Packit 7838c8
	if (m.i[0]==0 || m.i[1]==0)
Packit 7838c8
		*value=0.0;
Packit 7838c8
	else
Packit 7838c8
		*value=(double)m.i[0]/(double)m.i[1];
Packit 7838c8
	return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSrational(TIFF* tif, TIFFDirEntry* direntry, double* value)
Packit 7838c8
{
Packit 7838c8
	UInt64Aligned_t m;
Packit 7838c8
	assert(sizeof(double)==8);
Packit 7838c8
	assert(sizeof(uint64)==8);
Packit 7838c8
	assert(sizeof(int32)==4);
Packit 7838c8
	assert(sizeof(uint32)==4);
Packit 7838c8
	if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
	{
Packit 7838c8
		enum TIFFReadDirEntryErr err;
Packit 7838c8
		uint32 offset = direntry->tdir_offset.toff_long;
Packit 7838c8
		if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
			TIFFSwabLong(&offset);
Packit 7838c8
		err=TIFFReadDirEntryData(tif,offset,8,m.i);
Packit 7838c8
		if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
			return(err);
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
		m.l=direntry->tdir_offset.toff_long8;
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabArrayOfLong(m.i,2);
Packit 7838c8
        /* Not completely sure what we should do when m.i[1]==0, but some */
Packit 7838c8
        /* sanitizers do not like division by 0.0: */
Packit 7838c8
        /* http://bugzilla.maptools.org/show_bug.cgi?id=2644 */
Packit 7838c8
	if ((int32)m.i[0]==0 || m.i[1]==0)
Packit 7838c8
		*value=0.0;
Packit 7838c8
	else
Packit 7838c8
		*value=(double)((int32)m.i[0])/(double)m.i[1];
Packit 7838c8
	return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static void TIFFReadDirEntryCheckedFloat(TIFF* tif, TIFFDirEntry* direntry, float* value)
Packit 7838c8
{
Packit 7838c8
         union
Packit 7838c8
	 {
Packit 7838c8
	   float  f;
Packit 7838c8
	   uint32 i;
Packit 7838c8
	 } float_union;
Packit 7838c8
	assert(sizeof(float)==4);
Packit 7838c8
	assert(sizeof(uint32)==4);
Packit 7838c8
	assert(sizeof(float_union)==4);
Packit 7838c8
	float_union.i=*(uint32*)(&direntry->tdir_offset);
Packit 7838c8
	*value=float_union.f;
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabLong((uint32*)value);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedDouble(TIFF* tif, TIFFDirEntry* direntry, double* value)
Packit 7838c8
{
Packit 7838c8
	assert(sizeof(double)==8);
Packit 7838c8
	assert(sizeof(uint64)==8);
Packit 7838c8
	assert(sizeof(UInt64Aligned_t)==8);
Packit 7838c8
	if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
	{
Packit 7838c8
		enum TIFFReadDirEntryErr err;
Packit 7838c8
		uint32 offset = direntry->tdir_offset.toff_long;
Packit 7838c8
		if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
			TIFFSwabLong(&offset);
Packit 7838c8
		err=TIFFReadDirEntryData(tif,offset,8,value);
Packit 7838c8
		if (err!=TIFFReadDirEntryErrOk)
Packit 7838c8
			return(err);
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
	{
Packit 7838c8
	       UInt64Aligned_t uint64_union;
Packit 7838c8
	       uint64_union.l=direntry->tdir_offset.toff_long8;
Packit 7838c8
	       *value=uint64_union.d;
Packit 7838c8
	}
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabLong8((uint64*)value);
Packit 7838c8
	return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSbyte(int8 value)
Packit 7838c8
{
Packit 7838c8
	if (value<0)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteShort(uint16 value)
Packit 7838c8
{
Packit 7838c8
	if (value>0xFF)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSshort(int16 value)
Packit 7838c8
{
Packit 7838c8
	if ((value<0)||(value>0xFF))
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong(uint32 value)
Packit 7838c8
{
Packit 7838c8
	if (value>0xFF)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong(int32 value)
Packit 7838c8
{
Packit 7838c8
	if ((value<0)||(value>0xFF))
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong8(uint64 value)
Packit 7838c8
{
Packit 7838c8
	if (value>0xFF)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong8(int64 value)
Packit 7838c8
{
Packit 7838c8
	if ((value<0)||(value>0xFF))
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteByte(uint8 value)
Packit 7838c8
{
Packit 7838c8
	if (value>0x7F)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteShort(uint16 value)
Packit 7838c8
{
Packit 7838c8
	if (value>0x7F)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSshort(int16 value)
Packit 7838c8
{
Packit 7838c8
	if ((value<-0x80)||(value>0x7F))
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong(uint32 value)
Packit 7838c8
{
Packit 7838c8
	if (value>0x7F)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong(int32 value)
Packit 7838c8
{
Packit 7838c8
	if ((value<-0x80)||(value>0x7F))
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong8(uint64 value)
Packit 7838c8
{
Packit 7838c8
	if (value>0x7F)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong8(int64 value)
Packit 7838c8
{
Packit 7838c8
	if ((value<-0x80)||(value>0x7F))
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSbyte(int8 value)
Packit 7838c8
{
Packit 7838c8
	if (value<0)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSshort(int16 value)
Packit 7838c8
{
Packit 7838c8
	if (value<0)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong(uint32 value)
Packit 7838c8
{
Packit 7838c8
	if (value>0xFFFF)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong(int32 value)
Packit 7838c8
{
Packit 7838c8
	if ((value<0)||(value>0xFFFF))
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong8(uint64 value)
Packit 7838c8
{
Packit 7838c8
	if (value>0xFFFF)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong8(int64 value)
Packit 7838c8
{
Packit 7838c8
	if ((value<0)||(value>0xFFFF))
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortShort(uint16 value)
Packit 7838c8
{
Packit 7838c8
	if (value>0x7FFF)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong(uint32 value)
Packit 7838c8
{
Packit 7838c8
	if (value>0x7FFF)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong(int32 value)
Packit 7838c8
{
Packit 7838c8
	if ((value<-0x8000)||(value>0x7FFF))
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong8(uint64 value)
Packit 7838c8
{
Packit 7838c8
	if (value>0x7FFF)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong8(int64 value)
Packit 7838c8
{
Packit 7838c8
	if ((value<-0x8000)||(value>0x7FFF))
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSbyte(int8 value)
Packit 7838c8
{
Packit 7838c8
	if (value<0)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSshort(int16 value)
Packit 7838c8
{
Packit 7838c8
	if (value<0)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSlong(int32 value)
Packit 7838c8
{
Packit 7838c8
	if (value<0)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Largest 32-bit unsigned integer value.
Packit 7838c8
 */
Packit 7838c8
#define TIFF_UINT32_MAX 0xFFFFFFFFU
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr
Packit 7838c8
TIFFReadDirEntryCheckRangeLongLong8(uint64 value)
Packit 7838c8
{
Packit 7838c8
	if (value > TIFF_UINT32_MAX)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr
Packit 7838c8
TIFFReadDirEntryCheckRangeLongSlong8(int64 value)
Packit 7838c8
{
Packit 7838c8
	if ((value < 0) || (value > (int64) TIFF_UINT32_MAX))
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#undef TIFF_UINT32_MAX
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr
Packit 7838c8
TIFFReadDirEntryCheckRangeSlongLong(uint32 value)
Packit 7838c8
{
Packit 7838c8
	if (value > 0x7FFFFFFFUL)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/* Check that the 8-byte unsigned value can fit in a 4-byte unsigned range */
Packit 7838c8
static enum TIFFReadDirEntryErr
Packit 7838c8
TIFFReadDirEntryCheckRangeSlongLong8(uint64 value)
Packit 7838c8
{
Packit 7838c8
	if (value > 0x7FFFFFFF)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/* Check that the 8-byte signed value can fit in a 4-byte signed range */
Packit 7838c8
static enum TIFFReadDirEntryErr
Packit 7838c8
TIFFReadDirEntryCheckRangeSlongSlong8(int64 value)
Packit 7838c8
{
Packit 7838c8
        if ((value < 0-((int64) 0x7FFFFFFF+1)) || (value > 0x7FFFFFFF))
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static enum TIFFReadDirEntryErr
Packit 7838c8
TIFFReadDirEntryCheckRangeLong8Sbyte(int8 value)
Packit 7838c8
{
Packit 7838c8
	if (value < 0)
Packit 7838c8
		return(TIFFReadDirEntryErrRange);
Packit 7838c8
	else
Packit 7838c8
		return(TIFFReadDirEntryErrOk);
Packit <