1 /* $Id: tif_dirread.c,v 1.204 2016-11-16 15:14:15 erouault Exp $ */
4 * Copyright (c) 1988-1997 Sam Leffler
5 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
7 * Permission to use, copy, modify, distribute, and sell this software and
8 * its documentation for any purpose is hereby granted without fee, provided
9 * that (i) the above copyright notices and this permission notice appear in
10 * all copies of the software and related documentation, and (ii) the names of
11 * Sam Leffler and Silicon Graphics may not be used in any advertising or
12 * publicity relating to the software without the specific, prior written
13 * permission of Sam Leffler and Silicon Graphics.
15 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
17 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
19 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
20 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
21 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
22 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
23 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
30 * Directory Read Support Routines.
33 /* Suggested pending improvements:
34 * - add a field 'ignore' to the TIFFDirEntry structure, to flag status,
35 * eliminating current use of the IGNORE value, and therefore eliminating
36 * current irrational behaviour on tags with tag id code 0
37 * - add a field 'field_info' to the TIFFDirEntry structure, and set that with
38 * the pointer to the appropriate TIFFField structure early on in
39 * TIFFReadDirectory, so as to eliminate current possibly repetitive lookup.
44 #define IGNORE 0 /* tag placeholder used below */
45 #define FAILED_FII ((uint32) -1)
48 # define TIFFCvtIEEEFloatToNative(tif, n, fp)
49 # define TIFFCvtIEEEDoubleToNative(tif, n, dp)
51 extern void TIFFCvtIEEEFloatToNative(TIFF
*, uint32
, float*);
52 extern void TIFFCvtIEEEDoubleToNative(TIFF
*, uint32
, double*);
55 enum TIFFReadDirEntryErr
{
56 TIFFReadDirEntryErrOk
= 0,
57 TIFFReadDirEntryErrCount
= 1,
58 TIFFReadDirEntryErrType
= 2,
59 TIFFReadDirEntryErrIo
= 3,
60 TIFFReadDirEntryErrRange
= 4,
61 TIFFReadDirEntryErrPsdif
= 5,
62 TIFFReadDirEntryErrSizesan
= 6,
63 TIFFReadDirEntryErrAlloc
= 7,
66 static enum TIFFReadDirEntryErr
TIFFReadDirEntryByte(TIFF
* tif
, TIFFDirEntry
* direntry
, uint8
* value
);
67 static enum TIFFReadDirEntryErr
TIFFReadDirEntryShort(TIFF
* tif
, TIFFDirEntry
* direntry
, uint16
* value
);
68 static enum TIFFReadDirEntryErr
TIFFReadDirEntryLong(TIFF
* tif
, TIFFDirEntry
* direntry
, uint32
* value
);
69 static enum TIFFReadDirEntryErr
TIFFReadDirEntryLong8(TIFF
* tif
, TIFFDirEntry
* direntry
, uint64
* value
);
70 static enum TIFFReadDirEntryErr
TIFFReadDirEntryFloat(TIFF
* tif
, TIFFDirEntry
* direntry
, float* value
);
71 static enum TIFFReadDirEntryErr
TIFFReadDirEntryDouble(TIFF
* tif
, TIFFDirEntry
* direntry
, double* value
);
72 static enum TIFFReadDirEntryErr
TIFFReadDirEntryIfd8(TIFF
* tif
, TIFFDirEntry
* direntry
, uint64
* value
);
74 static enum TIFFReadDirEntryErr
TIFFReadDirEntryArray(TIFF
* tif
, TIFFDirEntry
* direntry
, uint32
* count
, uint32 desttypesize
, void** value
);
75 static enum TIFFReadDirEntryErr
TIFFReadDirEntryByteArray(TIFF
* tif
, TIFFDirEntry
* direntry
, uint8
** value
);
76 static enum TIFFReadDirEntryErr
TIFFReadDirEntrySbyteArray(TIFF
* tif
, TIFFDirEntry
* direntry
, int8
** value
);
77 static enum TIFFReadDirEntryErr
TIFFReadDirEntryShortArray(TIFF
* tif
, TIFFDirEntry
* direntry
, uint16
** value
);
78 static enum TIFFReadDirEntryErr
TIFFReadDirEntrySshortArray(TIFF
* tif
, TIFFDirEntry
* direntry
, int16
** value
);
79 static enum TIFFReadDirEntryErr
TIFFReadDirEntryLongArray(TIFF
* tif
, TIFFDirEntry
* direntry
, uint32
** value
);
80 static enum TIFFReadDirEntryErr
TIFFReadDirEntrySlongArray(TIFF
* tif
, TIFFDirEntry
* direntry
, int32
** value
);
81 static enum TIFFReadDirEntryErr
TIFFReadDirEntryLong8Array(TIFF
* tif
, TIFFDirEntry
* direntry
, uint64
** value
);
82 static enum TIFFReadDirEntryErr
TIFFReadDirEntrySlong8Array(TIFF
* tif
, TIFFDirEntry
* direntry
, int64
** value
);
83 static enum TIFFReadDirEntryErr
TIFFReadDirEntryFloatArray(TIFF
* tif
, TIFFDirEntry
* direntry
, float** value
);
84 static enum TIFFReadDirEntryErr
TIFFReadDirEntryDoubleArray(TIFF
* tif
, TIFFDirEntry
* direntry
, double** value
);
85 static enum TIFFReadDirEntryErr
TIFFReadDirEntryIfd8Array(TIFF
* tif
, TIFFDirEntry
* direntry
, uint64
** value
);
87 static enum TIFFReadDirEntryErr
TIFFReadDirEntryPersampleShort(TIFF
* tif
, TIFFDirEntry
* direntry
, uint16
* value
);
89 static enum TIFFReadDirEntryErr
TIFFReadDirEntryPersampleDouble(TIFF
* tif
, TIFFDirEntry
* direntry
, double* value
);
92 static void TIFFReadDirEntryCheckedByte(TIFF
* tif
, TIFFDirEntry
* direntry
, uint8
* value
);
93 static void TIFFReadDirEntryCheckedSbyte(TIFF
* tif
, TIFFDirEntry
* direntry
, int8
* value
);
94 static void TIFFReadDirEntryCheckedShort(TIFF
* tif
, TIFFDirEntry
* direntry
, uint16
* value
);
95 static void TIFFReadDirEntryCheckedSshort(TIFF
* tif
, TIFFDirEntry
* direntry
, int16
* value
);
96 static void TIFFReadDirEntryCheckedLong(TIFF
* tif
, TIFFDirEntry
* direntry
, uint32
* value
);
97 static void TIFFReadDirEntryCheckedSlong(TIFF
* tif
, TIFFDirEntry
* direntry
, int32
* value
);
98 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckedLong8(TIFF
* tif
, TIFFDirEntry
* direntry
, uint64
* value
);
99 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckedSlong8(TIFF
* tif
, TIFFDirEntry
* direntry
, int64
* value
);
100 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckedRational(TIFF
* tif
, TIFFDirEntry
* direntry
, double* value
);
101 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckedSrational(TIFF
* tif
, TIFFDirEntry
* direntry
, double* value
);
102 static void TIFFReadDirEntryCheckedFloat(TIFF
* tif
, TIFFDirEntry
* direntry
, float* value
);
103 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckedDouble(TIFF
* tif
, TIFFDirEntry
* direntry
, double* value
);
105 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeByteSbyte(int8 value
);
106 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeByteShort(uint16 value
);
107 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeByteSshort(int16 value
);
108 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeByteLong(uint32 value
);
109 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeByteSlong(int32 value
);
110 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeByteLong8(uint64 value
);
111 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeByteSlong8(int64 value
);
113 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSbyteByte(uint8 value
);
114 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSbyteShort(uint16 value
);
115 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSbyteSshort(int16 value
);
116 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSbyteLong(uint32 value
);
117 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSbyteSlong(int32 value
);
118 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSbyteLong8(uint64 value
);
119 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSbyteSlong8(int64 value
);
121 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeShortSbyte(int8 value
);
122 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeShortSshort(int16 value
);
123 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeShortLong(uint32 value
);
124 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeShortSlong(int32 value
);
125 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeShortLong8(uint64 value
);
126 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeShortSlong8(int64 value
);
128 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSshortShort(uint16 value
);
129 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSshortLong(uint32 value
);
130 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSshortSlong(int32 value
);
131 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSshortLong8(uint64 value
);
132 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSshortSlong8(int64 value
);
134 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeLongSbyte(int8 value
);
135 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeLongSshort(int16 value
);
136 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeLongSlong(int32 value
);
137 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeLongLong8(uint64 value
);
138 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeLongSlong8(int64 value
);
140 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSlongLong(uint32 value
);
141 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSlongLong8(uint64 value
);
142 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSlongSlong8(int64 value
);
144 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeLong8Sbyte(int8 value
);
145 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeLong8Sshort(int16 value
);
146 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeLong8Slong(int32 value
);
147 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeLong8Slong8(int64 value
);
149 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSlong8Long8(uint64 value
);
151 static enum TIFFReadDirEntryErr
TIFFReadDirEntryData(TIFF
* tif
, uint64 offset
, tmsize_t size
, void* dest
);
152 static void TIFFReadDirEntryOutputErr(TIFF
* tif
, enum TIFFReadDirEntryErr err
, const char* module
, const char* tagname
, int recover
);
154 static void TIFFReadDirectoryCheckOrder(TIFF
* tif
, TIFFDirEntry
* dir
, uint16 dircount
);
155 static TIFFDirEntry
* TIFFReadDirectoryFindEntry(TIFF
* tif
, TIFFDirEntry
* dir
, uint16 dircount
, uint16 tagid
);
156 static void TIFFReadDirectoryFindFieldInfo(TIFF
* tif
, uint16 tagid
, uint32
* fii
);
158 static int EstimateStripByteCounts(TIFF
* tif
, TIFFDirEntry
* dir
, uint16 dircount
);
159 static void MissingRequired(TIFF
*, const char*);
160 static int TIFFCheckDirOffset(TIFF
* tif
, uint64 diroff
);
161 static int CheckDirCount(TIFF
*, TIFFDirEntry
*, uint32
);
162 static uint16
TIFFFetchDirectory(TIFF
* tif
, uint64 diroff
, TIFFDirEntry
** pdir
, uint64
* nextdiroff
);
163 static int TIFFFetchNormalTag(TIFF
*, TIFFDirEntry
*, int recover
);
164 static int TIFFFetchStripThing(TIFF
* tif
, TIFFDirEntry
* dir
, uint32 nstrips
, uint64
** lpp
);
165 static int TIFFFetchSubjectDistance(TIFF
*, TIFFDirEntry
*);
166 static void ChopUpSingleUncompressedStrip(TIFF
*);
167 static uint64
TIFFReadUInt64(const uint8
*value
);
169 static int _TIFFFillStrilesInternal( TIFF
*tif
, int loadStripByteCount
);
171 typedef union _UInt64Aligned_t
181 Unaligned safe copy of a uint64 value from an octet array.
183 static uint64
TIFFReadUInt64(const uint8
*value
)
185 UInt64Aligned_t result
;
187 result
.c
[0]=value
[0];
188 result
.c
[1]=value
[1];
189 result
.c
[2]=value
[2];
190 result
.c
[3]=value
[3];
191 result
.c
[4]=value
[4];
192 result
.c
[5]=value
[5];
193 result
.c
[6]=value
[6];
194 result
.c
[7]=value
[7];
199 static enum TIFFReadDirEntryErr
TIFFReadDirEntryByte(TIFF
* tif
, TIFFDirEntry
* direntry
, uint8
* value
)
201 enum TIFFReadDirEntryErr err
;
202 if (direntry
->tdir_count
!=1)
203 return(TIFFReadDirEntryErrCount
);
204 switch (direntry
->tdir_type
)
207 TIFFReadDirEntryCheckedByte(tif
,direntry
,value
);
208 return(TIFFReadDirEntryErrOk
);
212 TIFFReadDirEntryCheckedSbyte(tif
,direntry
,&m
);
213 err
=TIFFReadDirEntryCheckRangeByteSbyte(m
);
214 if (err
!=TIFFReadDirEntryErrOk
)
217 return(TIFFReadDirEntryErrOk
);
222 TIFFReadDirEntryCheckedShort(tif
,direntry
,&m
);
223 err
=TIFFReadDirEntryCheckRangeByteShort(m
);
224 if (err
!=TIFFReadDirEntryErrOk
)
227 return(TIFFReadDirEntryErrOk
);
232 TIFFReadDirEntryCheckedSshort(tif
,direntry
,&m
);
233 err
=TIFFReadDirEntryCheckRangeByteSshort(m
);
234 if (err
!=TIFFReadDirEntryErrOk
)
237 return(TIFFReadDirEntryErrOk
);
242 TIFFReadDirEntryCheckedLong(tif
,direntry
,&m
);
243 err
=TIFFReadDirEntryCheckRangeByteLong(m
);
244 if (err
!=TIFFReadDirEntryErrOk
)
247 return(TIFFReadDirEntryErrOk
);
252 TIFFReadDirEntryCheckedSlong(tif
,direntry
,&m
);
253 err
=TIFFReadDirEntryCheckRangeByteSlong(m
);
254 if (err
!=TIFFReadDirEntryErrOk
)
257 return(TIFFReadDirEntryErrOk
);
262 err
=TIFFReadDirEntryCheckedLong8(tif
,direntry
,&m
);
263 if (err
!=TIFFReadDirEntryErrOk
)
265 err
=TIFFReadDirEntryCheckRangeByteLong8(m
);
266 if (err
!=TIFFReadDirEntryErrOk
)
269 return(TIFFReadDirEntryErrOk
);
274 err
=TIFFReadDirEntryCheckedSlong8(tif
,direntry
,&m
);
275 if (err
!=TIFFReadDirEntryErrOk
)
277 err
=TIFFReadDirEntryCheckRangeByteSlong8(m
);
278 if (err
!=TIFFReadDirEntryErrOk
)
281 return(TIFFReadDirEntryErrOk
);
284 return(TIFFReadDirEntryErrType
);
288 static enum TIFFReadDirEntryErr
TIFFReadDirEntryShort(TIFF
* tif
, TIFFDirEntry
* direntry
, uint16
* value
)
290 enum TIFFReadDirEntryErr err
;
291 if (direntry
->tdir_count
!=1)
292 return(TIFFReadDirEntryErrCount
);
293 switch (direntry
->tdir_type
)
298 TIFFReadDirEntryCheckedByte(tif
,direntry
,&m
);
300 return(TIFFReadDirEntryErrOk
);
305 TIFFReadDirEntryCheckedSbyte(tif
,direntry
,&m
);
306 err
=TIFFReadDirEntryCheckRangeShortSbyte(m
);
307 if (err
!=TIFFReadDirEntryErrOk
)
310 return(TIFFReadDirEntryErrOk
);
313 TIFFReadDirEntryCheckedShort(tif
,direntry
,value
);
314 return(TIFFReadDirEntryErrOk
);
318 TIFFReadDirEntryCheckedSshort(tif
,direntry
,&m
);
319 err
=TIFFReadDirEntryCheckRangeShortSshort(m
);
320 if (err
!=TIFFReadDirEntryErrOk
)
323 return(TIFFReadDirEntryErrOk
);
328 TIFFReadDirEntryCheckedLong(tif
,direntry
,&m
);
329 err
=TIFFReadDirEntryCheckRangeShortLong(m
);
330 if (err
!=TIFFReadDirEntryErrOk
)
333 return(TIFFReadDirEntryErrOk
);
338 TIFFReadDirEntryCheckedSlong(tif
,direntry
,&m
);
339 err
=TIFFReadDirEntryCheckRangeShortSlong(m
);
340 if (err
!=TIFFReadDirEntryErrOk
)
343 return(TIFFReadDirEntryErrOk
);
348 err
=TIFFReadDirEntryCheckedLong8(tif
,direntry
,&m
);
349 if (err
!=TIFFReadDirEntryErrOk
)
351 err
=TIFFReadDirEntryCheckRangeShortLong8(m
);
352 if (err
!=TIFFReadDirEntryErrOk
)
355 return(TIFFReadDirEntryErrOk
);
360 err
=TIFFReadDirEntryCheckedSlong8(tif
,direntry
,&m
);
361 if (err
!=TIFFReadDirEntryErrOk
)
363 err
=TIFFReadDirEntryCheckRangeShortSlong8(m
);
364 if (err
!=TIFFReadDirEntryErrOk
)
367 return(TIFFReadDirEntryErrOk
);
370 return(TIFFReadDirEntryErrType
);
374 static enum TIFFReadDirEntryErr
TIFFReadDirEntryLong(TIFF
* tif
, TIFFDirEntry
* direntry
, uint32
* value
)
376 enum TIFFReadDirEntryErr err
;
377 if (direntry
->tdir_count
!=1)
378 return(TIFFReadDirEntryErrCount
);
379 switch (direntry
->tdir_type
)
384 TIFFReadDirEntryCheckedByte(tif
,direntry
,&m
);
386 return(TIFFReadDirEntryErrOk
);
391 TIFFReadDirEntryCheckedSbyte(tif
,direntry
,&m
);
392 err
=TIFFReadDirEntryCheckRangeLongSbyte(m
);
393 if (err
!=TIFFReadDirEntryErrOk
)
396 return(TIFFReadDirEntryErrOk
);
401 TIFFReadDirEntryCheckedShort(tif
,direntry
,&m
);
403 return(TIFFReadDirEntryErrOk
);
408 TIFFReadDirEntryCheckedSshort(tif
,direntry
,&m
);
409 err
=TIFFReadDirEntryCheckRangeLongSshort(m
);
410 if (err
!=TIFFReadDirEntryErrOk
)
413 return(TIFFReadDirEntryErrOk
);
416 TIFFReadDirEntryCheckedLong(tif
,direntry
,value
);
417 return(TIFFReadDirEntryErrOk
);
421 TIFFReadDirEntryCheckedSlong(tif
,direntry
,&m
);
422 err
=TIFFReadDirEntryCheckRangeLongSlong(m
);
423 if (err
!=TIFFReadDirEntryErrOk
)
426 return(TIFFReadDirEntryErrOk
);
431 err
=TIFFReadDirEntryCheckedLong8(tif
,direntry
,&m
);
432 if (err
!=TIFFReadDirEntryErrOk
)
434 err
=TIFFReadDirEntryCheckRangeLongLong8(m
);
435 if (err
!=TIFFReadDirEntryErrOk
)
438 return(TIFFReadDirEntryErrOk
);
443 err
=TIFFReadDirEntryCheckedSlong8(tif
,direntry
,&m
);
444 if (err
!=TIFFReadDirEntryErrOk
)
446 err
=TIFFReadDirEntryCheckRangeLongSlong8(m
);
447 if (err
!=TIFFReadDirEntryErrOk
)
450 return(TIFFReadDirEntryErrOk
);
453 return(TIFFReadDirEntryErrType
);
457 static enum TIFFReadDirEntryErr
TIFFReadDirEntryLong8(TIFF
* tif
, TIFFDirEntry
* direntry
, uint64
* value
)
459 enum TIFFReadDirEntryErr err
;
460 if (direntry
->tdir_count
!=1)
461 return(TIFFReadDirEntryErrCount
);
462 switch (direntry
->tdir_type
)
467 TIFFReadDirEntryCheckedByte(tif
,direntry
,&m
);
469 return(TIFFReadDirEntryErrOk
);
474 TIFFReadDirEntryCheckedSbyte(tif
,direntry
,&m
);
475 err
=TIFFReadDirEntryCheckRangeLong8Sbyte(m
);
476 if (err
!=TIFFReadDirEntryErrOk
)
479 return(TIFFReadDirEntryErrOk
);
484 TIFFReadDirEntryCheckedShort(tif
,direntry
,&m
);
486 return(TIFFReadDirEntryErrOk
);
491 TIFFReadDirEntryCheckedSshort(tif
,direntry
,&m
);
492 err
=TIFFReadDirEntryCheckRangeLong8Sshort(m
);
493 if (err
!=TIFFReadDirEntryErrOk
)
496 return(TIFFReadDirEntryErrOk
);
501 TIFFReadDirEntryCheckedLong(tif
,direntry
,&m
);
503 return(TIFFReadDirEntryErrOk
);
508 TIFFReadDirEntryCheckedSlong(tif
,direntry
,&m
);
509 err
=TIFFReadDirEntryCheckRangeLong8Slong(m
);
510 if (err
!=TIFFReadDirEntryErrOk
)
513 return(TIFFReadDirEntryErrOk
);
516 err
=TIFFReadDirEntryCheckedLong8(tif
,direntry
,value
);
521 err
=TIFFReadDirEntryCheckedSlong8(tif
,direntry
,&m
);
522 if (err
!=TIFFReadDirEntryErrOk
)
524 err
=TIFFReadDirEntryCheckRangeLong8Slong8(m
);
525 if (err
!=TIFFReadDirEntryErrOk
)
528 return(TIFFReadDirEntryErrOk
);
531 return(TIFFReadDirEntryErrType
);
535 static enum TIFFReadDirEntryErr
TIFFReadDirEntryFloat(TIFF
* tif
, TIFFDirEntry
* direntry
, float* value
)
537 enum TIFFReadDirEntryErr err
;
538 if (direntry
->tdir_count
!=1)
539 return(TIFFReadDirEntryErrCount
);
540 switch (direntry
->tdir_type
)
545 TIFFReadDirEntryCheckedByte(tif
,direntry
,&m
);
547 return(TIFFReadDirEntryErrOk
);
552 TIFFReadDirEntryCheckedSbyte(tif
,direntry
,&m
);
554 return(TIFFReadDirEntryErrOk
);
559 TIFFReadDirEntryCheckedShort(tif
,direntry
,&m
);
561 return(TIFFReadDirEntryErrOk
);
566 TIFFReadDirEntryCheckedSshort(tif
,direntry
,&m
);
568 return(TIFFReadDirEntryErrOk
);
573 TIFFReadDirEntryCheckedLong(tif
,direntry
,&m
);
575 return(TIFFReadDirEntryErrOk
);
580 TIFFReadDirEntryCheckedSlong(tif
,direntry
,&m
);
582 return(TIFFReadDirEntryErrOk
);
587 err
=TIFFReadDirEntryCheckedLong8(tif
,direntry
,&m
);
588 if (err
!=TIFFReadDirEntryErrOk
)
590 #if defined(__WIN32__) && (_MSC_VER < 1500)
592 * XXX: MSVC 6.0 does not support conversion
593 * of 64-bit integers into floating point
596 *value
= _TIFFUInt64ToFloat(m
);
600 return(TIFFReadDirEntryErrOk
);
605 err
=TIFFReadDirEntryCheckedSlong8(tif
,direntry
,&m
);
606 if (err
!=TIFFReadDirEntryErrOk
)
609 return(TIFFReadDirEntryErrOk
);
614 err
=TIFFReadDirEntryCheckedRational(tif
,direntry
,&m
);
615 if (err
!=TIFFReadDirEntryErrOk
)
618 return(TIFFReadDirEntryErrOk
);
623 err
=TIFFReadDirEntryCheckedSrational(tif
,direntry
,&m
);
624 if (err
!=TIFFReadDirEntryErrOk
)
627 return(TIFFReadDirEntryErrOk
);
630 TIFFReadDirEntryCheckedFloat(tif
,direntry
,value
);
631 return(TIFFReadDirEntryErrOk
);
635 err
=TIFFReadDirEntryCheckedDouble(tif
,direntry
,&m
);
636 if (err
!=TIFFReadDirEntryErrOk
)
639 return(TIFFReadDirEntryErrOk
);
642 return(TIFFReadDirEntryErrType
);
646 static enum TIFFReadDirEntryErr
TIFFReadDirEntryDouble(TIFF
* tif
, TIFFDirEntry
* direntry
, double* value
)
648 enum TIFFReadDirEntryErr err
;
649 if (direntry
->tdir_count
!=1)
650 return(TIFFReadDirEntryErrCount
);
651 switch (direntry
->tdir_type
)
656 TIFFReadDirEntryCheckedByte(tif
,direntry
,&m
);
658 return(TIFFReadDirEntryErrOk
);
663 TIFFReadDirEntryCheckedSbyte(tif
,direntry
,&m
);
665 return(TIFFReadDirEntryErrOk
);
670 TIFFReadDirEntryCheckedShort(tif
,direntry
,&m
);
672 return(TIFFReadDirEntryErrOk
);
677 TIFFReadDirEntryCheckedSshort(tif
,direntry
,&m
);
679 return(TIFFReadDirEntryErrOk
);
684 TIFFReadDirEntryCheckedLong(tif
,direntry
,&m
);
686 return(TIFFReadDirEntryErrOk
);
691 TIFFReadDirEntryCheckedSlong(tif
,direntry
,&m
);
693 return(TIFFReadDirEntryErrOk
);
698 err
=TIFFReadDirEntryCheckedLong8(tif
,direntry
,&m
);
699 if (err
!=TIFFReadDirEntryErrOk
)
701 #if defined(__WIN32__) && (_MSC_VER < 1500)
703 * XXX: MSVC 6.0 does not support conversion
704 * of 64-bit integers into floating point
707 *value
= _TIFFUInt64ToDouble(m
);
711 return(TIFFReadDirEntryErrOk
);
716 err
=TIFFReadDirEntryCheckedSlong8(tif
,direntry
,&m
);
717 if (err
!=TIFFReadDirEntryErrOk
)
720 return(TIFFReadDirEntryErrOk
);
723 err
=TIFFReadDirEntryCheckedRational(tif
,direntry
,value
);
726 err
=TIFFReadDirEntryCheckedSrational(tif
,direntry
,value
);
731 TIFFReadDirEntryCheckedFloat(tif
,direntry
,&m
);
733 return(TIFFReadDirEntryErrOk
);
736 err
=TIFFReadDirEntryCheckedDouble(tif
,direntry
,value
);
739 return(TIFFReadDirEntryErrType
);
743 static enum TIFFReadDirEntryErr
TIFFReadDirEntryIfd8(TIFF
* tif
, TIFFDirEntry
* direntry
, uint64
* value
)
745 enum TIFFReadDirEntryErr err
;
746 if (direntry
->tdir_count
!=1)
747 return(TIFFReadDirEntryErrCount
);
748 switch (direntry
->tdir_type
)
754 TIFFReadDirEntryCheckedLong(tif
,direntry
,&m
);
756 return(TIFFReadDirEntryErrOk
);
760 err
=TIFFReadDirEntryCheckedLong8(tif
,direntry
,value
);
763 return(TIFFReadDirEntryErrType
);
767 static enum TIFFReadDirEntryErr
TIFFReadDirEntryArray(TIFF
* tif
, TIFFDirEntry
* direntry
, uint32
* count
, uint32 desttypesize
, void** value
)
772 typesize
=TIFFDataWidth(direntry
->tdir_type
);
773 if ((direntry
->tdir_count
==0)||(typesize
==0))
776 return(TIFFReadDirEntryErrOk
);
781 * As a sanity check, make sure we have no more than a 2GB tag array
782 * in either the current data type or the dest data type. This also
783 * avoids problems with overflow of tmsize_t on 32bit systems.
785 if ((uint64
)(2147483647/typesize
)<direntry
->tdir_count
)
786 return(TIFFReadDirEntryErrSizesan
);
787 if ((uint64
)(2147483647/desttypesize
)<direntry
->tdir_count
)
788 return(TIFFReadDirEntryErrSizesan
);
790 *count
=(uint32
)direntry
->tdir_count
;
791 datasize
=(*count
)*typesize
;
792 assert((tmsize_t
)datasize
>0);
793 data
=_TIFFCheckMalloc(tif
, *count
, typesize
, "ReadDirEntryArray");
795 return(TIFFReadDirEntryErrAlloc
);
796 if (!(tif
->tif_flags
&TIFF_BIGTIFF
))
799 _TIFFmemcpy(data
,&direntry
->tdir_offset
,datasize
);
802 enum TIFFReadDirEntryErr err
;
803 uint32 offset
= direntry
->tdir_offset
.toff_long
;
804 if (tif
->tif_flags
&TIFF_SWAB
)
805 TIFFSwabLong(&offset
);
806 err
=TIFFReadDirEntryData(tif
,(uint64
)offset
,(tmsize_t
)datasize
,data
);
807 if (err
!=TIFFReadDirEntryErrOk
)
817 _TIFFmemcpy(data
,&direntry
->tdir_offset
,datasize
);
820 enum TIFFReadDirEntryErr err
;
821 uint64 offset
= direntry
->tdir_offset
.toff_long8
;
822 if (tif
->tif_flags
&TIFF_SWAB
)
823 TIFFSwabLong8(&offset
);
824 err
=TIFFReadDirEntryData(tif
,offset
,(tmsize_t
)datasize
,data
);
825 if (err
!=TIFFReadDirEntryErrOk
)
833 return(TIFFReadDirEntryErrOk
);
836 static enum TIFFReadDirEntryErr
TIFFReadDirEntryByteArray(TIFF
* tif
, TIFFDirEntry
* direntry
, uint8
** value
)
838 enum TIFFReadDirEntryErr err
;
842 switch (direntry
->tdir_type
)
856 return(TIFFReadDirEntryErrType
);
858 err
=TIFFReadDirEntryArray(tif
,direntry
,&count
,1,&origdata
);
859 if ((err
!=TIFFReadDirEntryErrOk
)||(origdata
==0))
864 switch (direntry
->tdir_type
)
869 *value
=(uint8
*)origdata
;
870 return(TIFFReadDirEntryErrOk
);
876 for (n
=0; n
<count
; n
++)
878 err
=TIFFReadDirEntryCheckRangeByteSbyte(*m
);
879 if (err
!=TIFFReadDirEntryErrOk
)
886 *value
=(uint8
*)origdata
;
887 return(TIFFReadDirEntryErrOk
);
890 data
=(uint8
*)_TIFFmalloc(count
);
894 return(TIFFReadDirEntryErrAlloc
);
896 switch (direntry
->tdir_type
)
903 ma
=(uint16
*)origdata
;
905 for (n
=0; n
<count
; n
++)
907 if (tif
->tif_flags
&TIFF_SWAB
)
909 err
=TIFFReadDirEntryCheckRangeByteShort(*ma
);
910 if (err
!=TIFFReadDirEntryErrOk
)
912 *mb
++=(uint8
)(*ma
++);
923 for (n
=0; n
<count
; n
++)
925 if (tif
->tif_flags
&TIFF_SWAB
)
926 TIFFSwabShort((uint16
*)ma
);
927 err
=TIFFReadDirEntryCheckRangeByteSshort(*ma
);
928 if (err
!=TIFFReadDirEntryErrOk
)
930 *mb
++=(uint8
)(*ma
++);
939 ma
=(uint32
*)origdata
;
941 for (n
=0; n
<count
; n
++)
943 if (tif
->tif_flags
&TIFF_SWAB
)
945 err
=TIFFReadDirEntryCheckRangeByteLong(*ma
);
946 if (err
!=TIFFReadDirEntryErrOk
)
948 *mb
++=(uint8
)(*ma
++);
959 for (n
=0; n
<count
; n
++)
961 if (tif
->tif_flags
&TIFF_SWAB
)
962 TIFFSwabLong((uint32
*)ma
);
963 err
=TIFFReadDirEntryCheckRangeByteSlong(*ma
);
964 if (err
!=TIFFReadDirEntryErrOk
)
966 *mb
++=(uint8
)(*ma
++);
975 ma
=(uint64
*)origdata
;
977 for (n
=0; n
<count
; n
++)
979 if (tif
->tif_flags
&TIFF_SWAB
)
981 err
=TIFFReadDirEntryCheckRangeByteLong8(*ma
);
982 if (err
!=TIFFReadDirEntryErrOk
)
984 *mb
++=(uint8
)(*ma
++);
995 for (n
=0; n
<count
; n
++)
997 if (tif
->tif_flags
&TIFF_SWAB
)
998 TIFFSwabLong8((uint64
*)ma
);
999 err
=TIFFReadDirEntryCheckRangeByteSlong8(*ma
);
1000 if (err
!=TIFFReadDirEntryErrOk
)
1002 *mb
++=(uint8
)(*ma
++);
1007 _TIFFfree(origdata
);
1008 if (err
!=TIFFReadDirEntryErrOk
)
1014 return(TIFFReadDirEntryErrOk
);
1017 static enum TIFFReadDirEntryErr
TIFFReadDirEntrySbyteArray(TIFF
* tif
, TIFFDirEntry
* direntry
, int8
** value
)
1019 enum TIFFReadDirEntryErr err
;
1023 switch (direntry
->tdir_type
)
1025 case TIFF_UNDEFINED
:
1036 return(TIFFReadDirEntryErrType
);
1038 err
=TIFFReadDirEntryArray(tif
,direntry
,&count
,1,&origdata
);
1039 if ((err
!=TIFFReadDirEntryErrOk
)||(origdata
==0))
1044 switch (direntry
->tdir_type
)
1046 case TIFF_UNDEFINED
:
1052 for (n
=0; n
<count
; n
++)
1054 err
=TIFFReadDirEntryCheckRangeSbyteByte(*m
);
1055 if (err
!=TIFFReadDirEntryErrOk
)
1057 _TIFFfree(origdata
);
1062 *value
=(int8
*)origdata
;
1063 return(TIFFReadDirEntryErrOk
);
1066 *value
=(int8
*)origdata
;
1067 return(TIFFReadDirEntryErrOk
);
1069 data
=(int8
*)_TIFFmalloc(count
);
1072 _TIFFfree(origdata
);
1073 return(TIFFReadDirEntryErrAlloc
);
1075 switch (direntry
->tdir_type
)
1082 ma
=(uint16
*)origdata
;
1084 for (n
=0; n
<count
; n
++)
1086 if (tif
->tif_flags
&TIFF_SWAB
)
1088 err
=TIFFReadDirEntryCheckRangeSbyteShort(*ma
);
1089 if (err
!=TIFFReadDirEntryErrOk
)
1091 *mb
++=(int8
)(*ma
++);
1100 ma
=(int16
*)origdata
;
1102 for (n
=0; n
<count
; n
++)
1104 if (tif
->tif_flags
&TIFF_SWAB
)
1105 TIFFSwabShort((uint16
*)ma
);
1106 err
=TIFFReadDirEntryCheckRangeSbyteSshort(*ma
);
1107 if (err
!=TIFFReadDirEntryErrOk
)
1109 *mb
++=(int8
)(*ma
++);
1118 ma
=(uint32
*)origdata
;
1120 for (n
=0; n
<count
; n
++)
1122 if (tif
->tif_flags
&TIFF_SWAB
)
1124 err
=TIFFReadDirEntryCheckRangeSbyteLong(*ma
);
1125 if (err
!=TIFFReadDirEntryErrOk
)
1127 *mb
++=(int8
)(*ma
++);
1136 ma
=(int32
*)origdata
;
1138 for (n
=0; n
<count
; n
++)
1140 if (tif
->tif_flags
&TIFF_SWAB
)
1141 TIFFSwabLong((uint32
*)ma
);
1142 err
=TIFFReadDirEntryCheckRangeSbyteSlong(*ma
);
1143 if (err
!=TIFFReadDirEntryErrOk
)
1145 *mb
++=(int8
)(*ma
++);
1154 ma
=(uint64
*)origdata
;
1156 for (n
=0; n
<count
; n
++)
1158 if (tif
->tif_flags
&TIFF_SWAB
)
1160 err
=TIFFReadDirEntryCheckRangeSbyteLong8(*ma
);
1161 if (err
!=TIFFReadDirEntryErrOk
)
1163 *mb
++=(int8
)(*ma
++);
1172 ma
=(int64
*)origdata
;
1174 for (n
=0; n
<count
; n
++)
1176 if (tif
->tif_flags
&TIFF_SWAB
)
1177 TIFFSwabLong8((uint64
*)ma
);
1178 err
=TIFFReadDirEntryCheckRangeSbyteSlong8(*ma
);
1179 if (err
!=TIFFReadDirEntryErrOk
)
1181 *mb
++=(int8
)(*ma
++);
1186 _TIFFfree(origdata
);
1187 if (err
!=TIFFReadDirEntryErrOk
)
1193 return(TIFFReadDirEntryErrOk
);
1196 static enum TIFFReadDirEntryErr
TIFFReadDirEntryShortArray(TIFF
* tif
, TIFFDirEntry
* direntry
, uint16
** value
)
1198 enum TIFFReadDirEntryErr err
;
1202 switch (direntry
->tdir_type
)
1214 return(TIFFReadDirEntryErrType
);
1216 err
=TIFFReadDirEntryArray(tif
,direntry
,&count
,2,&origdata
);
1217 if ((err
!=TIFFReadDirEntryErrOk
)||(origdata
==0))
1222 switch (direntry
->tdir_type
)
1225 *value
=(uint16
*)origdata
;
1226 if (tif
->tif_flags
&TIFF_SWAB
)
1227 TIFFSwabArrayOfShort(*value
,count
);
1228 return(TIFFReadDirEntryErrOk
);
1234 for (n
=0; n
<count
; n
++)
1236 if (tif
->tif_flags
&TIFF_SWAB
)
1237 TIFFSwabShort((uint16
*)m
);
1238 err
=TIFFReadDirEntryCheckRangeShortSshort(*m
);
1239 if (err
!=TIFFReadDirEntryErrOk
)
1241 _TIFFfree(origdata
);
1246 *value
=(uint16
*)origdata
;
1247 return(TIFFReadDirEntryErrOk
);
1250 data
=(uint16
*)_TIFFmalloc(count
*2);
1253 _TIFFfree(origdata
);
1254 return(TIFFReadDirEntryErrAlloc
);
1256 switch (direntry
->tdir_type
)
1263 ma
=(uint8
*)origdata
;
1265 for (n
=0; n
<count
; n
++)
1266 *mb
++=(uint16
)(*ma
++);
1276 for (n
=0; n
<count
; n
++)
1278 err
=TIFFReadDirEntryCheckRangeShortSbyte(*ma
);
1279 if (err
!=TIFFReadDirEntryErrOk
)
1281 *mb
++=(uint16
)(*ma
++);
1290 ma
=(uint32
*)origdata
;
1292 for (n
=0; n
<count
; n
++)
1294 if (tif
->tif_flags
&TIFF_SWAB
)
1296 err
=TIFFReadDirEntryCheckRangeShortLong(*ma
);
1297 if (err
!=TIFFReadDirEntryErrOk
)
1299 *mb
++=(uint16
)(*ma
++);
1308 ma
=(int32
*)origdata
;
1310 for (n
=0; n
<count
; n
++)
1312 if (tif
->tif_flags
&TIFF_SWAB
)
1313 TIFFSwabLong((uint32
*)ma
);
1314 err
=TIFFReadDirEntryCheckRangeShortSlong(*ma
);
1315 if (err
!=TIFFReadDirEntryErrOk
)
1317 *mb
++=(uint16
)(*ma
++);
1326 ma
=(uint64
*)origdata
;
1328 for (n
=0; n
<count
; n
++)
1330 if (tif
->tif_flags
&TIFF_SWAB
)
1332 err
=TIFFReadDirEntryCheckRangeShortLong8(*ma
);
1333 if (err
!=TIFFReadDirEntryErrOk
)
1335 *mb
++=(uint16
)(*ma
++);
1344 ma
=(int64
*)origdata
;
1346 for (n
=0; n
<count
; n
++)
1348 if (tif
->tif_flags
&TIFF_SWAB
)
1349 TIFFSwabLong8((uint64
*)ma
);
1350 err
=TIFFReadDirEntryCheckRangeShortSlong8(*ma
);
1351 if (err
!=TIFFReadDirEntryErrOk
)
1353 *mb
++=(uint16
)(*ma
++);
1358 _TIFFfree(origdata
);
1359 if (err
!=TIFFReadDirEntryErrOk
)
1365 return(TIFFReadDirEntryErrOk
);
1368 static enum TIFFReadDirEntryErr
TIFFReadDirEntrySshortArray(TIFF
* tif
, TIFFDirEntry
* direntry
, int16
** value
)
1370 enum TIFFReadDirEntryErr err
;
1374 switch (direntry
->tdir_type
)
1386 return(TIFFReadDirEntryErrType
);
1388 err
=TIFFReadDirEntryArray(tif
,direntry
,&count
,2,&origdata
);
1389 if ((err
!=TIFFReadDirEntryErrOk
)||(origdata
==0))
1394 switch (direntry
->tdir_type
)
1400 m
=(uint16
*)origdata
;
1401 for (n
=0; n
<count
; n
++)
1403 if (tif
->tif_flags
&TIFF_SWAB
)
1405 err
=TIFFReadDirEntryCheckRangeSshortShort(*m
);
1406 if (err
!=TIFFReadDirEntryErrOk
)
1408 _TIFFfree(origdata
);
1413 *value
=(int16
*)origdata
;
1414 return(TIFFReadDirEntryErrOk
);
1417 *value
=(int16
*)origdata
;
1418 if (tif
->tif_flags
&TIFF_SWAB
)
1419 TIFFSwabArrayOfShort((uint16
*)(*value
),count
);
1420 return(TIFFReadDirEntryErrOk
);
1422 data
=(int16
*)_TIFFmalloc(count
*2);
1425 _TIFFfree(origdata
);
1426 return(TIFFReadDirEntryErrAlloc
);
1428 switch (direntry
->tdir_type
)
1435 ma
=(uint8
*)origdata
;
1437 for (n
=0; n
<count
; n
++)
1438 *mb
++=(int16
)(*ma
++);
1448 for (n
=0; n
<count
; n
++)
1449 *mb
++=(int16
)(*ma
++);
1457 ma
=(uint32
*)origdata
;
1459 for (n
=0; n
<count
; n
++)
1461 if (tif
->tif_flags
&TIFF_SWAB
)
1463 err
=TIFFReadDirEntryCheckRangeSshortLong(*ma
);
1464 if (err
!=TIFFReadDirEntryErrOk
)
1466 *mb
++=(int16
)(*ma
++);
1475 ma
=(int32
*)origdata
;
1477 for (n
=0; n
<count
; n
++)
1479 if (tif
->tif_flags
&TIFF_SWAB
)
1480 TIFFSwabLong((uint32
*)ma
);
1481 err
=TIFFReadDirEntryCheckRangeSshortSlong(*ma
);
1482 if (err
!=TIFFReadDirEntryErrOk
)
1484 *mb
++=(int16
)(*ma
++);
1493 ma
=(uint64
*)origdata
;
1495 for (n
=0; n
<count
; n
++)
1497 if (tif
->tif_flags
&TIFF_SWAB
)
1499 err
=TIFFReadDirEntryCheckRangeSshortLong8(*ma
);
1500 if (err
!=TIFFReadDirEntryErrOk
)
1502 *mb
++=(int16
)(*ma
++);
1511 ma
=(int64
*)origdata
;
1513 for (n
=0; n
<count
; n
++)
1515 if (tif
->tif_flags
&TIFF_SWAB
)
1516 TIFFSwabLong8((uint64
*)ma
);
1517 err
=TIFFReadDirEntryCheckRangeSshortSlong8(*ma
);
1518 if (err
!=TIFFReadDirEntryErrOk
)
1520 *mb
++=(int16
)(*ma
++);
1525 _TIFFfree(origdata
);
1526 if (err
!=TIFFReadDirEntryErrOk
)
1532 return(TIFFReadDirEntryErrOk
);
1535 static enum TIFFReadDirEntryErr
TIFFReadDirEntryLongArray(TIFF
* tif
, TIFFDirEntry
* direntry
, uint32
** value
)
1537 enum TIFFReadDirEntryErr err
;
1541 switch (direntry
->tdir_type
)
1553 return(TIFFReadDirEntryErrType
);
1555 err
=TIFFReadDirEntryArray(tif
,direntry
,&count
,4,&origdata
);
1556 if ((err
!=TIFFReadDirEntryErrOk
)||(origdata
==0))
1561 switch (direntry
->tdir_type
)
1564 *value
=(uint32
*)origdata
;
1565 if (tif
->tif_flags
&TIFF_SWAB
)
1566 TIFFSwabArrayOfLong(*value
,count
);
1567 return(TIFFReadDirEntryErrOk
);
1573 for (n
=0; n
<count
; n
++)
1575 if (tif
->tif_flags
&TIFF_SWAB
)
1576 TIFFSwabLong((uint32
*)m
);
1577 err
=TIFFReadDirEntryCheckRangeLongSlong(*m
);
1578 if (err
!=TIFFReadDirEntryErrOk
)
1580 _TIFFfree(origdata
);
1585 *value
=(uint32
*)origdata
;
1586 return(TIFFReadDirEntryErrOk
);
1589 data
=(uint32
*)_TIFFmalloc(count
*4);
1592 _TIFFfree(origdata
);
1593 return(TIFFReadDirEntryErrAlloc
);
1595 switch (direntry
->tdir_type
)
1602 ma
=(uint8
*)origdata
;
1604 for (n
=0; n
<count
; n
++)
1605 *mb
++=(uint32
)(*ma
++);
1615 for (n
=0; n
<count
; n
++)
1617 err
=TIFFReadDirEntryCheckRangeLongSbyte(*ma
);
1618 if (err
!=TIFFReadDirEntryErrOk
)
1620 *mb
++=(uint32
)(*ma
++);
1629 ma
=(uint16
*)origdata
;
1631 for (n
=0; n
<count
; n
++)
1633 if (tif
->tif_flags
&TIFF_SWAB
)
1635 *mb
++=(uint32
)(*ma
++);
1644 ma
=(int16
*)origdata
;
1646 for (n
=0; n
<count
; n
++)
1648 if (tif
->tif_flags
&TIFF_SWAB
)
1649 TIFFSwabShort((uint16
*)ma
);
1650 err
=TIFFReadDirEntryCheckRangeLongSshort(*ma
);
1651 if (err
!=TIFFReadDirEntryErrOk
)
1653 *mb
++=(uint32
)(*ma
++);
1662 ma
=(uint64
*)origdata
;
1664 for (n
=0; n
<count
; n
++)
1666 if (tif
->tif_flags
&TIFF_SWAB
)
1668 err
=TIFFReadDirEntryCheckRangeLongLong8(*ma
);
1669 if (err
!=TIFFReadDirEntryErrOk
)
1671 *mb
++=(uint32
)(*ma
++);
1680 ma
=(int64
*)origdata
;
1682 for (n
=0; n
<count
; n
++)
1684 if (tif
->tif_flags
&TIFF_SWAB
)
1685 TIFFSwabLong8((uint64
*)ma
);
1686 err
=TIFFReadDirEntryCheckRangeLongSlong8(*ma
);
1687 if (err
!=TIFFReadDirEntryErrOk
)
1689 *mb
++=(uint32
)(*ma
++);
1694 _TIFFfree(origdata
);
1695 if (err
!=TIFFReadDirEntryErrOk
)
1701 return(TIFFReadDirEntryErrOk
);
1704 static enum TIFFReadDirEntryErr
TIFFReadDirEntrySlongArray(TIFF
* tif
, TIFFDirEntry
* direntry
, int32
** value
)
1706 enum TIFFReadDirEntryErr err
;
1710 switch (direntry
->tdir_type
)
1722 return(TIFFReadDirEntryErrType
);
1724 err
=TIFFReadDirEntryArray(tif
,direntry
,&count
,4,&origdata
);
1725 if ((err
!=TIFFReadDirEntryErrOk
)||(origdata
==0))
1730 switch (direntry
->tdir_type
)
1736 m
=(uint32
*)origdata
;
1737 for (n
=0; n
<count
; n
++)
1739 if (tif
->tif_flags
&TIFF_SWAB
)
1740 TIFFSwabLong((uint32
*)m
);
1741 err
=TIFFReadDirEntryCheckRangeSlongLong(*m
);
1742 if (err
!=TIFFReadDirEntryErrOk
)
1744 _TIFFfree(origdata
);
1749 *value
=(int32
*)origdata
;
1750 return(TIFFReadDirEntryErrOk
);
1753 *value
=(int32
*)origdata
;
1754 if (tif
->tif_flags
&TIFF_SWAB
)
1755 TIFFSwabArrayOfLong((uint32
*)(*value
),count
);
1756 return(TIFFReadDirEntryErrOk
);
1758 data
=(int32
*)_TIFFmalloc(count
*4);
1761 _TIFFfree(origdata
);
1762 return(TIFFReadDirEntryErrAlloc
);
1764 switch (direntry
->tdir_type
)
1771 ma
=(uint8
*)origdata
;
1773 for (n
=0; n
<count
; n
++)
1774 *mb
++=(int32
)(*ma
++);
1784 for (n
=0; n
<count
; n
++)
1785 *mb
++=(int32
)(*ma
++);
1793 ma
=(uint16
*)origdata
;
1795 for (n
=0; n
<count
; n
++)
1797 if (tif
->tif_flags
&TIFF_SWAB
)
1799 *mb
++=(int32
)(*ma
++);
1808 ma
=(int16
*)origdata
;
1810 for (n
=0; n
<count
; n
++)
1812 if (tif
->tif_flags
&TIFF_SWAB
)
1813 TIFFSwabShort((uint16
*)ma
);
1814 *mb
++=(int32
)(*ma
++);
1823 ma
=(uint64
*)origdata
;
1825 for (n
=0; n
<count
; n
++)
1827 if (tif
->tif_flags
&TIFF_SWAB
)
1829 err
=TIFFReadDirEntryCheckRangeSlongLong8(*ma
);
1830 if (err
!=TIFFReadDirEntryErrOk
)
1832 *mb
++=(int32
)(*ma
++);
1841 ma
=(int64
*)origdata
;
1843 for (n
=0; n
<count
; n
++)
1845 if (tif
->tif_flags
&TIFF_SWAB
)
1846 TIFFSwabLong8((uint64
*)ma
);
1847 err
=TIFFReadDirEntryCheckRangeSlongSlong8(*ma
);
1848 if (err
!=TIFFReadDirEntryErrOk
)
1850 *mb
++=(int32
)(*ma
++);
1855 _TIFFfree(origdata
);
1856 if (err
!=TIFFReadDirEntryErrOk
)
1862 return(TIFFReadDirEntryErrOk
);
1865 static enum TIFFReadDirEntryErr
TIFFReadDirEntryLong8Array(TIFF
* tif
, TIFFDirEntry
* direntry
, uint64
** value
)
1867 enum TIFFReadDirEntryErr err
;
1871 switch (direntry
->tdir_type
)
1883 return(TIFFReadDirEntryErrType
);
1885 err
=TIFFReadDirEntryArray(tif
,direntry
,&count
,8,&origdata
);
1886 if ((err
!=TIFFReadDirEntryErrOk
)||(origdata
==0))
1891 switch (direntry
->tdir_type
)
1894 *value
=(uint64
*)origdata
;
1895 if (tif
->tif_flags
&TIFF_SWAB
)
1896 TIFFSwabArrayOfLong8(*value
,count
);
1897 return(TIFFReadDirEntryErrOk
);
1903 for (n
=0; n
<count
; n
++)
1905 if (tif
->tif_flags
&TIFF_SWAB
)
1906 TIFFSwabLong8((uint64
*)m
);
1907 err
=TIFFReadDirEntryCheckRangeLong8Slong8(*m
);
1908 if (err
!=TIFFReadDirEntryErrOk
)
1910 _TIFFfree(origdata
);
1915 *value
=(uint64
*)origdata
;
1916 return(TIFFReadDirEntryErrOk
);
1919 data
=(uint64
*)_TIFFmalloc(count
*8);
1922 _TIFFfree(origdata
);
1923 return(TIFFReadDirEntryErrAlloc
);
1925 switch (direntry
->tdir_type
)
1932 ma
=(uint8
*)origdata
;
1934 for (n
=0; n
<count
; n
++)
1935 *mb
++=(uint64
)(*ma
++);
1945 for (n
=0; n
<count
; n
++)
1947 err
=TIFFReadDirEntryCheckRangeLong8Sbyte(*ma
);
1948 if (err
!=TIFFReadDirEntryErrOk
)
1950 *mb
++=(uint64
)(*ma
++);
1959 ma
=(uint16
*)origdata
;
1961 for (n
=0; n
<count
; n
++)
1963 if (tif
->tif_flags
&TIFF_SWAB
)
1965 *mb
++=(uint64
)(*ma
++);
1974 ma
=(int16
*)origdata
;
1976 for (n
=0; n
<count
; n
++)
1978 if (tif
->tif_flags
&TIFF_SWAB
)
1979 TIFFSwabShort((uint16
*)ma
);
1980 err
=TIFFReadDirEntryCheckRangeLong8Sshort(*ma
);
1981 if (err
!=TIFFReadDirEntryErrOk
)
1983 *mb
++=(uint64
)(*ma
++);
1992 ma
=(uint32
*)origdata
;
1994 for (n
=0; n
<count
; n
++)
1996 if (tif
->tif_flags
&TIFF_SWAB
)
1998 *mb
++=(uint64
)(*ma
++);
2007 ma
=(int32
*)origdata
;
2009 for (n
=0; n
<count
; n
++)
2011 if (tif
->tif_flags
&TIFF_SWAB
)
2012 TIFFSwabLong((uint32
*)ma
);
2013 err
=TIFFReadDirEntryCheckRangeLong8Slong(*ma
);
2014 if (err
!=TIFFReadDirEntryErrOk
)
2016 *mb
++=(uint64
)(*ma
++);
2021 _TIFFfree(origdata
);
2022 if (err
!=TIFFReadDirEntryErrOk
)
2028 return(TIFFReadDirEntryErrOk
);
2031 static enum TIFFReadDirEntryErr
TIFFReadDirEntrySlong8Array(TIFF
* tif
, TIFFDirEntry
* direntry
, int64
** value
)
2033 enum TIFFReadDirEntryErr err
;
2037 switch (direntry
->tdir_type
)
2049 return(TIFFReadDirEntryErrType
);
2051 err
=TIFFReadDirEntryArray(tif
,direntry
,&count
,8,&origdata
);
2052 if ((err
!=TIFFReadDirEntryErrOk
)||(origdata
==0))
2057 switch (direntry
->tdir_type
)
2063 m
=(uint64
*)origdata
;
2064 for (n
=0; n
<count
; n
++)
2066 if (tif
->tif_flags
&TIFF_SWAB
)
2068 err
=TIFFReadDirEntryCheckRangeSlong8Long8(*m
);
2069 if (err
!=TIFFReadDirEntryErrOk
)
2071 _TIFFfree(origdata
);
2076 *value
=(int64
*)origdata
;
2077 return(TIFFReadDirEntryErrOk
);
2080 *value
=(int64
*)origdata
;
2081 if (tif
->tif_flags
&TIFF_SWAB
)
2082 TIFFSwabArrayOfLong8((uint64
*)(*value
),count
);
2083 return(TIFFReadDirEntryErrOk
);
2085 data
=(int64
*)_TIFFmalloc(count
*8);
2088 _TIFFfree(origdata
);
2089 return(TIFFReadDirEntryErrAlloc
);
2091 switch (direntry
->tdir_type
)
2098 ma
=(uint8
*)origdata
;
2100 for (n
=0; n
<count
; n
++)
2101 *mb
++=(int64
)(*ma
++);
2111 for (n
=0; n
<count
; n
++)
2112 *mb
++=(int64
)(*ma
++);
2120 ma
=(uint16
*)origdata
;
2122 for (n
=0; n
<count
; n
++)
2124 if (tif
->tif_flags
&TIFF_SWAB
)
2126 *mb
++=(int64
)(*ma
++);
2135 ma
=(int16
*)origdata
;
2137 for (n
=0; n
<count
; n
++)
2139 if (tif
->tif_flags
&TIFF_SWAB
)
2140 TIFFSwabShort((uint16
*)ma
);
2141 *mb
++=(int64
)(*ma
++);
2150 ma
=(uint32
*)origdata
;
2152 for (n
=0; n
<count
; n
++)
2154 if (tif
->tif_flags
&TIFF_SWAB
)
2156 *mb
++=(int64
)(*ma
++);
2165 ma
=(int32
*)origdata
;
2167 for (n
=0; n
<count
; n
++)
2169 if (tif
->tif_flags
&TIFF_SWAB
)
2170 TIFFSwabLong((uint32
*)ma
);
2171 *mb
++=(int64
)(*ma
++);
2176 _TIFFfree(origdata
);
2178 return(TIFFReadDirEntryErrOk
);
2181 static enum TIFFReadDirEntryErr
TIFFReadDirEntryFloatArray(TIFF
* tif
, TIFFDirEntry
* direntry
, float** value
)
2183 enum TIFFReadDirEntryErr err
;
2187 switch (direntry
->tdir_type
)
2198 case TIFF_SRATIONAL
:
2203 return(TIFFReadDirEntryErrType
);
2205 err
=TIFFReadDirEntryArray(tif
,direntry
,&count
,4,&origdata
);
2206 if ((err
!=TIFFReadDirEntryErrOk
)||(origdata
==0))
2211 switch (direntry
->tdir_type
)
2214 if (tif
->tif_flags
&TIFF_SWAB
)
2215 TIFFSwabArrayOfLong((uint32
*)origdata
,count
);
2216 TIFFCvtIEEEDoubleToNative(tif
,count
,(float*)origdata
);
2217 *value
=(float*)origdata
;
2218 return(TIFFReadDirEntryErrOk
);
2220 data
=(float*)_TIFFmalloc(count
*sizeof(float));
2223 _TIFFfree(origdata
);
2224 return(TIFFReadDirEntryErrAlloc
);
2226 switch (direntry
->tdir_type
)
2233 ma
=(uint8
*)origdata
;
2235 for (n
=0; n
<count
; n
++)
2236 *mb
++=(float)(*ma
++);
2246 for (n
=0; n
<count
; n
++)
2247 *mb
++=(float)(*ma
++);
2255 ma
=(uint16
*)origdata
;
2257 for (n
=0; n
<count
; n
++)
2259 if (tif
->tif_flags
&TIFF_SWAB
)
2261 *mb
++=(float)(*ma
++);
2270 ma
=(int16
*)origdata
;
2272 for (n
=0; n
<count
; n
++)
2274 if (tif
->tif_flags
&TIFF_SWAB
)
2275 TIFFSwabShort((uint16
*)ma
);
2276 *mb
++=(float)(*ma
++);
2285 ma
=(uint32
*)origdata
;
2287 for (n
=0; n
<count
; n
++)
2289 if (tif
->tif_flags
&TIFF_SWAB
)
2291 *mb
++=(float)(*ma
++);
2300 ma
=(int32
*)origdata
;
2302 for (n
=0; n
<count
; n
++)
2304 if (tif
->tif_flags
&TIFF_SWAB
)
2305 TIFFSwabLong((uint32
*)ma
);
2306 *mb
++=(float)(*ma
++);
2315 ma
=(uint64
*)origdata
;
2317 for (n
=0; n
<count
; n
++)
2319 if (tif
->tif_flags
&TIFF_SWAB
)
2321 #if defined(__WIN32__) && (_MSC_VER < 1500)
2323 * XXX: MSVC 6.0 does not support
2324 * conversion of 64-bit integers into
2325 * floating point values.
2327 *mb
++ = _TIFFUInt64ToFloat(*ma
++);
2329 *mb
++ = (float)(*ma
++);
2339 ma
=(int64
*)origdata
;
2341 for (n
=0; n
<count
; n
++)
2343 if (tif
->tif_flags
&TIFF_SWAB
)
2344 TIFFSwabLong8((uint64
*)ma
);
2345 *mb
++=(float)(*ma
++);
2356 ma
=(uint32
*)origdata
;
2358 for (n
=0; n
<count
; n
++)
2360 if (tif
->tif_flags
&TIFF_SWAB
)
2363 if (tif
->tif_flags
&TIFF_SWAB
)
2369 *mb
++=(float)maa
/(float)mab
;
2373 case TIFF_SRATIONAL
:
2380 ma
=(uint32
*)origdata
;
2382 for (n
=0; n
<count
; n
++)
2384 if (tif
->tif_flags
&TIFF_SWAB
)
2388 if (tif
->tif_flags
&TIFF_SWAB
)
2394 *mb
++=(float)maa
/(float)mab
;
2403 if (tif
->tif_flags
&TIFF_SWAB
)
2404 TIFFSwabArrayOfLong8((uint64
*)origdata
,count
);
2405 TIFFCvtIEEEDoubleToNative(tif
,count
,(double*)origdata
);
2406 ma
=(double*)origdata
;
2408 for (n
=0; n
<count
; n
++)
2409 *mb
++=(float)(*ma
++);
2413 _TIFFfree(origdata
);
2415 return(TIFFReadDirEntryErrOk
);
2418 static enum TIFFReadDirEntryErr
2419 TIFFReadDirEntryDoubleArray(TIFF
* tif
, TIFFDirEntry
* direntry
, double** value
)
2421 enum TIFFReadDirEntryErr err
;
2425 switch (direntry
->tdir_type
)
2436 case TIFF_SRATIONAL
:
2441 return(TIFFReadDirEntryErrType
);
2443 err
=TIFFReadDirEntryArray(tif
,direntry
,&count
,8,&origdata
);
2444 if ((err
!=TIFFReadDirEntryErrOk
)||(origdata
==0))
2449 switch (direntry
->tdir_type
)
2452 if (tif
->tif_flags
&TIFF_SWAB
)
2453 TIFFSwabArrayOfLong8((uint64
*)origdata
,count
);
2454 TIFFCvtIEEEDoubleToNative(tif
,count
,(double*)origdata
);
2455 *value
=(double*)origdata
;
2456 return(TIFFReadDirEntryErrOk
);
2458 data
=(double*)_TIFFmalloc(count
*sizeof(double));
2461 _TIFFfree(origdata
);
2462 return(TIFFReadDirEntryErrAlloc
);
2464 switch (direntry
->tdir_type
)
2471 ma
=(uint8
*)origdata
;
2473 for (n
=0; n
<count
; n
++)
2474 *mb
++=(double)(*ma
++);
2484 for (n
=0; n
<count
; n
++)
2485 *mb
++=(double)(*ma
++);
2493 ma
=(uint16
*)origdata
;
2495 for (n
=0; n
<count
; n
++)
2497 if (tif
->tif_flags
&TIFF_SWAB
)
2499 *mb
++=(double)(*ma
++);
2508 ma
=(int16
*)origdata
;
2510 for (n
=0; n
<count
; n
++)
2512 if (tif
->tif_flags
&TIFF_SWAB
)
2513 TIFFSwabShort((uint16
*)ma
);
2514 *mb
++=(double)(*ma
++);
2523 ma
=(uint32
*)origdata
;
2525 for (n
=0; n
<count
; n
++)
2527 if (tif
->tif_flags
&TIFF_SWAB
)
2529 *mb
++=(double)(*ma
++);
2538 ma
=(int32
*)origdata
;
2540 for (n
=0; n
<count
; n
++)
2542 if (tif
->tif_flags
&TIFF_SWAB
)
2543 TIFFSwabLong((uint32
*)ma
);
2544 *mb
++=(double)(*ma
++);
2553 ma
=(uint64
*)origdata
;
2555 for (n
=0; n
<count
; n
++)
2557 if (tif
->tif_flags
&TIFF_SWAB
)
2559 #if defined(__WIN32__) && (_MSC_VER < 1500)
2561 * XXX: MSVC 6.0 does not support
2562 * conversion of 64-bit integers into
2563 * floating point values.
2565 *mb
++ = _TIFFUInt64ToDouble(*ma
++);
2567 *mb
++ = (double)(*ma
++);
2577 ma
=(int64
*)origdata
;
2579 for (n
=0; n
<count
; n
++)
2581 if (tif
->tif_flags
&TIFF_SWAB
)
2582 TIFFSwabLong8((uint64
*)ma
);
2583 *mb
++=(double)(*ma
++);
2594 ma
=(uint32
*)origdata
;
2596 for (n
=0; n
<count
; n
++)
2598 if (tif
->tif_flags
&TIFF_SWAB
)
2601 if (tif
->tif_flags
&TIFF_SWAB
)
2607 *mb
++=(double)maa
/(double)mab
;
2611 case TIFF_SRATIONAL
:
2618 ma
=(uint32
*)origdata
;
2620 for (n
=0; n
<count
; n
++)
2622 if (tif
->tif_flags
&TIFF_SWAB
)
2626 if (tif
->tif_flags
&TIFF_SWAB
)
2632 *mb
++=(double)maa
/(double)mab
;
2641 if (tif
->tif_flags
&TIFF_SWAB
)
2642 TIFFSwabArrayOfLong((uint32
*)origdata
,count
);
2643 TIFFCvtIEEEFloatToNative(tif
,count
,(float*)origdata
);
2644 ma
=(float*)origdata
;
2646 for (n
=0; n
<count
; n
++)
2647 *mb
++=(double)(*ma
++);
2651 _TIFFfree(origdata
);
2653 return(TIFFReadDirEntryErrOk
);
2656 static enum TIFFReadDirEntryErr
TIFFReadDirEntryIfd8Array(TIFF
* tif
, TIFFDirEntry
* direntry
, uint64
** value
)
2658 enum TIFFReadDirEntryErr err
;
2662 switch (direntry
->tdir_type
)
2670 return(TIFFReadDirEntryErrType
);
2672 err
=TIFFReadDirEntryArray(tif
,direntry
,&count
,8,&origdata
);
2673 if ((err
!=TIFFReadDirEntryErrOk
)||(origdata
==0))
2678 switch (direntry
->tdir_type
)
2682 *value
=(uint64
*)origdata
;
2683 if (tif
->tif_flags
&TIFF_SWAB
)
2684 TIFFSwabArrayOfLong8(*value
,count
);
2685 return(TIFFReadDirEntryErrOk
);
2687 data
=(uint64
*)_TIFFmalloc(count
*8);
2690 _TIFFfree(origdata
);
2691 return(TIFFReadDirEntryErrAlloc
);
2693 switch (direntry
->tdir_type
)
2701 ma
=(uint32
*)origdata
;
2703 for (n
=0; n
<count
; n
++)
2705 if (tif
->tif_flags
&TIFF_SWAB
)
2707 *mb
++=(uint64
)(*ma
++);
2712 _TIFFfree(origdata
);
2714 return(TIFFReadDirEntryErrOk
);
2717 static enum TIFFReadDirEntryErr
TIFFReadDirEntryPersampleShort(TIFF
* tif
, TIFFDirEntry
* direntry
, uint16
* value
)
2719 enum TIFFReadDirEntryErr err
;
2723 if (direntry
->tdir_count
<(uint64
)tif
->tif_dir
.td_samplesperpixel
)
2724 return(TIFFReadDirEntryErrCount
);
2725 err
=TIFFReadDirEntryShortArray(tif
,direntry
,&m
);
2726 if (err
!=TIFFReadDirEntryErrOk
)
2729 nb
=tif
->tif_dir
.td_samplesperpixel
;
2736 err
=TIFFReadDirEntryErrPsdif
;
2746 static enum TIFFReadDirEntryErr
TIFFReadDirEntryPersampleDouble(TIFF
* tif
, TIFFDirEntry
* direntry
, double* value
)
2748 enum TIFFReadDirEntryErr err
;
2752 if (direntry
->tdir_count
<(uint64
)tif
->tif_dir
.td_samplesperpixel
)
2753 return(TIFFReadDirEntryErrCount
);
2754 err
=TIFFReadDirEntryDoubleArray(tif
,direntry
,&m
);
2755 if (err
!=TIFFReadDirEntryErrOk
)
2758 nb
=tif
->tif_dir
.td_samplesperpixel
;
2765 err
=TIFFReadDirEntryErrPsdif
;
2775 static void TIFFReadDirEntryCheckedByte(TIFF
* tif
, TIFFDirEntry
* direntry
, uint8
* value
)
2778 *value
=*(uint8
*)(&direntry
->tdir_offset
);
2781 static void TIFFReadDirEntryCheckedSbyte(TIFF
* tif
, TIFFDirEntry
* direntry
, int8
* value
)
2784 *value
=*(int8
*)(&direntry
->tdir_offset
);
2787 static void TIFFReadDirEntryCheckedShort(TIFF
* tif
, TIFFDirEntry
* direntry
, uint16
* value
)
2789 *value
= direntry
->tdir_offset
.toff_short
;
2790 /* *value=*(uint16*)(&direntry->tdir_offset); */
2791 if (tif
->tif_flags
&TIFF_SWAB
)
2792 TIFFSwabShort(value
);
2795 static void TIFFReadDirEntryCheckedSshort(TIFF
* tif
, TIFFDirEntry
* direntry
, int16
* value
)
2797 *value
=*(int16
*)(&direntry
->tdir_offset
);
2798 if (tif
->tif_flags
&TIFF_SWAB
)
2799 TIFFSwabShort((uint16
*)value
);
2802 static void TIFFReadDirEntryCheckedLong(TIFF
* tif
, TIFFDirEntry
* direntry
, uint32
* value
)
2804 *value
=*(uint32
*)(&direntry
->tdir_offset
);
2805 if (tif
->tif_flags
&TIFF_SWAB
)
2806 TIFFSwabLong(value
);
2809 static void TIFFReadDirEntryCheckedSlong(TIFF
* tif
, TIFFDirEntry
* direntry
, int32
* value
)
2811 *value
=*(int32
*)(&direntry
->tdir_offset
);
2812 if (tif
->tif_flags
&TIFF_SWAB
)
2813 TIFFSwabLong((uint32
*)value
);
2816 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckedLong8(TIFF
* tif
, TIFFDirEntry
* direntry
, uint64
* value
)
2818 if (!(tif
->tif_flags
&TIFF_BIGTIFF
))
2820 enum TIFFReadDirEntryErr err
;
2821 uint32 offset
= direntry
->tdir_offset
.toff_long
;
2822 if (tif
->tif_flags
&TIFF_SWAB
)
2823 TIFFSwabLong(&offset
);
2824 err
=TIFFReadDirEntryData(tif
,offset
,8,value
);
2825 if (err
!=TIFFReadDirEntryErrOk
)
2829 *value
= direntry
->tdir_offset
.toff_long8
;
2830 if (tif
->tif_flags
&TIFF_SWAB
)
2831 TIFFSwabLong8(value
);
2832 return(TIFFReadDirEntryErrOk
);
2835 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckedSlong8(TIFF
* tif
, TIFFDirEntry
* direntry
, int64
* value
)
2837 if (!(tif
->tif_flags
&TIFF_BIGTIFF
))
2839 enum TIFFReadDirEntryErr err
;
2840 uint32 offset
= direntry
->tdir_offset
.toff_long
;
2841 if (tif
->tif_flags
&TIFF_SWAB
)
2842 TIFFSwabLong(&offset
);
2843 err
=TIFFReadDirEntryData(tif
,offset
,8,value
);
2844 if (err
!=TIFFReadDirEntryErrOk
)
2848 *value
=*(int64
*)(&direntry
->tdir_offset
);
2849 if (tif
->tif_flags
&TIFF_SWAB
)
2850 TIFFSwabLong8((uint64
*)value
);
2851 return(TIFFReadDirEntryErrOk
);
2854 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckedRational(TIFF
* tif
, TIFFDirEntry
* direntry
, double* value
)
2858 assert(sizeof(double)==8);
2859 assert(sizeof(uint64
)==8);
2860 assert(sizeof(uint32
)==4);
2861 if (!(tif
->tif_flags
&TIFF_BIGTIFF
))
2863 enum TIFFReadDirEntryErr err
;
2864 uint32 offset
= direntry
->tdir_offset
.toff_long
;
2865 if (tif
->tif_flags
&TIFF_SWAB
)
2866 TIFFSwabLong(&offset
);
2867 err
=TIFFReadDirEntryData(tif
,offset
,8,m
.i
);
2868 if (err
!=TIFFReadDirEntryErrOk
)
2872 m
.l
= direntry
->tdir_offset
.toff_long8
;
2873 if (tif
->tif_flags
&TIFF_SWAB
)
2874 TIFFSwabArrayOfLong(m
.i
,2);
2878 *value
=(double)m
.i
[0]/(double)m
.i
[1];
2879 return(TIFFReadDirEntryErrOk
);
2882 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckedSrational(TIFF
* tif
, TIFFDirEntry
* direntry
, double* value
)
2885 assert(sizeof(double)==8);
2886 assert(sizeof(uint64
)==8);
2887 assert(sizeof(int32
)==4);
2888 assert(sizeof(uint32
)==4);
2889 if (!(tif
->tif_flags
&TIFF_BIGTIFF
))
2891 enum TIFFReadDirEntryErr err
;
2892 uint32 offset
= direntry
->tdir_offset
.toff_long
;
2893 if (tif
->tif_flags
&TIFF_SWAB
)
2894 TIFFSwabLong(&offset
);
2895 err
=TIFFReadDirEntryData(tif
,offset
,8,m
.i
);
2896 if (err
!=TIFFReadDirEntryErrOk
)
2900 m
.l
=direntry
->tdir_offset
.toff_long8
;
2901 if (tif
->tif_flags
&TIFF_SWAB
)
2902 TIFFSwabArrayOfLong(m
.i
,2);
2903 if ((int32
)m
.i
[0]==0)
2906 *value
=(double)((int32
)m
.i
[0])/(double)m
.i
[1];
2907 return(TIFFReadDirEntryErrOk
);
2910 static void TIFFReadDirEntryCheckedFloat(TIFF
* tif
, TIFFDirEntry
* direntry
, float* value
)
2917 assert(sizeof(float)==4);
2918 assert(sizeof(uint32
)==4);
2919 assert(sizeof(float_union
)==4);
2920 float_union
.i
=*(uint32
*)(&direntry
->tdir_offset
);
2921 *value
=float_union
.f
;
2922 if (tif
->tif_flags
&TIFF_SWAB
)
2923 TIFFSwabLong((uint32
*)value
);
2926 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckedDouble(TIFF
* tif
, TIFFDirEntry
* direntry
, double* value
)
2928 assert(sizeof(double)==8);
2929 assert(sizeof(uint64
)==8);
2930 assert(sizeof(UInt64Aligned_t
)==8);
2931 if (!(tif
->tif_flags
&TIFF_BIGTIFF
))
2933 enum TIFFReadDirEntryErr err
;
2934 uint32 offset
= direntry
->tdir_offset
.toff_long
;
2935 if (tif
->tif_flags
&TIFF_SWAB
)
2936 TIFFSwabLong(&offset
);
2937 err
=TIFFReadDirEntryData(tif
,offset
,8,value
);
2938 if (err
!=TIFFReadDirEntryErrOk
)
2943 UInt64Aligned_t uint64_union
;
2944 uint64_union
.l
=direntry
->tdir_offset
.toff_long8
;
2945 *value
=uint64_union
.d
;
2947 if (tif
->tif_flags
&TIFF_SWAB
)
2948 TIFFSwabLong8((uint64
*)value
);
2949 return(TIFFReadDirEntryErrOk
);
2952 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeByteSbyte(int8 value
)
2955 return(TIFFReadDirEntryErrRange
);
2957 return(TIFFReadDirEntryErrOk
);
2960 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeByteShort(uint16 value
)
2963 return(TIFFReadDirEntryErrRange
);
2965 return(TIFFReadDirEntryErrOk
);
2968 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeByteSshort(int16 value
)
2970 if ((value
<0)||(value
>0xFF))
2971 return(TIFFReadDirEntryErrRange
);
2973 return(TIFFReadDirEntryErrOk
);
2976 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeByteLong(uint32 value
)
2979 return(TIFFReadDirEntryErrRange
);
2981 return(TIFFReadDirEntryErrOk
);
2984 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeByteSlong(int32 value
)
2986 if ((value
<0)||(value
>0xFF))
2987 return(TIFFReadDirEntryErrRange
);
2989 return(TIFFReadDirEntryErrOk
);
2992 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeByteLong8(uint64 value
)
2995 return(TIFFReadDirEntryErrRange
);
2997 return(TIFFReadDirEntryErrOk
);
3000 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeByteSlong8(int64 value
)
3002 if ((value
<0)||(value
>0xFF))
3003 return(TIFFReadDirEntryErrRange
);
3005 return(TIFFReadDirEntryErrOk
);
3008 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSbyteByte(uint8 value
)
3011 return(TIFFReadDirEntryErrRange
);
3013 return(TIFFReadDirEntryErrOk
);
3016 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSbyteShort(uint16 value
)
3019 return(TIFFReadDirEntryErrRange
);
3021 return(TIFFReadDirEntryErrOk
);
3024 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSbyteSshort(int16 value
)
3026 if ((value
<-0x80)||(value
>0x7F))
3027 return(TIFFReadDirEntryErrRange
);
3029 return(TIFFReadDirEntryErrOk
);
3032 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSbyteLong(uint32 value
)
3035 return(TIFFReadDirEntryErrRange
);
3037 return(TIFFReadDirEntryErrOk
);
3040 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSbyteSlong(int32 value
)
3042 if ((value
<-0x80)||(value
>0x7F))
3043 return(TIFFReadDirEntryErrRange
);
3045 return(TIFFReadDirEntryErrOk
);
3048 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSbyteLong8(uint64 value
)
3051 return(TIFFReadDirEntryErrRange
);
3053 return(TIFFReadDirEntryErrOk
);
3056 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSbyteSlong8(int64 value
)
3058 if ((value
<-0x80)||(value
>0x7F))
3059 return(TIFFReadDirEntryErrRange
);
3061 return(TIFFReadDirEntryErrOk
);
3064 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeShortSbyte(int8 value
)
3067 return(TIFFReadDirEntryErrRange
);
3069 return(TIFFReadDirEntryErrOk
);
3072 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeShortSshort(int16 value
)
3075 return(TIFFReadDirEntryErrRange
);
3077 return(TIFFReadDirEntryErrOk
);
3080 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeShortLong(uint32 value
)
3083 return(TIFFReadDirEntryErrRange
);
3085 return(TIFFReadDirEntryErrOk
);
3088 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeShortSlong(int32 value
)
3090 if ((value
<0)||(value
>0xFFFF))
3091 return(TIFFReadDirEntryErrRange
);
3093 return(TIFFReadDirEntryErrOk
);
3096 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeShortLong8(uint64 value
)
3099 return(TIFFReadDirEntryErrRange
);
3101 return(TIFFReadDirEntryErrOk
);
3104 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeShortSlong8(int64 value
)
3106 if ((value
<0)||(value
>0xFFFF))
3107 return(TIFFReadDirEntryErrRange
);
3109 return(TIFFReadDirEntryErrOk
);
3112 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSshortShort(uint16 value
)
3115 return(TIFFReadDirEntryErrRange
);
3117 return(TIFFReadDirEntryErrOk
);
3120 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSshortLong(uint32 value
)
3123 return(TIFFReadDirEntryErrRange
);
3125 return(TIFFReadDirEntryErrOk
);
3128 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSshortSlong(int32 value
)
3130 if ((value
<-0x8000)||(value
>0x7FFF))
3131 return(TIFFReadDirEntryErrRange
);
3133 return(TIFFReadDirEntryErrOk
);
3136 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSshortLong8(uint64 value
)
3139 return(TIFFReadDirEntryErrRange
);
3141 return(TIFFReadDirEntryErrOk
);
3144 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeSshortSlong8(int64 value
)
3146 if ((value
<-0x8000)||(value
>0x7FFF))
3147 return(TIFFReadDirEntryErrRange
);
3149 return(TIFFReadDirEntryErrOk
);
3152 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeLongSbyte(int8 value
)
3155 return(TIFFReadDirEntryErrRange
);
3157 return(TIFFReadDirEntryErrOk
);
3160 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeLongSshort(int16 value
)
3163 return(TIFFReadDirEntryErrRange
);
3165 return(TIFFReadDirEntryErrOk
);
3168 static enum TIFFReadDirEntryErr
TIFFReadDirEntryCheckRangeLongSlong(int32 value
)
3171 return(TIFFReadDirEntryErrRange
);
3173 return(TIFFReadDirEntryErrOk
);
3177 * Largest 32-bit unsigned integer value.
3179 #define TIFF_UINT32_MAX 0xFFFFFFFFU
3181 static enum TIFFReadDirEntryErr
3182 TIFFReadDirEntryCheckRangeLongLong8(uint64 value
)
3184 if (value
> TIFF_UINT32_MAX
)
3185 return(TIFFReadDirEntryErrRange
);
3187 return(TIFFReadDirEntryErrOk
);
3190 static enum TIFFReadDirEntryErr
3191 TIFFReadDirEntryCheckRangeLongSlong8(int64 value
)
3193 if ((value
< 0) || (value
> (int64
) TIFF_UINT32_MAX
))
3194 return(TIFFReadDirEntryErrRange
);
3196 return(TIFFReadDirEntryErrOk
);
3199 #undef TIFF_UINT32_MAX
3201 static enum TIFFReadDirEntryErr
3202 TIFFReadDirEntryCheckRangeSlongLong(uint32 value
)
3204 if (value
> 0x7FFFFFFFUL
)
3205 return(TIFFReadDirEntryErrRange
);
3207 return(TIFFReadDirEntryErrOk
);
3210 /* Check that the 8-byte unsigned value can fit in a 4-byte unsigned range */
3211 static enum TIFFReadDirEntryErr
3212 TIFFReadDirEntryCheckRangeSlongLong8(uint64 value
)
3214 if (value
> 0x7FFFFFFF)
3215 return(TIFFReadDirEntryErrRange
);
3217 return(TIFFReadDirEntryErrOk
);
3220 /* Check that the 8-byte signed value can fit in a 4-byte signed range */
3221 static enum TIFFReadDirEntryErr
3222 TIFFReadDirEntryCheckRangeSlongSlong8(int64 value
)
3224 if ((value
< 0-((int64
) 0x7FFFFFFF+1)) || (value
> 0x7FFFFFFF))
3225 return(TIFFReadDirEntryErrRange
);
3227 return(TIFFReadDirEntryErrOk
);
3230 static enum TIFFReadDirEntryErr
3231 TIFFReadDirEntryCheckRangeLong8Sbyte(int8 value
)
3234 return(TIFFReadDirEntryErrRange
);
3236 return(TIFFReadDirEntryErrOk
);
3239 static enum TIFFReadDirEntryErr
3240 TIFFReadDirEntryCheckRangeLong8Sshort(int16 value
)
3243 return(TIFFReadDirEntryErrRange
);
3245 return(TIFFReadDirEntryErrOk
);
3248 static enum TIFFReadDirEntryErr
3249 TIFFReadDirEntryCheckRangeLong8Slong(int32 value
)
3252 return(TIFFReadDirEntryErrRange
);
3254 return(TIFFReadDirEntryErrOk
);
3257 static enum TIFFReadDirEntryErr
3258 TIFFReadDirEntryCheckRangeLong8Slong8(int64 value
)
3261 return(TIFFReadDirEntryErrRange
);
3263 return(TIFFReadDirEntryErrOk
);
3267 * Largest 64-bit signed integer value.
3269 #define TIFF_INT64_MAX ((int64)(((uint64) ~0) >> 1))
3271 static enum TIFFReadDirEntryErr
3272 TIFFReadDirEntryCheckRangeSlong8Long8(uint64 value
)
3274 if (value
> TIFF_INT64_MAX
)
3275 return(TIFFReadDirEntryErrRange
);
3277 return(TIFFReadDirEntryErrOk
);
3280 #undef TIFF_INT64_MAX
3282 static enum TIFFReadDirEntryErr
3283 TIFFReadDirEntryData(TIFF
* tif
, uint64 offset
, tmsize_t size
, void* dest
)
3286 if (!isMapped(tif
)) {
3287 if (!SeekOK(tif
,offset
))
3288 return(TIFFReadDirEntryErrIo
);
3289 if (!ReadOK(tif
,dest
,size
))
3290 return(TIFFReadDirEntryErrIo
);
3295 if (((uint64
)ma
!=offset
)
3297 || (mb
- ma
!= (size_t) size
)
3298 || (mb
< (size_t)size
)
3299 || (mb
> (size_t)tif
->tif_size
)
3301 return(TIFFReadDirEntryErrIo
);
3302 _TIFFmemcpy(dest
,tif
->tif_base
+ma
,size
);
3304 return(TIFFReadDirEntryErrOk
);
3307 static void TIFFReadDirEntryOutputErr(TIFF
* tif
, enum TIFFReadDirEntryErr err
, const char* module
, const char* tagname
, int recover
)
3311 case TIFFReadDirEntryErrCount
:
3312 TIFFErrorExt(tif
->tif_clientdata
, module
,
3313 "Incorrect count for \"%s\"",
3316 case TIFFReadDirEntryErrType
:
3317 TIFFErrorExt(tif
->tif_clientdata
, module
,
3318 "Incompatible type for \"%s\"",
3321 case TIFFReadDirEntryErrIo
:
3322 TIFFErrorExt(tif
->tif_clientdata
, module
,
3323 "IO error during reading of \"%s\"",
3326 case TIFFReadDirEntryErrRange
:
3327 TIFFErrorExt(tif
->tif_clientdata
, module
,
3328 "Incorrect value for \"%s\"",
3331 case TIFFReadDirEntryErrPsdif
:
3332 TIFFErrorExt(tif
->tif_clientdata
, module
,
3333 "Cannot handle different values per sample for \"%s\"",
3336 case TIFFReadDirEntryErrSizesan
:
3337 TIFFErrorExt(tif
->tif_clientdata
, module
,
3338 "Sanity check on size of \"%s\" value failed",
3341 case TIFFReadDirEntryErrAlloc
:
3342 TIFFErrorExt(tif
->tif_clientdata
, module
,
3343 "Out of memory reading of \"%s\"",
3347 assert(0); /* we should never get here */
3352 case TIFFReadDirEntryErrCount
:
3353 TIFFWarningExt(tif
->tif_clientdata
, module
,
3354 "Incorrect count for \"%s\"; tag ignored",
3357 case TIFFReadDirEntryErrType
:
3358 TIFFWarningExt(tif
->tif_clientdata
, module
,
3359 "Incompatible type for \"%s\"; tag ignored",
3362 case TIFFReadDirEntryErrIo
:
3363 TIFFWarningExt(tif
->tif_clientdata
, module
,
3364 "IO error during reading of \"%s\"; tag ignored",
3367 case TIFFReadDirEntryErrRange
:
3368 TIFFWarningExt(tif
->tif_clientdata
, module
,
3369 "Incorrect value for \"%s\"; tag ignored",
3372 case TIFFReadDirEntryErrPsdif
:
3373 TIFFWarningExt(tif
->tif_clientdata
, module
,
3374 "Cannot handle different values per sample for \"%s\"; tag ignored",
3377 case TIFFReadDirEntryErrSizesan
:
3378 TIFFWarningExt(tif
->tif_clientdata
, module
,
3379 "Sanity check on size of \"%s\" value failed; tag ignored",
3382 case TIFFReadDirEntryErrAlloc
:
3383 TIFFWarningExt(tif
->tif_clientdata
, module
,
3384 "Out of memory reading of \"%s\"; tag ignored",
3388 assert(0); /* we should never get here */
3395 * Read the next TIFF directory from a file and convert it to the internal
3396 * format. We read directories sequentially.
3399 TIFFReadDirectory(TIFF
* tif
)
3401 static const char module
[] = "TIFFReadDirectory";
3406 const TIFFField
* fip
;
3407 uint32 fii
=FAILED_FII
;
3409 int bitspersample_read
= FALSE
;
3411 tif
->tif_diroff
=tif
->tif_nextdiroff
;
3412 if (!TIFFCheckDirOffset(tif
,tif
->tif_nextdiroff
))
3413 return 0; /* last offset or bad offset (IFD looping) */
3414 (*tif
->tif_cleanup
)(tif
); /* cleanup any previous compression state */
3416 nextdiroff
= tif
->tif_nextdiroff
;
3417 dircount
=TIFFFetchDirectory(tif
,nextdiroff
,&dir
,&tif
->tif_nextdiroff
);
3420 TIFFErrorExt(tif
->tif_clientdata
,module
,
3421 "Failed to read directory at offset " TIFF_UINT64_FORMAT
,nextdiroff
);
3424 TIFFReadDirectoryCheckOrder(tif
,dir
,dircount
);
3427 * Mark duplicates of any tag to be ignored (bugzilla 1994)
3428 * to avoid certain pathological problems.
3433 for (ma
=dir
, mb
=0; mb
<dircount
; ma
++, mb
++)
3437 for (na
=ma
+1, nb
=mb
+1; nb
<dircount
; na
++, nb
++)
3439 if (ma
->tdir_tag
==na
->tdir_tag
)
3440 na
->tdir_tag
=IGNORE
;
3445 tif
->tif_flags
&= ~TIFF_BEENWRITING
; /* reset before new dir */
3446 tif
->tif_flags
&= ~TIFF_BUF4WRITE
; /* reset before new dir */
3447 /* free any old stuff and reinit */
3448 TIFFFreeDirectory(tif
);
3449 TIFFDefaultDirectory(tif
);
3451 * Electronic Arts writes gray-scale TIFF files
3452 * without a PlanarConfiguration directory entry.
3453 * Thus we setup a default value here, even though
3454 * the TIFF spec says there is no default value.
3456 TIFFSetField(tif
,TIFFTAG_PLANARCONFIG
,PLANARCONFIG_CONTIG
);
3458 * Setup default value and then make a pass over
3459 * the fields to check type and tag information,
3460 * and to extract info required to size data
3461 * structures. A second pass is made afterwards
3462 * to read in everything not taken in the first pass.
3463 * But we must process the Compression tag first
3464 * in order to merge in codec-private tag definitions (otherwise
3465 * we may get complaints about unknown tags). However, the
3466 * Compression tag may be dependent on the SamplesPerPixel
3467 * tag value because older TIFF specs permitted Compression
3468 * to be written as a SamplesPerPixel-count tag entry.
3469 * Thus if we don't first figure out the correct SamplesPerPixel
3470 * tag value then we may end up ignoring the Compression tag
3471 * value because it has an incorrect count value (if the
3472 * true value of SamplesPerPixel is not 1).
3474 dp
=TIFFReadDirectoryFindEntry(tif
,dir
,dircount
,TIFFTAG_SAMPLESPERPIXEL
);
3477 if (!TIFFFetchNormalTag(tif
,dp
,0))
3479 dp
->tdir_tag
=IGNORE
;
3481 dp
=TIFFReadDirectoryFindEntry(tif
,dir
,dircount
,TIFFTAG_COMPRESSION
);
3485 * The 5.0 spec says the Compression tag has one value, while
3486 * earlier specs say it has one value per sample. Because of
3487 * this, we accept the tag if one value is supplied with either
3491 enum TIFFReadDirEntryErr err
;
3492 err
=TIFFReadDirEntryShort(tif
,dp
,&value
);
3493 if (err
==TIFFReadDirEntryErrCount
)
3494 err
=TIFFReadDirEntryPersampleShort(tif
,dp
,&value
);
3495 if (err
!=TIFFReadDirEntryErrOk
)
3497 TIFFReadDirEntryOutputErr(tif
,err
,module
,"Compression",0);
3500 if (!TIFFSetField(tif
,TIFFTAG_COMPRESSION
,value
))
3502 dp
->tdir_tag
=IGNORE
;
3506 if (!TIFFSetField(tif
,TIFFTAG_COMPRESSION
,COMPRESSION_NONE
))
3510 * First real pass over the directory.
3512 for (di
=0, dp
=dir
; di
<dircount
; di
++, dp
++)
3514 if (dp
->tdir_tag
!=IGNORE
)
3516 TIFFReadDirectoryFindFieldInfo(tif
,dp
->tdir_tag
,&fii
);
3517 if (fii
== FAILED_FII
)
3519 TIFFWarningExt(tif
->tif_clientdata
, module
,
3520 "Unknown field with tag %d (0x%x) encountered",
3521 dp
->tdir_tag
,dp
->tdir_tag
);
3522 /* the following knowingly leaks the
3523 anonymous field structure */
3524 if (!_TIFFMergeFields(tif
,
3525 _TIFFCreateAnonField(tif
,
3527 (TIFFDataType
) dp
->tdir_type
),
3529 TIFFWarningExt(tif
->tif_clientdata
,
3531 "Registering anonymous field with tag %d (0x%x) failed",
3534 dp
->tdir_tag
=IGNORE
;
3536 TIFFReadDirectoryFindFieldInfo(tif
,dp
->tdir_tag
,&fii
);
3537 assert(fii
!= FAILED_FII
);
3541 if (dp
->tdir_tag
!=IGNORE
)
3543 fip
=tif
->tif_fields
[fii
];
3544 if (fip
->field_bit
==FIELD_IGNORE
)
3545 dp
->tdir_tag
=IGNORE
;
3548 switch (dp
->tdir_tag
)
3550 case TIFFTAG_STRIPOFFSETS
:
3551 case TIFFTAG_STRIPBYTECOUNTS
:
3552 case TIFFTAG_TILEOFFSETS
:
3553 case TIFFTAG_TILEBYTECOUNTS
:
3554 TIFFSetFieldBit(tif
,fip
->field_bit
);
3556 case TIFFTAG_IMAGEWIDTH
:
3557 case TIFFTAG_IMAGELENGTH
:
3558 case TIFFTAG_IMAGEDEPTH
:
3559 case TIFFTAG_TILELENGTH
:
3560 case TIFFTAG_TILEWIDTH
:
3561 case TIFFTAG_TILEDEPTH
:
3562 case TIFFTAG_PLANARCONFIG
:
3563 case TIFFTAG_ROWSPERSTRIP
:
3564 case TIFFTAG_EXTRASAMPLES
:
3565 if (!TIFFFetchNormalTag(tif
,dp
,0))
3567 dp
->tdir_tag
=IGNORE
;
3575 * If a) compression is OJPEG, b) planarconfig tag says it's separate,
3576 * c) strip offsets/bytecounts tag are both present and
3577 * d) both contain exactly one value, then we consistently find
3578 * that the buggy implementation of the buggy compression scheme
3579 * matches contig planarconfig best. So we 'fix-up' the tag here
3581 if ((tif
->tif_dir
.td_compression
==COMPRESSION_OJPEG
)&&
3582 (tif
->tif_dir
.td_planarconfig
==PLANARCONFIG_SEPARATE
))
3584 if (!_TIFFFillStriles(tif
))
3586 dp
=TIFFReadDirectoryFindEntry(tif
,dir
,dircount
,TIFFTAG_STRIPOFFSETS
);
3587 if ((dp
!=0)&&(dp
->tdir_count
==1))
3589 dp
=TIFFReadDirectoryFindEntry(tif
,dir
,dircount
,
3590 TIFFTAG_STRIPBYTECOUNTS
);
3591 if ((dp
!=0)&&(dp
->tdir_count
==1))
3593 tif
->tif_dir
.td_planarconfig
=PLANARCONFIG_CONTIG
;
3594 TIFFWarningExt(tif
->tif_clientdata
,module
,
3595 "Planarconfig tag value assumed incorrect, "
3596 "assuming data is contig instead of chunky");
3601 * Allocate directory structure and setup defaults.
3603 if (!TIFFFieldSet(tif
,FIELD_IMAGEDIMENSIONS
))
3605 MissingRequired(tif
,"ImageLength");
3609 * Setup appropriate structures (by strip or by tile)
3611 if (!TIFFFieldSet(tif
, FIELD_TILEDIMENSIONS
)) {
3612 tif
->tif_dir
.td_nstrips
= TIFFNumberOfStrips(tif
);
3613 tif
->tif_dir
.td_tilewidth
= tif
->tif_dir
.td_imagewidth
;
3614 tif
->tif_dir
.td_tilelength
= tif
->tif_dir
.td_rowsperstrip
;
3615 tif
->tif_dir
.td_tiledepth
= tif
->tif_dir
.td_imagedepth
;
3616 tif
->tif_flags
&= ~TIFF_ISTILED
;
3618 tif
->tif_dir
.td_nstrips
= TIFFNumberOfTiles(tif
);
3619 tif
->tif_flags
|= TIFF_ISTILED
;
3621 if (!tif
->tif_dir
.td_nstrips
) {
3622 TIFFErrorExt(tif
->tif_clientdata
, module
,
3623 "Cannot handle zero number of %s",
3624 isTiled(tif
) ? "tiles" : "strips");
3627 tif
->tif_dir
.td_stripsperimage
= tif
->tif_dir
.td_nstrips
;
3628 if (tif
->tif_dir
.td_planarconfig
== PLANARCONFIG_SEPARATE
)
3629 tif
->tif_dir
.td_stripsperimage
/= tif
->tif_dir
.td_samplesperpixel
;
3630 if (!TIFFFieldSet(tif
, FIELD_STRIPOFFSETS
)) {
3631 #ifdef OJPEG_SUPPORT
3632 if ((tif
->tif_dir
.td_compression
==COMPRESSION_OJPEG
) &&
3633 (isTiled(tif
)==0) &&
3634 (tif
->tif_dir
.td_nstrips
==1)) {
3637 * If a) compression is OJPEG, b) it's not a tiled TIFF,
3638 * and c) the number of strips is 1,
3639 * then we tolerate the absence of stripoffsets tag,
3640 * because, presumably, all required data is in the
3641 * JpegInterchangeFormat stream.
3643 TIFFSetFieldBit(tif
, FIELD_STRIPOFFSETS
);
3647 MissingRequired(tif
,
3648 isTiled(tif
) ? "TileOffsets" : "StripOffsets");
3653 * Second pass: extract other information.
3655 for (di
=0, dp
=dir
; di
<dircount
; di
++, dp
++)
3657 switch (dp
->tdir_tag
)
3661 case TIFFTAG_MINSAMPLEVALUE
:
3662 case TIFFTAG_MAXSAMPLEVALUE
:
3663 case TIFFTAG_BITSPERSAMPLE
:
3664 case TIFFTAG_DATATYPE
:
3665 case TIFFTAG_SAMPLEFORMAT
:
3667 * The MinSampleValue, MaxSampleValue, BitsPerSample
3668 * DataType and SampleFormat tags are supposed to be
3669 * written as one value/sample, but some vendors
3670 * incorrectly write one value only -- so we accept
3671 * that as well (yuck). Other vendors write correct
3672 * value for NumberOfSamples, but incorrect one for
3673 * BitsPerSample and friends, and we will read this
3678 enum TIFFReadDirEntryErr err
;
3679 err
=TIFFReadDirEntryShort(tif
,dp
,&value
);
3680 if (err
==TIFFReadDirEntryErrCount
)
3681 err
=TIFFReadDirEntryPersampleShort(tif
,dp
,&value
);
3682 if (err
!=TIFFReadDirEntryErrOk
)
3684 fip
= TIFFFieldWithTag(tif
,dp
->tdir_tag
);
3685 TIFFReadDirEntryOutputErr(tif
,err
,module
,fip
? fip
->field_name
: "unknown tagname",0);
3688 if (!TIFFSetField(tif
,dp
->tdir_tag
,value
))
3690 if( dp
->tdir_tag
== TIFFTAG_BITSPERSAMPLE
)
3691 bitspersample_read
= TRUE
;
3694 case TIFFTAG_SMINSAMPLEVALUE
:
3695 case TIFFTAG_SMAXSAMPLEVALUE
:
3698 double *data
= NULL
;
3699 enum TIFFReadDirEntryErr err
;
3702 if (dp
->tdir_count
!= (uint64
)tif
->tif_dir
.td_samplesperpixel
)
3703 err
= TIFFReadDirEntryErrCount
;
3705 err
= TIFFReadDirEntryDoubleArray(tif
, dp
, &data
);
3706 if (err
!=TIFFReadDirEntryErrOk
)
3708 fip
= TIFFFieldWithTag(tif
,dp
->tdir_tag
);
3709 TIFFReadDirEntryOutputErr(tif
,err
,module
,fip
? fip
->field_name
: "unknown tagname",0);
3712 saved_flags
= tif
->tif_flags
;
3713 tif
->tif_flags
|= TIFF_PERSAMPLE
;
3714 m
= TIFFSetField(tif
,dp
->tdir_tag
,data
);
3715 tif
->tif_flags
= saved_flags
;
3721 case TIFFTAG_STRIPOFFSETS
:
3722 case TIFFTAG_TILEOFFSETS
:
3723 #if defined(DEFER_STRILE_LOAD)
3724 _TIFFmemcpy( &(tif
->tif_dir
.td_stripoffset_entry
),
3725 dp
, sizeof(TIFFDirEntry
) );
3727 if (!TIFFFetchStripThing(tif
,dp
,tif
->tif_dir
.td_nstrips
,&tif
->tif_dir
.td_stripoffset
))
3731 case TIFFTAG_STRIPBYTECOUNTS
:
3732 case TIFFTAG_TILEBYTECOUNTS
:
3733 #if defined(DEFER_STRILE_LOAD)
3734 _TIFFmemcpy( &(tif
->tif_dir
.td_stripbytecount_entry
),
3735 dp
, sizeof(TIFFDirEntry
) );
3737 if (!TIFFFetchStripThing(tif
,dp
,tif
->tif_dir
.td_nstrips
,&tif
->tif_dir
.td_stripbytecount
))
3741 case TIFFTAG_COLORMAP
:
3742 case TIFFTAG_TRANSFERFUNCTION
:
3744 enum TIFFReadDirEntryErr err
;
3745 uint32 countpersample
;
3746 uint32 countrequired
;
3747 uint32 incrementpersample
;
3749 /* It would be dangerous to instantiate those tag values */
3750 /* since if td_bitspersample has not yet been read (due to */
3751 /* unordered tags), it could be read afterwards with a */
3752 /* values greater than the default one (1), which may cause */
3753 /* crashes in user code */
3754 if( !bitspersample_read
)
3756 fip
= TIFFFieldWithTag(tif
,dp
->tdir_tag
);
3757 TIFFWarningExt(tif
->tif_clientdata
,module
,
3758 "Ignoring %s since BitsPerSample tag not found",
3759 fip
? fip
->field_name
: "unknown tagname");
3762 /* ColorMap or TransferFunction for high bit */
3763 /* depths do not make much sense and could be */
3764 /* used as a denial of service vector */
3765 if (tif
->tif_dir
.td_bitspersample
> 24)
3767 fip
= TIFFFieldWithTag(tif
,dp
->tdir_tag
);
3768 TIFFWarningExt(tif
->tif_clientdata
,module
,
3769 "Ignoring %s because BitsPerSample=%d>24",
3770 fip
? fip
->field_name
: "unknown tagname",
3771 tif
->tif_dir
.td_bitspersample
);
3774 countpersample
=(1U<<tif
->tif_dir
.td_bitspersample
);
3775 if ((dp
->tdir_tag
==TIFFTAG_TRANSFERFUNCTION
)&&(dp
->tdir_count
==(uint64
)countpersample
))
3777 countrequired
=countpersample
;
3778 incrementpersample
=0;
3782 countrequired
=3*countpersample
;
3783 incrementpersample
=countpersample
;
3785 if (dp
->tdir_count
!=(uint64
)countrequired
)
3786 err
=TIFFReadDirEntryErrCount
;
3788 err
=TIFFReadDirEntryShortArray(tif
,dp
,&value
);
3789 if (err
!=TIFFReadDirEntryErrOk
)
3791 fip
= TIFFFieldWithTag(tif
,dp
->tdir_tag
);
3792 TIFFReadDirEntryOutputErr(tif
,err
,module
,fip
? fip
->field_name
: "unknown tagname",1);
3796 TIFFSetField(tif
,dp
->tdir_tag
,value
,value
+incrementpersample
,value
+2*incrementpersample
);
3801 /* BEGIN REV 4.0 COMPATIBILITY */
3802 case TIFFTAG_OSUBFILETYPE
:
3806 if (TIFFReadDirEntryShort(tif
,dp
,&valueo
)==TIFFReadDirEntryErrOk
)
3810 case OFILETYPE_REDUCEDIMAGE
: value
=FILETYPE_REDUCEDIMAGE
; break;
3811 case OFILETYPE_PAGE
: value
=FILETYPE_PAGE
; break;
3812 default: value
=0; break;
3815 TIFFSetField(tif
,TIFFTAG_SUBFILETYPE
,value
);
3819 /* END REV 4.0 COMPATIBILITY */
3821 (void) TIFFFetchNormalTag(tif
, dp
, TRUE
);
3827 * - If a) compression is OJPEG, and b) photometric tag is missing,
3828 * then we consistently find that photometric should be YCbCr
3829 * - If a) compression is OJPEG, and b) photometric tag says it's RGB,
3830 * then we consistently find that the buggy implementation of the
3831 * buggy compression scheme matches photometric YCbCr instead.
3832 * - If a) compression is OJPEG, and b) bitspersample tag is missing,
3833 * then we consistently find bitspersample should be 8.
3834 * - If a) compression is OJPEG, b) samplesperpixel tag is missing,
3835 * and c) photometric is RGB or YCbCr, then we consistently find
3836 * samplesperpixel should be 3
3837 * - If a) compression is OJPEG, b) samplesperpixel tag is missing,
3838 * and c) photometric is MINISWHITE or MINISBLACK, then we consistently
3839 * find samplesperpixel should be 3
3841 if (tif
->tif_dir
.td_compression
==COMPRESSION_OJPEG
)
3843 if (!TIFFFieldSet(tif
,FIELD_PHOTOMETRIC
))
3845 TIFFWarningExt(tif
->tif_clientdata
, module
,
3846 "Photometric tag is missing, assuming data is YCbCr");
3847 if (!TIFFSetField(tif
,TIFFTAG_PHOTOMETRIC
,PHOTOMETRIC_YCBCR
))
3850 else if (tif
->tif_dir
.td_photometric
==PHOTOMETRIC_RGB
)
3852 tif
->tif_dir
.td_photometric
=PHOTOMETRIC_YCBCR
;
3853 TIFFWarningExt(tif
->tif_clientdata
, module
,
3854 "Photometric tag value assumed incorrect, "
3855 "assuming data is YCbCr instead of RGB");
3857 if (!TIFFFieldSet(tif
,FIELD_BITSPERSAMPLE
))
3859 TIFFWarningExt(tif
->tif_clientdata
,module
,
3860 "BitsPerSample tag is missing, assuming 8 bits per sample");
3861 if (!TIFFSetField(tif
,TIFFTAG_BITSPERSAMPLE
,8))
3864 if (!TIFFFieldSet(tif
,FIELD_SAMPLESPERPIXEL
))
3866 if (tif
->tif_dir
.td_photometric
==PHOTOMETRIC_RGB
)
3868 TIFFWarningExt(tif
->tif_clientdata
,module
,
3869 "SamplesPerPixel tag is missing, "
3870 "assuming correct SamplesPerPixel value is 3");
3871 if (!TIFFSetField(tif
,TIFFTAG_SAMPLESPERPIXEL
,3))
3874 if (tif
->tif_dir
.td_photometric
==PHOTOMETRIC_YCBCR
)
3876 TIFFWarningExt(tif
->tif_clientdata
,module
,
3877 "SamplesPerPixel tag is missing, "
3878 "applying correct SamplesPerPixel value of 3");
3879 if (!TIFFSetField(tif
,TIFFTAG_SAMPLESPERPIXEL
,3))
3882 else if ((tif
->tif_dir
.td_photometric
==PHOTOMETRIC_MINISWHITE
)
3883 || (tif
->tif_dir
.td_photometric
==PHOTOMETRIC_MINISBLACK
))
3886 * SamplesPerPixel tag is missing, but is not required
3887 * by spec. Assume correct SamplesPerPixel value of 1.
3889 if (!TIFFSetField(tif
,TIFFTAG_SAMPLESPERPIXEL
,1))
3895 * Verify Palette image has a Colormap.
3897 if (tif
->tif_dir
.td_photometric
== PHOTOMETRIC_PALETTE
&&
3898 !TIFFFieldSet(tif
, FIELD_COLORMAP
)) {
3899 if ( tif
->tif_dir
.td_bitspersample
>=8 && tif
->tif_dir
.td_samplesperpixel
==3)
3900 tif
->tif_dir
.td_photometric
= PHOTOMETRIC_RGB
;
3901 else if (tif
->tif_dir
.td_bitspersample
>=8)
3902 tif
->tif_dir
.td_photometric
= PHOTOMETRIC_MINISBLACK
;
3904 MissingRequired(tif
, "Colormap");
3910 * We do no further messing with strip/tile offsets/bytecounts in OJPEG
3913 if (tif
->tif_dir
.td_compression
!=COMPRESSION_OJPEG
)
3916 * Attempt to deal with a missing StripByteCounts tag.
3918 if (!TIFFFieldSet(tif
, FIELD_STRIPBYTECOUNTS
)) {
3920 * Some manufacturers violate the spec by not giving
3921 * the size of the strips. In this case, assume there
3922 * is one uncompressed strip of data.
3924 if ((tif
->tif_dir
.td_planarconfig
== PLANARCONFIG_CONTIG
&&
3925 tif
->tif_dir
.td_nstrips
> 1) ||
3926 (tif
->tif_dir
.td_planarconfig
== PLANARCONFIG_SEPARATE
&&
3927 tif
->tif_dir
.td_nstrips
!= (uint32
)tif
->tif_dir
.td_samplesperpixel
)) {
3928 MissingRequired(tif
, "StripByteCounts");
3931 TIFFWarningExt(tif
->tif_clientdata
, module
,
3932 "TIFF directory is missing required "
3933 "\"StripByteCounts\" field, calculating from imagelength");
3934 if (EstimateStripByteCounts(tif
, dir
, dircount
) < 0)
3937 * Assume we have wrong StripByteCount value (in case
3938 * of single strip) in following cases:
3939 * - it is equal to zero along with StripOffset;
3940 * - it is larger than file itself (in case of uncompressed
3942 * - it is smaller than the size of the bytes per row
3943 * multiplied on the number of rows. The last case should
3944 * not be checked in the case of writing new image,
3945 * because we may do not know the exact strip size
3946 * until the whole image will be written and directory
3949 #define BYTECOUNTLOOKSBAD \
3950 ( (tif->tif_dir.td_stripbytecount[0] == 0 && tif->tif_dir.td_stripoffset[0] != 0) || \
3951 (tif->tif_dir.td_compression == COMPRESSION_NONE && \
3952 tif->tif_dir.td_stripbytecount[0] > TIFFGetFileSize(tif) - tif->tif_dir.td_stripoffset[0]) || \
3953 (tif->tif_mode == O_RDONLY && \
3954 tif->tif_dir.td_compression == COMPRESSION_NONE && \
3955 tif->tif_dir.td_stripbytecount[0] < TIFFScanlineSize64(tif) * tif->tif_dir.td_imagelength) )
3957 } else if (tif
->tif_dir
.td_nstrips
== 1
3958 && _TIFFFillStriles(tif
)
3959 && tif
->tif_dir
.td_stripoffset
[0] != 0
3960 && BYTECOUNTLOOKSBAD
) {
3962 * XXX: Plexus (and others) sometimes give a value of
3963 * zero for a tag when they don't know what the
3964 * correct value is! Try and handle the simple case
3965 * of estimating the size of a one strip image.
3967 TIFFWarningExt(tif
->tif_clientdata
, module
,
3968 "Bogus \"StripByteCounts\" field, ignoring and calculating from imagelength");
3969 if(EstimateStripByteCounts(tif
, dir
, dircount
) < 0)
3972 #if !defined(DEFER_STRILE_LOAD)
3973 } else if (tif
->tif_dir
.td_planarconfig
== PLANARCONFIG_CONTIG
3974 && tif
->tif_dir
.td_nstrips
> 2
3975 && tif
->tif_dir
.td_compression
== COMPRESSION_NONE
3976 && tif
->tif_dir
.td_stripbytecount
[0] != tif
->tif_dir
.td_stripbytecount
[1]
3977 && tif
->tif_dir
.td_stripbytecount
[0] != 0
3978 && tif
->tif_dir
.td_stripbytecount
[1] != 0 ) {
3980 * XXX: Some vendors fill StripByteCount array with
3981 * absolutely wrong values (it can be equal to
3982 * StripOffset array, for example). Catch this case
3985 * We avoid this check if deferring strile loading
3986 * as it would always force us to load the strip/tile
3989 TIFFWarningExt(tif
->tif_clientdata
, module
,
3990 "Wrong \"StripByteCounts\" field, ignoring and calculating from imagelength");
3991 if (EstimateStripByteCounts(tif
, dir
, dircount
) < 0)
3993 #endif /* !defined(DEFER_STRILE_LOAD) */
4001 if (!TIFFFieldSet(tif
, FIELD_MAXSAMPLEVALUE
))
4003 if (tif
->tif_dir
.td_bitspersample
>=16)
4004 tif
->tif_dir
.td_maxsamplevalue
=0xFFFF;
4006 tif
->tif_dir
.td_maxsamplevalue
= (uint16
)((1L<<tif
->tif_dir
.td_bitspersample
)-1);
4009 * XXX: We can optimize checking for the strip bounds using the sorted
4010 * bytecounts array. See also comments for TIFFAppendToStrip()
4011 * function in tif_write.c.
4013 #if !defined(DEFER_STRILE_LOAD)
4014 if (tif
->tif_dir
.td_nstrips
> 1) {
4017 tif
->tif_dir
.td_stripbytecountsorted
= 1;
4018 for (strip
= 1; strip
< tif
->tif_dir
.td_nstrips
; strip
++) {
4019 if (tif
->tif_dir
.td_stripoffset
[strip
- 1] >
4020 tif
->tif_dir
.td_stripoffset
[strip
]) {
4021 tif
->tif_dir
.td_stripbytecountsorted
= 0;
4026 #endif /* !defined(DEFER_STRILE_LOAD) */
4029 * An opportunity for compression mode dependent tag fixup
4031 (*tif
->tif_fixuptags
)(tif
);
4034 * Some manufacturers make life difficult by writing
4035 * large amounts of uncompressed data as a single strip.
4036 * This is contrary to the recommendations of the spec.
4037 * The following makes an attempt at breaking such images
4038 * into strips closer to the recommended 8k bytes. A
4039 * side effect, however, is that the RowsPerStrip tag
4040 * value may be changed.
4042 if ((tif
->tif_dir
.td_planarconfig
==PLANARCONFIG_CONTIG
)&&
4043 (tif
->tif_dir
.td_nstrips
==1)&&
4044 (tif
->tif_dir
.td_compression
==COMPRESSION_NONE
)&&
4045 ((tif
->tif_flags
&(TIFF_STRIPCHOP
|TIFF_ISTILED
))==TIFF_STRIPCHOP
))
4047 if ( !_TIFFFillStriles(tif
) || !tif
->tif_dir
.td_stripbytecount
)
4049 ChopUpSingleUncompressedStrip(tif
);
4053 * Clear the dirty directory flag.
4055 tif
->tif_flags
&= ~TIFF_DIRTYDIRECT
;
4056 tif
->tif_flags
&= ~TIFF_DIRTYSTRIP
;
4059 * Reinitialize i/o since we are starting on a new directory.
4061 tif
->tif_row
= (uint32
) -1;
4062 tif
->tif_curstrip
= (uint32
) -1;
4063 tif
->tif_col
= (uint32
) -1;
4064 tif
->tif_curtile
= (uint32
) -1;
4065 tif
->tif_tilesize
= (tmsize_t
) -1;
4067 tif
->tif_scanlinesize
= TIFFScanlineSize(tif
);
4068 if (!tif
->tif_scanlinesize
) {
4069 TIFFErrorExt(tif
->tif_clientdata
, module
,
4070 "Cannot handle zero scanline size");
4075 tif
->tif_tilesize
= TIFFTileSize(tif
);
4076 if (!tif
->tif_tilesize
) {
4077 TIFFErrorExt(tif
->tif_clientdata
, module
,
4078 "Cannot handle zero tile size");
4082 if (!TIFFStripSize(tif
)) {
4083 TIFFErrorExt(tif
->tif_clientdata
, module
,
4084 "Cannot handle zero strip size");
4096 TIFFReadDirectoryCheckOrder(TIFF
* tif
, TIFFDirEntry
* dir
, uint16 dircount
)
4098 static const char module
[] = "TIFFReadDirectoryCheckOrder";
4103 for (n
=0, o
=dir
; n
<dircount
; n
++, o
++)
4107 TIFFWarningExt(tif
->tif_clientdata
,module
,
4108 "Invalid TIFF directory; tags are not sorted in ascending order");
4115 static TIFFDirEntry
*
4116 TIFFReadDirectoryFindEntry(TIFF
* tif
, TIFFDirEntry
* dir
, uint16 dircount
, uint16 tagid
)
4121 for (m
=dir
, n
=0; n
<dircount
; m
++, n
++)
4123 if (m
->tdir_tag
==tagid
)
4130 TIFFReadDirectoryFindFieldInfo(TIFF
* tif
, uint16 tagid
, uint32
* fii
)
4134 mc
=(int32
)tif
->tif_nfields
;
4143 if (tif
->tif_fields
[mb
]->field_tag
==(uint32
)tagid
)
4145 if (tif
->tif_fields
[mb
]->field_tag
<(uint32
)tagid
)
4154 if (tif
->tif_fields
[mb
-1]->field_tag
!=(uint32
)tagid
)
4162 * Read custom directory from the arbitrary offset.
4163 * The code is very similar to TIFFReadDirectory().
4166 TIFFReadCustomDirectory(TIFF
* tif
, toff_t diroff
,
4167 const TIFFFieldArray
* infoarray
)
4169 static const char module
[] = "TIFFReadCustomDirectory";
4174 const TIFFField
* fip
;
4176 _TIFFSetupFields(tif
, infoarray
);
4177 dircount
=TIFFFetchDirectory(tif
,diroff
,&dir
,NULL
);
4180 TIFFErrorExt(tif
->tif_clientdata
,module
,
4181 "Failed to read custom directory at offset " TIFF_UINT64_FORMAT
,diroff
);
4184 TIFFFreeDirectory(tif
);
4185 _TIFFmemset(&tif
->tif_dir
, 0, sizeof(TIFFDirectory
));
4186 TIFFReadDirectoryCheckOrder(tif
,dir
,dircount
);
4187 for (di
=0, dp
=dir
; di
<dircount
; di
++, dp
++)
4189 TIFFReadDirectoryFindFieldInfo(tif
,dp
->tdir_tag
,&fii
);
4190 if (fii
== FAILED_FII
)
4192 TIFFWarningExt(tif
->tif_clientdata
, module
,
4193 "Unknown field with tag %d (0x%x) encountered",
4194 dp
->tdir_tag
, dp
->tdir_tag
);
4195 if (!_TIFFMergeFields(tif
, _TIFFCreateAnonField(tif
,
4197 (TIFFDataType
) dp
->tdir_type
),
4199 TIFFWarningExt(tif
->tif_clientdata
, module
,
4200 "Registering anonymous field with tag %d (0x%x) failed",
4201 dp
->tdir_tag
, dp
->tdir_tag
);
4202 dp
->tdir_tag
=IGNORE
;
4204 TIFFReadDirectoryFindFieldInfo(tif
,dp
->tdir_tag
,&fii
);
4205 assert( fii
!= FAILED_FII
);
4208 if (dp
->tdir_tag
!=IGNORE
)
4210 fip
=tif
->tif_fields
[fii
];
4211 if (fip
->field_bit
==FIELD_IGNORE
)
4212 dp
->tdir_tag
=IGNORE
;
4215 /* check data type */
4216 while ((fip
->field_type
!=TIFF_ANY
)&&(fip
->field_type
!=dp
->tdir_type
))
4219 if ((fii
==tif
->tif_nfields
)||
4220 (tif
->tif_fields
[fii
]->field_tag
!=(uint32
)dp
->tdir_tag
))
4225 fip
=tif
->tif_fields
[fii
];
4229 TIFFWarningExt(tif
->tif_clientdata
, module
,
4230 "Wrong data type %d for \"%s\"; tag ignored",
4231 dp
->tdir_type
,fip
->field_name
);
4232 dp
->tdir_tag
=IGNORE
;
4236 /* check count if known in advance */
4237 if ((fip
->field_readcount
!=TIFF_VARIABLE
)&&
4238 (fip
->field_readcount
!=TIFF_VARIABLE2
))
4241 if (fip
->field_readcount
==TIFF_SPP
)
4242 expected
=(uint32
)tif
->tif_dir
.td_samplesperpixel
;
4244 expected
=(uint32
)fip
->field_readcount
;
4245 if (!CheckDirCount(tif
,dp
,expected
))
4246 dp
->tdir_tag
=IGNORE
;
4250 switch (dp
->tdir_tag
)
4254 case EXIFTAG_SUBJECTDISTANCE
:
4255 (void) TIFFFetchSubjectDistance(tif
,dp
);
4258 (void) TIFFFetchNormalTag(tif
, dp
, TRUE
);
4269 * EXIF is important special case of custom IFD, so we have a special
4270 * function to read it.
4273 TIFFReadEXIFDirectory(TIFF
* tif
, toff_t diroff
)
4275 const TIFFFieldArray
* exifFieldArray
;
4276 exifFieldArray
= _TIFFGetExifFields();
4277 return TIFFReadCustomDirectory(tif
, diroff
, exifFieldArray
);
4281 EstimateStripByteCounts(TIFF
* tif
, TIFFDirEntry
* dir
, uint16 dircount
)
4283 static const char module
[] = "EstimateStripByteCounts";
4286 TIFFDirectory
*td
= &tif
->tif_dir
;
4289 /* Do not try to load stripbytecount as we will compute it */
4290 if( !_TIFFFillStrilesInternal( tif
, 0 ) )
4293 if (td
->td_stripbytecount
)
4294 _TIFFfree(td
->td_stripbytecount
);
4295 td
->td_stripbytecount
= (uint64
*)
4296 _TIFFCheckMalloc(tif
, td
->td_nstrips
, sizeof (uint64
),
4297 "for \"StripByteCounts\" array");
4298 if( td
->td_stripbytecount
== NULL
)
4301 if (td
->td_compression
!= COMPRESSION_NONE
) {
4305 filesize
= TIFFGetFileSize(tif
);
4306 if (!(tif
->tif_flags
&TIFF_BIGTIFF
))
4307 space
=sizeof(TIFFHeaderClassic
)+2+dircount
*12+4;
4309 space
=sizeof(TIFFHeaderBig
)+8+dircount
*20+8;
4310 /* calculate amount of space used by indirect values */
4311 for (dp
= dir
, n
= dircount
; n
> 0; n
--, dp
++)
4315 typewidth
= TIFFDataWidth((TIFFDataType
) dp
->tdir_type
);
4316 if (typewidth
== 0) {
4317 TIFFErrorExt(tif
->tif_clientdata
, module
,
4318 "Cannot determine size of unknown tag type %d",
4322 datasize
=(uint64
)typewidth
*dp
->tdir_count
;
4323 if (!(tif
->tif_flags
&TIFF_BIGTIFF
))
4335 space
= filesize
- space
;
4336 if (td
->td_planarconfig
== PLANARCONFIG_SEPARATE
)
4337 space
/= td
->td_samplesperpixel
;
4338 for (strip
= 0; strip
< td
->td_nstrips
; strip
++)
4339 td
->td_stripbytecount
[strip
] = space
;
4341 * This gross hack handles the case were the offset to
4342 * the last strip is past the place where we think the strip
4343 * should begin. Since a strip of data must be contiguous,
4344 * it's safe to assume that we've overestimated the amount
4345 * of data in the strip and trim this number back accordingly.
4348 if (td
->td_stripoffset
[strip
]+td
->td_stripbytecount
[strip
] > filesize
)
4349 td
->td_stripbytecount
[strip
] = filesize
- td
->td_stripoffset
[strip
];
4350 } else if (isTiled(tif
)) {
4351 uint64 bytespertile
= TIFFTileSize64(tif
);
4353 for (strip
= 0; strip
< td
->td_nstrips
; strip
++)
4354 td
->td_stripbytecount
[strip
] = bytespertile
;
4356 uint64 rowbytes
= TIFFScanlineSize64(tif
);
4357 uint32 rowsperstrip
= td
->td_imagelength
/td
->td_stripsperimage
;
4358 for (strip
= 0; strip
< td
->td_nstrips
; strip
++)
4359 td
->td_stripbytecount
[strip
] = rowbytes
* rowsperstrip
;
4361 TIFFSetFieldBit(tif
, FIELD_STRIPBYTECOUNTS
);
4362 if (!TIFFFieldSet(tif
, FIELD_ROWSPERSTRIP
))
4363 td
->td_rowsperstrip
= td
->td_imagelength
;
4368 MissingRequired(TIFF
* tif
, const char* tagname
)
4370 static const char module
[] = "MissingRequired";
4372 TIFFErrorExt(tif
->tif_clientdata
, module
,
4373 "TIFF directory is missing required \"%s\" field",
4378 * Check the directory offset against the list of already seen directory
4379 * offsets. This is a trick to prevent IFD looping. The one can create TIFF
4380 * file with looped directory pointers. We will maintain a list of already
4381 * seen directories and check every IFD offset against that list.
4384 TIFFCheckDirOffset(TIFF
* tif
, uint64 diroff
)
4388 if (diroff
== 0) /* no more directories */
4390 if (tif
->tif_dirnumber
== 65535) {
4391 TIFFErrorExt(tif
->tif_clientdata
, "TIFFCheckDirOffset",
4392 "Cannot handle more than 65535 TIFF directories");
4396 for (n
= 0; n
< tif
->tif_dirnumber
&& tif
->tif_dirlist
; n
++) {
4397 if (tif
->tif_dirlist
[n
] == diroff
)
4401 tif
->tif_dirnumber
++;
4403 if (tif
->tif_dirlist
== NULL
|| tif
->tif_dirnumber
> tif
->tif_dirlistsize
) {
4404 uint64
* new_dirlist
;
4407 * XXX: Reduce memory allocation granularity of the dirlist
4410 new_dirlist
= (uint64
*)_TIFFCheckRealloc(tif
, tif
->tif_dirlist
,
4411 tif
->tif_dirnumber
, 2 * sizeof(uint64
), "for IFD list");
4414 if( tif
->tif_dirnumber
>= 32768 )
4415 tif
->tif_dirlistsize
= 65535;
4417 tif
->tif_dirlistsize
= 2 * tif
->tif_dirnumber
;
4418 tif
->tif_dirlist
= new_dirlist
;
4421 tif
->tif_dirlist
[tif
->tif_dirnumber
- 1] = diroff
;
4427 * Check the count field of a directory entry against a known value. The
4428 * caller is expected to skip/ignore the tag if there is a mismatch.
4431 CheckDirCount(TIFF
* tif
, TIFFDirEntry
* dir
, uint32 count
)
4433 if ((uint64
)count
> dir
->tdir_count
) {
4434 const TIFFField
* fip
= TIFFFieldWithTag(tif
, dir
->tdir_tag
);
4435 TIFFWarningExt(tif
->tif_clientdata
, tif
->tif_name
,
4436 "incorrect count for field \"%s\" (" TIFF_UINT64_FORMAT
", expecting %u); tag ignored",
4437 fip
? fip
->field_name
: "unknown tagname",
4438 dir
->tdir_count
, count
);
4440 } else if ((uint64
)count
< dir
->tdir_count
) {
4441 const TIFFField
* fip
= TIFFFieldWithTag(tif
, dir
->tdir_tag
);
4442 TIFFWarningExt(tif
->tif_clientdata
, tif
->tif_name
,
4443 "incorrect count for field \"%s\" (" TIFF_UINT64_FORMAT
", expecting %u); tag trimmed",
4444 fip
? fip
->field_name
: "unknown tagname",
4445 dir
->tdir_count
, count
);
4446 dir
->tdir_count
= count
;
4453 * Read IFD structure from the specified offset. If the pointer to
4454 * nextdiroff variable has been specified, read it too. Function returns a
4455 * number of fields in the directory or 0 if failed.
4458 TIFFFetchDirectory(TIFF
* tif
, uint64 diroff
, TIFFDirEntry
** pdir
,
4461 static const char module
[] = "TIFFFetchDirectory";
4473 tif
->tif_diroff
= diroff
;
4476 if (!isMapped(tif
)) {
4477 if (!SeekOK(tif
, tif
->tif_diroff
)) {
4478 TIFFErrorExt(tif
->tif_clientdata
, module
,
4479 "%s: Seek error accessing TIFF directory",
4483 if (!(tif
->tif_flags
&TIFF_BIGTIFF
))
4485 if (!ReadOK(tif
, &dircount16
, sizeof (uint16
))) {
4486 TIFFErrorExt(tif
->tif_clientdata
, module
,
4487 "%s: Can not read TIFF directory count",
4491 if (tif
->tif_flags
& TIFF_SWAB
)
4492 TIFFSwabShort(&dircount16
);
4493 if (dircount16
>4096)
4495 TIFFErrorExt(tif
->tif_clientdata
, module
,
4496 "Sanity check on directory count failed, this is probably not a valid IFD offset");
4502 if (!ReadOK(tif
, &dircount64
, sizeof (uint64
))) {
4503 TIFFErrorExt(tif
->tif_clientdata
, module
,
4504 "%s: Can not read TIFF directory count",
4508 if (tif
->tif_flags
& TIFF_SWAB
)
4509 TIFFSwabLong8(&dircount64
);
4510 if (dircount64
>4096)
4512 TIFFErrorExt(tif
->tif_clientdata
, module
,
4513 "Sanity check on directory count failed, this is probably not a valid IFD offset");
4516 dircount16
= (uint16
)dircount64
;
4519 origdir
= _TIFFCheckMalloc(tif
, dircount16
,
4520 dirsize
, "to read TIFF directory");
4521 if (origdir
== NULL
)
4523 if (!ReadOK(tif
, origdir
, (tmsize_t
)(dircount16
*dirsize
))) {
4524 TIFFErrorExt(tif
->tif_clientdata
, module
,
4525 "%.100s: Can not read TIFF directory",
4531 * Read offset to next directory for sequential scans if
4536 if (!(tif
->tif_flags
&TIFF_BIGTIFF
))
4538 uint32 nextdiroff32
;
4539 if (!ReadOK(tif
, &nextdiroff32
, sizeof(uint32
)))
4541 if (tif
->tif_flags
&TIFF_SWAB
)
4542 TIFFSwabLong(&nextdiroff32
);
4543 *nextdiroff
=nextdiroff32
;
4545 if (!ReadOK(tif
, nextdiroff
, sizeof(uint64
)))
4547 if (tif
->tif_flags
&TIFF_SWAB
)
4548 TIFFSwabLong8(nextdiroff
);
4553 tmsize_t off
= (tmsize_t
) tif
->tif_diroff
;
4554 if ((uint64
)off
!=tif
->tif_diroff
)
4556 TIFFErrorExt(tif
->tif_clientdata
,module
,"Can not read TIFF directory count");
4561 * Check for integer overflow when validating the dir_off,
4562 * otherwise a very high offset may cause an OOB read and
4563 * crash the client. Make two comparisons instead of
4565 * off + sizeof(uint16) > tif->tif_size
4567 * to avoid overflow.
4569 if (!(tif
->tif_flags
&TIFF_BIGTIFF
))
4571 m
=off
+sizeof(uint16
);
4572 if ((m
<off
)||(m
<(tmsize_t
)sizeof(uint16
))||(m
>tif
->tif_size
)) {
4573 TIFFErrorExt(tif
->tif_clientdata
, module
,
4574 "Can not read TIFF directory count");
4577 _TIFFmemcpy(&dircount16
, tif
->tif_base
+ off
,
4580 off
+= sizeof (uint16
);
4581 if (tif
->tif_flags
& TIFF_SWAB
)
4582 TIFFSwabShort(&dircount16
);
4583 if (dircount16
>4096)
4585 TIFFErrorExt(tif
->tif_clientdata
, module
,
4586 "Sanity check on directory count failed, this is probably not a valid IFD offset");
4594 m
=off
+sizeof(uint64
);
4595 if ((m
<off
)||(m
<(tmsize_t
)sizeof(uint64
))||(m
>tif
->tif_size
)) {
4596 TIFFErrorExt(tif
->tif_clientdata
, module
,
4597 "Can not read TIFF directory count");
4600 _TIFFmemcpy(&dircount64
, tif
->tif_base
+ off
,
4603 off
+= sizeof (uint64
);
4604 if (tif
->tif_flags
& TIFF_SWAB
)
4605 TIFFSwabLong8(&dircount64
);
4606 if (dircount64
>4096)
4608 TIFFErrorExt(tif
->tif_clientdata
, module
,
4609 "Sanity check on directory count failed, this is probably not a valid IFD offset");
4612 dircount16
= (uint16
)dircount64
;
4615 if (dircount16
== 0 )
4617 TIFFErrorExt(tif
->tif_clientdata
, module
,
4618 "Sanity check on directory count failed, zero tag directories not supported");
4621 origdir
= _TIFFCheckMalloc(tif
, dircount16
,
4623 "to read TIFF directory");
4624 if (origdir
== NULL
)
4626 m
=off
+dircount16
*dirsize
;
4627 if ((m
<off
)||(m
<(tmsize_t
)(dircount16
*dirsize
))||(m
>tif
->tif_size
)) {
4628 TIFFErrorExt(tif
->tif_clientdata
, module
,
4629 "Can not read TIFF directory");
4633 _TIFFmemcpy(origdir
, tif
->tif_base
+ off
,
4634 dircount16
* dirsize
);
4637 off
+= dircount16
* dirsize
;
4638 if (!(tif
->tif_flags
&TIFF_BIGTIFF
))
4640 uint32 nextdiroff32
;
4641 m
=off
+sizeof(uint32
);
4642 if ((m
<off
)||(m
<(tmsize_t
)sizeof(uint32
))||(m
>tif
->tif_size
))
4645 _TIFFmemcpy(&nextdiroff32
, tif
->tif_base
+ off
,
4647 if (tif
->tif_flags
&TIFF_SWAB
)
4648 TIFFSwabLong(&nextdiroff32
);
4649 *nextdiroff
= nextdiroff32
;
4653 m
=off
+sizeof(uint64
);
4654 if ((m
<off
)||(m
<(tmsize_t
)sizeof(uint64
))||(m
>tif
->tif_size
))
4657 _TIFFmemcpy(nextdiroff
, tif
->tif_base
+ off
,
4659 if (tif
->tif_flags
&TIFF_SWAB
)
4660 TIFFSwabLong8(nextdiroff
);
4664 dir
= (TIFFDirEntry
*)_TIFFCheckMalloc(tif
, dircount16
,
4665 sizeof(TIFFDirEntry
),
4666 "to read TIFF directory");
4674 for (n
=0; n
<dircount16
; n
++)
4676 if (tif
->tif_flags
&TIFF_SWAB
)
4677 TIFFSwabShort((uint16
*)ma
);
4678 mb
->tdir_tag
=*(uint16
*)ma
;
4680 if (tif
->tif_flags
&TIFF_SWAB
)
4681 TIFFSwabShort((uint16
*)ma
);
4682 mb
->tdir_type
=*(uint16
*)ma
;
4684 if (!(tif
->tif_flags
&TIFF_BIGTIFF
))
4686 if (tif
->tif_flags
&TIFF_SWAB
)
4687 TIFFSwabLong((uint32
*)ma
);
4688 mb
->tdir_count
=(uint64
)(*(uint32
*)ma
);
4690 *(uint32
*)(&mb
->tdir_offset
)=*(uint32
*)ma
;
4695 if (tif
->tif_flags
&TIFF_SWAB
)
4696 TIFFSwabLong8((uint64
*)ma
);
4697 mb
->tdir_count
=TIFFReadUInt64(ma
);
4699 mb
->tdir_offset
.toff_long8
=TIFFReadUInt64(ma
);
4710 * Fetch a tag that is not handled by special case code.
4713 TIFFFetchNormalTag(TIFF
* tif
, TIFFDirEntry
* dp
, int recover
)
4715 static const char module
[] = "TIFFFetchNormalTag";
4716 enum TIFFReadDirEntryErr err
;
4718 const TIFFField
* fip
= NULL
;
4719 TIFFReadDirectoryFindFieldInfo(tif
,dp
->tdir_tag
,&fii
);
4720 if( fii
== FAILED_FII
)
4722 TIFFErrorExt(tif
->tif_clientdata
, "TIFFFetchNormalTag",
4723 "No definition found for tag %d",
4727 fip
=tif
->tif_fields
[fii
];
4728 assert(fip
!= NULL
); /* should not happen */
4729 assert(fip
->set_field_type
!=TIFF_SETGET_OTHER
); /* if so, we shouldn't arrive here but deal with this in specialized code */
4730 assert(fip
->set_field_type
!=TIFF_SETGET_INT
); /* if so, we shouldn't arrive here as this is only the case for pseudo-tags */
4731 err
=TIFFReadDirEntryErrOk
;
4732 switch (fip
->set_field_type
)
4734 case TIFF_SETGET_UNDEFINED
:
4736 case TIFF_SETGET_ASCII
:
4739 assert(fip
->field_passcount
==0);
4740 err
=TIFFReadDirEntryByteArray(tif
,dp
,&data
);
4741 if (err
==TIFFReadDirEntryErrOk
)
4748 while (mb
<(uint32
)dp
->tdir_count
)
4755 if (mb
+1<(uint32
)dp
->tdir_count
)
4756 TIFFWarningExt(tif
->tif_clientdata
,module
,"ASCII value for tag \"%s\" contains null byte in value; value incorrectly truncated during reading due to implementation limitations",fip
->field_name
);
4757 else if (mb
+1>(uint32
)dp
->tdir_count
)
4760 TIFFWarningExt(tif
->tif_clientdata
,module
,"ASCII value for tag \"%s\" does not end in null byte",fip
->field_name
);
4761 if ((uint32
)dp
->tdir_count
+1!=dp
->tdir_count
+1)
4764 o
=_TIFFmalloc((uint32
)dp
->tdir_count
+1);
4771 _TIFFmemcpy(o
,data
,(uint32
)dp
->tdir_count
);
4772 o
[(uint32
)dp
->tdir_count
]=0;
4777 n
=TIFFSetField(tif
,dp
->tdir_tag
,data
);
4785 case TIFF_SETGET_UINT8
:
4788 assert(fip
->field_readcount
==1);
4789 assert(fip
->field_passcount
==0);
4790 err
=TIFFReadDirEntryByte(tif
,dp
,&data
);
4791 if (err
==TIFFReadDirEntryErrOk
)
4793 if (!TIFFSetField(tif
,dp
->tdir_tag
,data
))
4798 case TIFF_SETGET_UINT16
:
4801 assert(fip
->field_readcount
==1);
4802 assert(fip
->field_passcount
==0);
4803 err
=TIFFReadDirEntryShort(tif
,dp
,&data
);
4804 if (err
==TIFFReadDirEntryErrOk
)
4806 if (!TIFFSetField(tif
,dp
->tdir_tag
,data
))
4811 case TIFF_SETGET_UINT32
:
4814 assert(fip
->field_readcount
==1);
4815 assert(fip
->field_passcount
==0);
4816 err
=TIFFReadDirEntryLong(tif
,dp
,&data
);
4817 if (err
==TIFFReadDirEntryErrOk
)
4819 if (!TIFFSetField(tif
,dp
->tdir_tag
,data
))
4824 case TIFF_SETGET_UINT64
:
4827 assert(fip
->field_readcount
==1);
4828 assert(fip
->field_passcount
==0);
4829 err
=TIFFReadDirEntryLong8(tif
,dp
,&data
);
4830 if (err
==TIFFReadDirEntryErrOk
)
4832 if (!TIFFSetField(tif
,dp
->tdir_tag
,data
))
4837 case TIFF_SETGET_FLOAT
:
4840 assert(fip
->field_readcount
==1);
4841 assert(fip
->field_passcount
==0);
4842 err
=TIFFReadDirEntryFloat(tif
,dp
,&data
);
4843 if (err
==TIFFReadDirEntryErrOk
)
4845 if (!TIFFSetField(tif
,dp
->tdir_tag
,data
))
4850 case TIFF_SETGET_DOUBLE
:
4853 assert(fip
->field_readcount
==1);
4854 assert(fip
->field_passcount
==0);
4855 err
=TIFFReadDirEntryDouble(tif
,dp
,&data
);
4856 if (err
==TIFFReadDirEntryErrOk
)
4858 if (!TIFFSetField(tif
,dp
->tdir_tag
,data
))
4863 case TIFF_SETGET_IFD8
:
4866 assert(fip
->field_readcount
==1);
4867 assert(fip
->field_passcount
==0);
4868 err
=TIFFReadDirEntryIfd8(tif
,dp
,&data
);
4869 if (err
==TIFFReadDirEntryErrOk
)
4871 if (!TIFFSetField(tif
,dp
->tdir_tag
,data
))
4876 case TIFF_SETGET_UINT16_PAIR
:
4879 assert(fip
->field_readcount
==2);
4880 assert(fip
->field_passcount
==0);
4881 if (dp
->tdir_count
!=2) {
4882 TIFFWarningExt(tif
->tif_clientdata
,module
,
4883 "incorrect count for field \"%s\", expected 2, got %d",
4884 fip
->field_name
,(int)dp
->tdir_count
);
4887 err
=TIFFReadDirEntryShortArray(tif
,dp
,&data
);
4888 if (err
==TIFFReadDirEntryErrOk
)
4891 m
=TIFFSetField(tif
,dp
->tdir_tag
,data
[0],data
[1]);
4898 case TIFF_SETGET_C0_UINT8
:
4901 assert(fip
->field_readcount
>=1);
4902 assert(fip
->field_passcount
==0);
4903 if (dp
->tdir_count
!=(uint64
)fip
->field_readcount
) {
4904 TIFFWarningExt(tif
->tif_clientdata
,module
,
4905 "incorrect count for field \"%s\", expected %d, got %d",
4906 fip
->field_name
,(int) fip
->field_readcount
, (int)dp
->tdir_count
);
4911 err
=TIFFReadDirEntryByteArray(tif
,dp
,&data
);
4912 if (err
==TIFFReadDirEntryErrOk
)
4915 m
=TIFFSetField(tif
,dp
->tdir_tag
,data
);
4924 case TIFF_SETGET_C0_UINT16
:
4927 assert(fip
->field_readcount
>=1);
4928 assert(fip
->field_passcount
==0);
4929 if (dp
->tdir_count
!=(uint64
)fip
->field_readcount
)
4933 err
=TIFFReadDirEntryShortArray(tif
,dp
,&data
);
4934 if (err
==TIFFReadDirEntryErrOk
)
4937 m
=TIFFSetField(tif
,dp
->tdir_tag
,data
);
4946 case TIFF_SETGET_C0_UINT32
:
4949 assert(fip
->field_readcount
>=1);
4950 assert(fip
->field_passcount
==0);
4951 if (dp
->tdir_count
!=(uint64
)fip
->field_readcount
)
4955 err
=TIFFReadDirEntryLongArray(tif
,dp
,&data
);
4956 if (err
==TIFFReadDirEntryErrOk
)
4959 m
=TIFFSetField(tif
,dp
->tdir_tag
,data
);
4968 case TIFF_SETGET_C0_FLOAT
:
4971 assert(fip
->field_readcount
>=1);
4972 assert(fip
->field_passcount
==0);
4973 if (dp
->tdir_count
!=(uint64
)fip
->field_readcount
)
4977 err
=TIFFReadDirEntryFloatArray(tif
,dp
,&data
);
4978 if (err
==TIFFReadDirEntryErrOk
)
4981 m
=TIFFSetField(tif
,dp
->tdir_tag
,data
);
4990 case TIFF_SETGET_C16_ASCII
:
4993 assert(fip
->field_readcount
==TIFF_VARIABLE
);
4994 assert(fip
->field_passcount
==1);
4995 if (dp
->tdir_count
>0xFFFF)
4996 err
=TIFFReadDirEntryErrCount
;
4999 err
=TIFFReadDirEntryByteArray(tif
,dp
,&data
);
5000 if (err
==TIFFReadDirEntryErrOk
)
5003 if( dp
->tdir_count
> 0 && data
[dp
->tdir_count
-1] != '\0' )
5005 TIFFWarningExt(tif
->tif_clientdata
,module
,"ASCII value for tag \"%s\" does not end in null byte. Forcing it to be null",fip
->field_name
);
5006 data
[dp
->tdir_count
-1] = '\0';
5008 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint16
)(dp
->tdir_count
),data
);
5017 case TIFF_SETGET_C16_UINT8
:
5020 assert(fip
->field_readcount
==TIFF_VARIABLE
);
5021 assert(fip
->field_passcount
==1);
5022 if (dp
->tdir_count
>0xFFFF)
5023 err
=TIFFReadDirEntryErrCount
;
5026 err
=TIFFReadDirEntryByteArray(tif
,dp
,&data
);
5027 if (err
==TIFFReadDirEntryErrOk
)
5030 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint16
)(dp
->tdir_count
),data
);
5039 case TIFF_SETGET_C16_UINT16
:
5042 assert(fip
->field_readcount
==TIFF_VARIABLE
);
5043 assert(fip
->field_passcount
==1);
5044 if (dp
->tdir_count
>0xFFFF)
5045 err
=TIFFReadDirEntryErrCount
;
5048 err
=TIFFReadDirEntryShortArray(tif
,dp
,&data
);
5049 if (err
==TIFFReadDirEntryErrOk
)
5052 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint16
)(dp
->tdir_count
),data
);
5061 case TIFF_SETGET_C16_UINT32
:
5064 assert(fip
->field_readcount
==TIFF_VARIABLE
);
5065 assert(fip
->field_passcount
==1);
5066 if (dp
->tdir_count
>0xFFFF)
5067 err
=TIFFReadDirEntryErrCount
;
5070 err
=TIFFReadDirEntryLongArray(tif
,dp
,&data
);
5071 if (err
==TIFFReadDirEntryErrOk
)
5074 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint16
)(dp
->tdir_count
),data
);
5083 case TIFF_SETGET_C16_UINT64
:
5086 assert(fip
->field_readcount
==TIFF_VARIABLE
);
5087 assert(fip
->field_passcount
==1);
5088 if (dp
->tdir_count
>0xFFFF)
5089 err
=TIFFReadDirEntryErrCount
;
5092 err
=TIFFReadDirEntryLong8Array(tif
,dp
,&data
);
5093 if (err
==TIFFReadDirEntryErrOk
)
5096 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint16
)(dp
->tdir_count
),data
);
5105 case TIFF_SETGET_C16_FLOAT
:
5108 assert(fip
->field_readcount
==TIFF_VARIABLE
);
5109 assert(fip
->field_passcount
==1);
5110 if (dp
->tdir_count
>0xFFFF)
5111 err
=TIFFReadDirEntryErrCount
;
5114 err
=TIFFReadDirEntryFloatArray(tif
,dp
,&data
);
5115 if (err
==TIFFReadDirEntryErrOk
)
5118 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint16
)(dp
->tdir_count
),data
);
5127 case TIFF_SETGET_C16_DOUBLE
:
5130 assert(fip
->field_readcount
==TIFF_VARIABLE
);
5131 assert(fip
->field_passcount
==1);
5132 if (dp
->tdir_count
>0xFFFF)
5133 err
=TIFFReadDirEntryErrCount
;
5136 err
=TIFFReadDirEntryDoubleArray(tif
,dp
,&data
);
5137 if (err
==TIFFReadDirEntryErrOk
)
5140 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint16
)(dp
->tdir_count
),data
);
5149 case TIFF_SETGET_C16_IFD8
:
5152 assert(fip
->field_readcount
==TIFF_VARIABLE
);
5153 assert(fip
->field_passcount
==1);
5154 if (dp
->tdir_count
>0xFFFF)
5155 err
=TIFFReadDirEntryErrCount
;
5158 err
=TIFFReadDirEntryIfd8Array(tif
,dp
,&data
);
5159 if (err
==TIFFReadDirEntryErrOk
)
5162 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint16
)(dp
->tdir_count
),data
);
5171 case TIFF_SETGET_C32_ASCII
:
5174 assert(fip
->field_readcount
==TIFF_VARIABLE2
);
5175 assert(fip
->field_passcount
==1);
5176 err
=TIFFReadDirEntryByteArray(tif
,dp
,&data
);
5177 if (err
==TIFFReadDirEntryErrOk
)
5180 if( dp
->tdir_count
> 0 && data
[dp
->tdir_count
-1] != '\0' )
5182 TIFFWarningExt(tif
->tif_clientdata
,module
,"ASCII value for tag \"%s\" does not end in null byte. Forcing it to be null",fip
->field_name
);
5183 data
[dp
->tdir_count
-1] = '\0';
5185 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint32
)(dp
->tdir_count
),data
);
5193 case TIFF_SETGET_C32_UINT8
:
5196 assert(fip
->field_readcount
==TIFF_VARIABLE2
);
5197 assert(fip
->field_passcount
==1);
5198 err
=TIFFReadDirEntryByteArray(tif
,dp
,&data
);
5199 if (err
==TIFFReadDirEntryErrOk
)
5202 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint32
)(dp
->tdir_count
),data
);
5210 case TIFF_SETGET_C32_SINT8
:
5213 assert(fip
->field_readcount
==TIFF_VARIABLE2
);
5214 assert(fip
->field_passcount
==1);
5215 err
=TIFFReadDirEntrySbyteArray(tif
,dp
,&data
);
5216 if (err
==TIFFReadDirEntryErrOk
)
5219 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint32
)(dp
->tdir_count
),data
);
5227 case TIFF_SETGET_C32_UINT16
:
5230 assert(fip
->field_readcount
==TIFF_VARIABLE2
);
5231 assert(fip
->field_passcount
==1);
5232 err
=TIFFReadDirEntryShortArray(tif
,dp
,&data
);
5233 if (err
==TIFFReadDirEntryErrOk
)
5236 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint32
)(dp
->tdir_count
),data
);
5244 case TIFF_SETGET_C32_SINT16
:
5247 assert(fip
->field_readcount
==TIFF_VARIABLE2
);
5248 assert(fip
->field_passcount
==1);
5249 err
=TIFFReadDirEntrySshortArray(tif
,dp
,&data
);
5250 if (err
==TIFFReadDirEntryErrOk
)
5253 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint32
)(dp
->tdir_count
),data
);
5261 case TIFF_SETGET_C32_UINT32
:
5264 assert(fip
->field_readcount
==TIFF_VARIABLE2
);
5265 assert(fip
->field_passcount
==1);
5266 err
=TIFFReadDirEntryLongArray(tif
,dp
,&data
);
5267 if (err
==TIFFReadDirEntryErrOk
)
5270 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint32
)(dp
->tdir_count
),data
);
5278 case TIFF_SETGET_C32_SINT32
:
5281 assert(fip
->field_readcount
==TIFF_VARIABLE2
);
5282 assert(fip
->field_passcount
==1);
5283 err
=TIFFReadDirEntrySlongArray(tif
,dp
,&data
);
5284 if (err
==TIFFReadDirEntryErrOk
)
5287 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint32
)(dp
->tdir_count
),data
);
5295 case TIFF_SETGET_C32_UINT64
:
5298 assert(fip
->field_readcount
==TIFF_VARIABLE2
);
5299 assert(fip
->field_passcount
==1);
5300 err
=TIFFReadDirEntryLong8Array(tif
,dp
,&data
);
5301 if (err
==TIFFReadDirEntryErrOk
)
5304 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint32
)(dp
->tdir_count
),data
);
5312 case TIFF_SETGET_C32_SINT64
:
5315 assert(fip
->field_readcount
==TIFF_VARIABLE2
);
5316 assert(fip
->field_passcount
==1);
5317 err
=TIFFReadDirEntrySlong8Array(tif
,dp
,&data
);
5318 if (err
==TIFFReadDirEntryErrOk
)
5321 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint32
)(dp
->tdir_count
),data
);
5329 case TIFF_SETGET_C32_FLOAT
:
5332 assert(fip
->field_readcount
==TIFF_VARIABLE2
);
5333 assert(fip
->field_passcount
==1);
5334 err
=TIFFReadDirEntryFloatArray(tif
,dp
,&data
);
5335 if (err
==TIFFReadDirEntryErrOk
)
5338 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint32
)(dp
->tdir_count
),data
);
5346 case TIFF_SETGET_C32_DOUBLE
:
5349 assert(fip
->field_readcount
==TIFF_VARIABLE2
);
5350 assert(fip
->field_passcount
==1);
5351 err
=TIFFReadDirEntryDoubleArray(tif
,dp
,&data
);
5352 if (err
==TIFFReadDirEntryErrOk
)
5355 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint32
)(dp
->tdir_count
),data
);
5363 case TIFF_SETGET_C32_IFD8
:
5366 assert(fip
->field_readcount
==TIFF_VARIABLE2
);
5367 assert(fip
->field_passcount
==1);
5368 err
=TIFFReadDirEntryIfd8Array(tif
,dp
,&data
);
5369 if (err
==TIFFReadDirEntryErrOk
)
5372 m
=TIFFSetField(tif
,dp
->tdir_tag
,(uint32
)(dp
->tdir_count
),data
);
5381 assert(0); /* we should never get here */
5384 if (err
!=TIFFReadDirEntryErrOk
)
5386 TIFFReadDirEntryOutputErr(tif
,err
,module
,fip
->field_name
,recover
);
5393 * Fetch a set of offsets or lengths.
5394 * While this routine says "strips", in fact it's also used for tiles.
5397 TIFFFetchStripThing(TIFF
* tif
, TIFFDirEntry
* dir
, uint32 nstrips
, uint64
** lpp
)
5399 static const char module
[] = "TIFFFetchStripThing";
5400 enum TIFFReadDirEntryErr err
;
5402 err
=TIFFReadDirEntryLong8Array(tif
,dir
,&data
);
5403 if (err
!=TIFFReadDirEntryErrOk
)
5405 const TIFFField
* fip
= TIFFFieldWithTag(tif
,dir
->tdir_tag
);
5406 TIFFReadDirEntryOutputErr(tif
,err
,module
,fip
? fip
->field_name
: "unknown tagname",0);
5409 if (dir
->tdir_count
!=(uint64
)nstrips
)
5411 uint64
* resizeddata
;
5412 resizeddata
=(uint64
*)_TIFFCheckMalloc(tif
,nstrips
,sizeof(uint64
),"for strip array");
5413 if (resizeddata
==0) {
5417 if (dir
->tdir_count
<(uint64
)nstrips
)
5419 _TIFFmemcpy(resizeddata
,data
,(uint32
)dir
->tdir_count
*sizeof(uint64
));
5420 _TIFFmemset(resizeddata
+(uint32
)dir
->tdir_count
,0,(nstrips
-(uint32
)dir
->tdir_count
)*sizeof(uint64
));
5423 _TIFFmemcpy(resizeddata
,data
,nstrips
*sizeof(uint64
));
5432 * Fetch and set the SubjectDistance EXIF tag.
5435 TIFFFetchSubjectDistance(TIFF
* tif
, TIFFDirEntry
* dir
)
5437 static const char module
[] = "TIFFFetchSubjectDistance";
5438 enum TIFFReadDirEntryErr err
;
5441 assert(sizeof(double)==8);
5442 assert(sizeof(uint64
)==8);
5443 assert(sizeof(uint32
)==4);
5444 if (dir
->tdir_count
!=1)
5445 err
=TIFFReadDirEntryErrCount
;
5446 else if (dir
->tdir_type
!=TIFF_RATIONAL
)
5447 err
=TIFFReadDirEntryErrType
;
5450 if (!(tif
->tif_flags
&TIFF_BIGTIFF
))
5453 offset
=*(uint32
*)(&dir
->tdir_offset
);
5454 if (tif
->tif_flags
&TIFF_SWAB
)
5455 TIFFSwabLong(&offset
);
5456 err
=TIFFReadDirEntryData(tif
,offset
,8,m
.i
);
5460 m
.l
=dir
->tdir_offset
.toff_long8
;
5461 err
=TIFFReadDirEntryErrOk
;
5464 if (err
==TIFFReadDirEntryErrOk
)
5467 if (tif
->tif_flags
&TIFF_SWAB
)
5468 TIFFSwabArrayOfLong(m
.i
,2);
5471 else if (m
.i
[0]==0xFFFFFFFF)
5473 * XXX: Numerator 0xFFFFFFFF means that we have infinite
5474 * distance. Indicate that with a negative floating point
5475 * SubjectDistance value.
5479 n
=(double)m
.i
[0]/(double)m
.i
[1];
5480 return(TIFFSetField(tif
,dir
->tdir_tag
,n
));
5484 TIFFReadDirEntryOutputErr(tif
,err
,module
,"SubjectDistance",TRUE
);
5490 * Replace a single strip (tile) of uncompressed data by multiple strips
5491 * (tiles), each approximately STRIP_SIZE_DEFAULT bytes. This is useful for
5492 * dealing with large images or for dealing with machines with a limited
5496 ChopUpSingleUncompressedStrip(TIFF
* tif
)
5498 register TIFFDirectory
*td
= &tif
->tif_dir
;
5502 uint64 rowblockbytes
;
5507 uint32 rowsperstrip
;
5511 bytecount
= td
->td_stripbytecount
[0];
5512 offset
= td
->td_stripoffset
[0];
5513 assert(td
->td_planarconfig
== PLANARCONFIG_CONTIG
);
5514 if ((td
->td_photometric
== PHOTOMETRIC_YCBCR
)&&
5515 (!isUpSampled(tif
)))
5516 rowblock
= td
->td_ycbcrsubsampling
[1];
5519 rowblockbytes
= TIFFVTileSize64(tif
, rowblock
);
5521 * Make the rows hold at least one scanline, but fill specified amount
5522 * of data if possible.
5524 if (rowblockbytes
> STRIP_SIZE_DEFAULT
) {
5525 stripbytes
= rowblockbytes
;
5526 rowsperstrip
= rowblock
;
5527 } else if (rowblockbytes
> 0 ) {
5528 uint32 rowblocksperstrip
;
5529 rowblocksperstrip
= (uint32
) (STRIP_SIZE_DEFAULT
/ rowblockbytes
);
5530 rowsperstrip
= rowblocksperstrip
* rowblock
;
5531 stripbytes
= rowblocksperstrip
* rowblockbytes
;
5537 * never increase the number of strips in an image
5539 if (rowsperstrip
>= td
->td_rowsperstrip
)
5541 nstrips64
= TIFFhowmany_64(bytecount
, stripbytes
);
5542 if ((nstrips64
==0)||(nstrips64
>0xFFFFFFFF)) /* something is wonky, do nothing. */
5544 nstrips32
= (uint32
)nstrips64
;
5546 newcounts
= (uint64
*) _TIFFCheckMalloc(tif
, nstrips32
, sizeof (uint64
),
5547 "for chopped \"StripByteCounts\" array");
5548 newoffsets
= (uint64
*) _TIFFCheckMalloc(tif
, nstrips32
, sizeof (uint64
),
5549 "for chopped \"StripOffsets\" array");
5550 if (newcounts
== NULL
|| newoffsets
== NULL
) {
5552 * Unable to allocate new strip information, give up and use
5553 * the original one strip information.
5555 if (newcounts
!= NULL
)
5556 _TIFFfree(newcounts
);
5557 if (newoffsets
!= NULL
)
5558 _TIFFfree(newoffsets
);
5562 * Fill the strip information arrays with new bytecounts and offsets
5563 * that reflect the broken-up format.
5565 for (strip
= 0; strip
< nstrips32
; strip
++) {
5566 if (stripbytes
> bytecount
)
5567 stripbytes
= bytecount
;
5568 newcounts
[strip
] = stripbytes
;
5569 newoffsets
[strip
] = offset
;
5570 offset
+= stripbytes
;
5571 bytecount
-= stripbytes
;
5574 * Replace old single strip info with multi-strip info.
5576 td
->td_stripsperimage
= td
->td_nstrips
= nstrips32
;
5577 TIFFSetField(tif
, TIFFTAG_ROWSPERSTRIP
, rowsperstrip
);
5579 _TIFFfree(td
->td_stripbytecount
);
5580 _TIFFfree(td
->td_stripoffset
);
5581 td
->td_stripbytecount
= newcounts
;
5582 td
->td_stripoffset
= newoffsets
;
5583 td
->td_stripbytecountsorted
= 1;
5586 int _TIFFFillStriles( TIFF
*tif
)
5588 return _TIFFFillStrilesInternal( tif
, 1 );
5591 static int _TIFFFillStrilesInternal( TIFF
*tif
, int loadStripByteCount
)
5593 #if defined(DEFER_STRILE_LOAD)
5594 register TIFFDirectory
*td
= &tif
->tif_dir
;
5595 int return_value
= 1;
5597 if( td
->td_stripoffset
!= NULL
)
5600 if( td
->td_stripoffset_entry
.tdir_count
== 0 )
5603 if (!TIFFFetchStripThing(tif
,&(td
->td_stripoffset_entry
),
5604 td
->td_nstrips
,&td
->td_stripoffset
))
5609 if (loadStripByteCount
&&
5610 !TIFFFetchStripThing(tif
,&(td
->td_stripbytecount_entry
),
5611 td
->td_nstrips
,&td
->td_stripbytecount
))
5616 _TIFFmemset( &(td
->td_stripoffset_entry
), 0, sizeof(TIFFDirEntry
));
5617 _TIFFmemset( &(td
->td_stripbytecount_entry
), 0, sizeof(TIFFDirEntry
));
5619 if (tif
->tif_dir
.td_nstrips
> 1 && return_value
== 1 ) {
5622 tif
->tif_dir
.td_stripbytecountsorted
= 1;
5623 for (strip
= 1; strip
< tif
->tif_dir
.td_nstrips
; strip
++) {
5624 if (tif
->tif_dir
.td_stripoffset
[strip
- 1] >
5625 tif
->tif_dir
.td_stripoffset
[strip
]) {
5626 tif
->tif_dir
.td_stripbytecountsorted
= 0;
5632 return return_value
;
5633 #else /* !defined(DEFER_STRILE_LOAD) */
5635 (void) loadStripByteCount
;
5641 /* vim: set ts=8 sts=8 sw=8 noet: */