|
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 |
< |