Line data Source code
1 : /*
2 : * Copyright (c) 1988-1997 Sam Leffler
3 : * Copyright (c) 1991-1997 Silicon Graphics, Inc.
4 : *
5 : * Permission to use, copy, modify, distribute, and sell this software and
6 : * its documentation for any purpose is hereby granted without fee, provided
7 : * that (i) the above copyright notices and this permission notice appear in
8 : * all copies of the software and related documentation, and (ii) the names of
9 : * Sam Leffler and Silicon Graphics may not be used in any advertising or
10 : * publicity relating to the software without the specific, prior written
11 : * permission of Sam Leffler and Silicon Graphics.
12 : *
13 : * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
14 : * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
15 : * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
16 : *
17 : * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
18 : * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
19 : * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20 : * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
21 : * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
22 : * OF THIS SOFTWARE.
23 : */
24 :
25 : /*
26 : * TIFF Library.
27 : *
28 : * Directory Read Support Routines.
29 : */
30 :
31 : /* Suggested pending improvements:
32 : * - add a field 'field_info' to the TIFFDirEntry structure, and set that with
33 : * the pointer to the appropriate TIFFField structure early on in
34 : * TIFFReadDirectory, so as to eliminate current possibly repetitive lookup.
35 : */
36 :
37 : #include "tiffconf.h"
38 : #include "tiffiop.h"
39 : #include <float.h>
40 : #include <limits.h>
41 : #include <stdlib.h>
42 : #include <string.h>
43 :
44 : #define FAILED_FII ((uint32_t)-1)
45 :
46 : #ifdef HAVE_IEEEFP
47 : #define TIFFCvtIEEEFloatToNative(tif, n, fp)
48 : #define TIFFCvtIEEEDoubleToNative(tif, n, dp)
49 : #else
50 : extern void TIFFCvtIEEEFloatToNative(TIFF *, uint32_t, float *);
51 : extern void TIFFCvtIEEEDoubleToNative(TIFF *, uint32_t, double *);
52 : #endif
53 :
54 : enum TIFFReadDirEntryErr
55 : {
56 : TIFFReadDirEntryErrOk = 0,
57 : TIFFReadDirEntryErrCount = 1,
58 : TIFFReadDirEntryErrType = 2,
59 : TIFFReadDirEntryErrIo = 3,
60 : TIFFReadDirEntryErrRange = 4,
61 : TIFFReadDirEntryErrPsdif = 5,
62 : TIFFReadDirEntryErrSizesan = 6,
63 : TIFFReadDirEntryErrAlloc = 7,
64 : };
65 :
66 : static enum TIFFReadDirEntryErr
67 : TIFFReadDirEntryByte(TIFF *tif, TIFFDirEntry *direntry, uint8_t *value);
68 : static enum TIFFReadDirEntryErr
69 : TIFFReadDirEntrySbyte(TIFF *tif, TIFFDirEntry *direntry, int8_t *value);
70 : static enum TIFFReadDirEntryErr
71 : TIFFReadDirEntryShort(TIFF *tif, TIFFDirEntry *direntry, uint16_t *value);
72 : static enum TIFFReadDirEntryErr
73 : TIFFReadDirEntrySshort(TIFF *tif, TIFFDirEntry *direntry, int16_t *value);
74 : static enum TIFFReadDirEntryErr
75 : TIFFReadDirEntryLong(TIFF *tif, TIFFDirEntry *direntry, uint32_t *value);
76 : static enum TIFFReadDirEntryErr
77 : TIFFReadDirEntrySlong(TIFF *tif, TIFFDirEntry *direntry, int32_t *value);
78 : static enum TIFFReadDirEntryErr
79 : TIFFReadDirEntryLong8(TIFF *tif, TIFFDirEntry *direntry, uint64_t *value);
80 : static enum TIFFReadDirEntryErr
81 : TIFFReadDirEntrySlong8(TIFF *tif, TIFFDirEntry *direntry, int64_t *value);
82 : static enum TIFFReadDirEntryErr
83 : TIFFReadDirEntryFloat(TIFF *tif, TIFFDirEntry *direntry, float *value);
84 : static enum TIFFReadDirEntryErr
85 : TIFFReadDirEntryDouble(TIFF *tif, TIFFDirEntry *direntry, double *value);
86 : static enum TIFFReadDirEntryErr
87 : TIFFReadDirEntryIfd8(TIFF *tif, TIFFDirEntry *direntry, uint64_t *value);
88 :
89 : static enum TIFFReadDirEntryErr
90 : TIFFReadDirEntryArray(TIFF *tif, TIFFDirEntry *direntry, uint32_t *count,
91 : uint32_t desttypesize, void **value);
92 : static enum TIFFReadDirEntryErr
93 : TIFFReadDirEntryByteArray(TIFF *tif, TIFFDirEntry *direntry, uint8_t **value);
94 : static enum TIFFReadDirEntryErr
95 : TIFFReadDirEntrySbyteArray(TIFF *tif, TIFFDirEntry *direntry, int8_t **value);
96 : static enum TIFFReadDirEntryErr
97 : TIFFReadDirEntryShortArray(TIFF *tif, TIFFDirEntry *direntry, uint16_t **value);
98 : static enum TIFFReadDirEntryErr
99 : TIFFReadDirEntrySshortArray(TIFF *tif, TIFFDirEntry *direntry, int16_t **value);
100 : static enum TIFFReadDirEntryErr
101 : TIFFReadDirEntryLongArray(TIFF *tif, TIFFDirEntry *direntry, uint32_t **value);
102 : static enum TIFFReadDirEntryErr
103 : TIFFReadDirEntrySlongArray(TIFF *tif, TIFFDirEntry *direntry, int32_t **value);
104 : static enum TIFFReadDirEntryErr
105 : TIFFReadDirEntryLong8Array(TIFF *tif, TIFFDirEntry *direntry, uint64_t **value);
106 : static enum TIFFReadDirEntryErr
107 : TIFFReadDirEntrySlong8Array(TIFF *tif, TIFFDirEntry *direntry, int64_t **value);
108 : static enum TIFFReadDirEntryErr
109 : TIFFReadDirEntryFloatArray(TIFF *tif, TIFFDirEntry *direntry, float **value);
110 : static enum TIFFReadDirEntryErr
111 : TIFFReadDirEntryDoubleArray(TIFF *tif, TIFFDirEntry *direntry, double **value);
112 : static enum TIFFReadDirEntryErr
113 : TIFFReadDirEntryIfd8Array(TIFF *tif, TIFFDirEntry *direntry, uint64_t **value);
114 :
115 : static enum TIFFReadDirEntryErr
116 : TIFFReadDirEntryPersampleShort(TIFF *tif, TIFFDirEntry *direntry,
117 : uint16_t *value);
118 :
119 : static void TIFFReadDirEntryCheckedByte(TIFF *tif, TIFFDirEntry *direntry,
120 : uint8_t *value);
121 : static void TIFFReadDirEntryCheckedSbyte(TIFF *tif, TIFFDirEntry *direntry,
122 : int8_t *value);
123 : static void TIFFReadDirEntryCheckedShort(TIFF *tif, TIFFDirEntry *direntry,
124 : uint16_t *value);
125 : static void TIFFReadDirEntryCheckedSshort(TIFF *tif, TIFFDirEntry *direntry,
126 : int16_t *value);
127 : static void TIFFReadDirEntryCheckedLong(TIFF *tif, TIFFDirEntry *direntry,
128 : uint32_t *value);
129 : static void TIFFReadDirEntryCheckedSlong(TIFF *tif, TIFFDirEntry *direntry,
130 : int32_t *value);
131 : static enum TIFFReadDirEntryErr
132 : TIFFReadDirEntryCheckedLong8(TIFF *tif, TIFFDirEntry *direntry,
133 : uint64_t *value);
134 : static enum TIFFReadDirEntryErr
135 : TIFFReadDirEntryCheckedSlong8(TIFF *tif, TIFFDirEntry *direntry,
136 : int64_t *value);
137 : static enum TIFFReadDirEntryErr
138 : TIFFReadDirEntryCheckedRational(TIFF *tif, TIFFDirEntry *direntry,
139 : double *value);
140 : static enum TIFFReadDirEntryErr
141 : TIFFReadDirEntryCheckedSrational(TIFF *tif, TIFFDirEntry *direntry,
142 : double *value);
143 : static void TIFFReadDirEntryCheckedFloat(TIFF *tif, TIFFDirEntry *direntry,
144 : float *value);
145 : static enum TIFFReadDirEntryErr
146 : TIFFReadDirEntryCheckedDouble(TIFF *tif, TIFFDirEntry *direntry, double *value);
147 : #if 0
148 : static enum TIFFReadDirEntryErr
149 : TIFFReadDirEntryCheckedRationalDirect(TIFF *tif, TIFFDirEntry *direntry,
150 : TIFFRational_t *value);
151 : #endif
152 : static enum TIFFReadDirEntryErr
153 : TIFFReadDirEntryCheckRangeByteSbyte(int8_t value);
154 : static enum TIFFReadDirEntryErr
155 : TIFFReadDirEntryCheckRangeByteShort(uint16_t value);
156 : static enum TIFFReadDirEntryErr
157 : TIFFReadDirEntryCheckRangeByteSshort(int16_t value);
158 : static enum TIFFReadDirEntryErr
159 : TIFFReadDirEntryCheckRangeByteLong(uint32_t value);
160 : static enum TIFFReadDirEntryErr
161 : TIFFReadDirEntryCheckRangeByteSlong(int32_t value);
162 : static enum TIFFReadDirEntryErr
163 : TIFFReadDirEntryCheckRangeByteLong8(uint64_t value);
164 : static enum TIFFReadDirEntryErr
165 : TIFFReadDirEntryCheckRangeByteSlong8(int64_t value);
166 :
167 : static enum TIFFReadDirEntryErr
168 : TIFFReadDirEntryCheckRangeSbyteByte(uint8_t value);
169 : static enum TIFFReadDirEntryErr
170 : TIFFReadDirEntryCheckRangeSbyteShort(uint16_t value);
171 : static enum TIFFReadDirEntryErr
172 : TIFFReadDirEntryCheckRangeSbyteSshort(int16_t value);
173 : static enum TIFFReadDirEntryErr
174 : TIFFReadDirEntryCheckRangeSbyteLong(uint32_t value);
175 : static enum TIFFReadDirEntryErr
176 : TIFFReadDirEntryCheckRangeSbyteSlong(int32_t value);
177 : static enum TIFFReadDirEntryErr
178 : TIFFReadDirEntryCheckRangeSbyteLong8(uint64_t value);
179 : static enum TIFFReadDirEntryErr
180 : TIFFReadDirEntryCheckRangeSbyteSlong8(int64_t value);
181 :
182 : static enum TIFFReadDirEntryErr
183 : TIFFReadDirEntryCheckRangeShortSbyte(int8_t value);
184 : static enum TIFFReadDirEntryErr
185 : TIFFReadDirEntryCheckRangeShortSshort(int16_t value);
186 : static enum TIFFReadDirEntryErr
187 : TIFFReadDirEntryCheckRangeShortLong(uint32_t value);
188 : static enum TIFFReadDirEntryErr
189 : TIFFReadDirEntryCheckRangeShortSlong(int32_t value);
190 : static enum TIFFReadDirEntryErr
191 : TIFFReadDirEntryCheckRangeShortLong8(uint64_t value);
192 : static enum TIFFReadDirEntryErr
193 : TIFFReadDirEntryCheckRangeShortSlong8(int64_t value);
194 :
195 : static enum TIFFReadDirEntryErr
196 : TIFFReadDirEntryCheckRangeSshortShort(uint16_t value);
197 : static enum TIFFReadDirEntryErr
198 : TIFFReadDirEntryCheckRangeSshortLong(uint32_t value);
199 : static enum TIFFReadDirEntryErr
200 : TIFFReadDirEntryCheckRangeSshortSlong(int32_t value);
201 : static enum TIFFReadDirEntryErr
202 : TIFFReadDirEntryCheckRangeSshortLong8(uint64_t value);
203 : static enum TIFFReadDirEntryErr
204 : TIFFReadDirEntryCheckRangeSshortSlong8(int64_t value);
205 :
206 : static enum TIFFReadDirEntryErr
207 : TIFFReadDirEntryCheckRangeLongSbyte(int8_t value);
208 : static enum TIFFReadDirEntryErr
209 : TIFFReadDirEntryCheckRangeLongSshort(int16_t value);
210 : static enum TIFFReadDirEntryErr
211 : TIFFReadDirEntryCheckRangeLongSlong(int32_t value);
212 : static enum TIFFReadDirEntryErr
213 : TIFFReadDirEntryCheckRangeLongLong8(uint64_t value);
214 : static enum TIFFReadDirEntryErr
215 : TIFFReadDirEntryCheckRangeLongSlong8(int64_t value);
216 :
217 : static enum TIFFReadDirEntryErr
218 : TIFFReadDirEntryCheckRangeSlongLong(uint32_t value);
219 : static enum TIFFReadDirEntryErr
220 : TIFFReadDirEntryCheckRangeSlongLong8(uint64_t value);
221 : static enum TIFFReadDirEntryErr
222 : TIFFReadDirEntryCheckRangeSlongSlong8(int64_t value);
223 :
224 : static enum TIFFReadDirEntryErr
225 : TIFFReadDirEntryCheckRangeLong8Sbyte(int8_t value);
226 : static enum TIFFReadDirEntryErr
227 : TIFFReadDirEntryCheckRangeLong8Sshort(int16_t value);
228 : static enum TIFFReadDirEntryErr
229 : TIFFReadDirEntryCheckRangeLong8Slong(int32_t value);
230 : static enum TIFFReadDirEntryErr
231 : TIFFReadDirEntryCheckRangeLong8Slong8(int64_t value);
232 :
233 : static enum TIFFReadDirEntryErr
234 : TIFFReadDirEntryCheckRangeSlong8Long8(uint64_t value);
235 :
236 : static enum TIFFReadDirEntryErr TIFFReadDirEntryData(TIFF *tif, uint64_t offset,
237 : tmsize_t size, void *dest);
238 : static void TIFFReadDirEntryOutputErr(TIFF *tif, enum TIFFReadDirEntryErr err,
239 : const char *module, const char *tagname,
240 : int recover);
241 :
242 : static void TIFFReadDirectoryCheckOrder(TIFF *tif, TIFFDirEntry *dir,
243 : uint16_t dircount);
244 : static TIFFDirEntry *TIFFReadDirectoryFindEntry(TIFF *tif, TIFFDirEntry *dir,
245 : uint16_t dircount,
246 : uint16_t tagid);
247 : static void TIFFReadDirectoryFindFieldInfo(TIFF *tif, uint16_t tagid,
248 : uint32_t *fii);
249 :
250 : static int EstimateStripByteCounts(TIFF *tif, TIFFDirEntry *dir,
251 : uint16_t dircount);
252 : static void MissingRequired(TIFF *, const char *);
253 : static int CheckDirCount(TIFF *, TIFFDirEntry *, uint32_t);
254 : static uint16_t TIFFFetchDirectory(TIFF *tif, uint64_t diroff,
255 : TIFFDirEntry **pdir, uint64_t *nextdiroff);
256 : static int TIFFFetchNormalTag(TIFF *, TIFFDirEntry *, int recover);
257 : static int TIFFFetchStripThing(TIFF *tif, TIFFDirEntry *dir, uint32_t nstrips,
258 : uint64_t **lpp);
259 : static int TIFFFetchSubjectDistance(TIFF *, TIFFDirEntry *);
260 : static void ChopUpSingleUncompressedStrip(TIFF *);
261 : static void TryChopUpUncompressedBigTiff(TIFF *);
262 : static uint64_t TIFFReadUInt64(const uint8_t *value);
263 : static int _TIFFGetMaxColorChannels(uint16_t photometric);
264 :
265 : static int _TIFFFillStrilesInternal(TIFF *tif, int loadStripByteCount);
266 :
267 : typedef union _UInt64Aligned_t
268 : {
269 : double d;
270 : uint64_t l;
271 : uint32_t i[2];
272 : uint16_t s[4];
273 : uint8_t c[8];
274 : } UInt64Aligned_t;
275 :
276 : /*
277 : Unaligned safe copy of a uint64_t value from an octet array.
278 : */
279 24746 : static uint64_t TIFFReadUInt64(const uint8_t *value)
280 : {
281 : UInt64Aligned_t result;
282 :
283 24746 : result.c[0] = value[0];
284 24746 : result.c[1] = value[1];
285 24746 : result.c[2] = value[2];
286 24746 : result.c[3] = value[3];
287 24746 : result.c[4] = value[4];
288 24746 : result.c[5] = value[5];
289 24746 : result.c[6] = value[6];
290 24746 : result.c[7] = value[7];
291 :
292 24746 : return result.l;
293 : }
294 :
295 : static enum TIFFReadDirEntryErr
296 0 : TIFFReadDirEntryByte(TIFF *tif, TIFFDirEntry *direntry, uint8_t *value)
297 : {
298 : enum TIFFReadDirEntryErr err;
299 0 : if (direntry->tdir_count != 1)
300 0 : return (TIFFReadDirEntryErrCount);
301 0 : switch (direntry->tdir_type)
302 : {
303 0 : case TIFF_BYTE:
304 : case TIFF_UNDEFINED: /* Support to read TIFF_UNDEFINED with
305 : field_readcount==1 */
306 0 : TIFFReadDirEntryCheckedByte(tif, direntry, value);
307 0 : return (TIFFReadDirEntryErrOk);
308 0 : case TIFF_SBYTE:
309 : {
310 : int8_t m;
311 0 : TIFFReadDirEntryCheckedSbyte(tif, direntry, &m);
312 0 : err = TIFFReadDirEntryCheckRangeByteSbyte(m);
313 0 : if (err != TIFFReadDirEntryErrOk)
314 0 : return (err);
315 0 : *value = (uint8_t)m;
316 0 : return (TIFFReadDirEntryErrOk);
317 : }
318 0 : case TIFF_SHORT:
319 : {
320 : uint16_t m;
321 0 : TIFFReadDirEntryCheckedShort(tif, direntry, &m);
322 0 : err = TIFFReadDirEntryCheckRangeByteShort(m);
323 0 : if (err != TIFFReadDirEntryErrOk)
324 0 : return (err);
325 0 : *value = (uint8_t)m;
326 0 : return (TIFFReadDirEntryErrOk);
327 : }
328 0 : case TIFF_SSHORT:
329 : {
330 : int16_t m;
331 0 : TIFFReadDirEntryCheckedSshort(tif, direntry, &m);
332 0 : err = TIFFReadDirEntryCheckRangeByteSshort(m);
333 0 : if (err != TIFFReadDirEntryErrOk)
334 0 : return (err);
335 0 : *value = (uint8_t)m;
336 0 : return (TIFFReadDirEntryErrOk);
337 : }
338 0 : case TIFF_LONG:
339 : {
340 : uint32_t m;
341 0 : TIFFReadDirEntryCheckedLong(tif, direntry, &m);
342 0 : err = TIFFReadDirEntryCheckRangeByteLong(m);
343 0 : if (err != TIFFReadDirEntryErrOk)
344 0 : return (err);
345 0 : *value = (uint8_t)m;
346 0 : return (TIFFReadDirEntryErrOk);
347 : }
348 0 : case TIFF_SLONG:
349 : {
350 : int32_t m;
351 0 : TIFFReadDirEntryCheckedSlong(tif, direntry, &m);
352 0 : err = TIFFReadDirEntryCheckRangeByteSlong(m);
353 0 : if (err != TIFFReadDirEntryErrOk)
354 0 : return (err);
355 0 : *value = (uint8_t)m;
356 0 : return (TIFFReadDirEntryErrOk);
357 : }
358 0 : case TIFF_LONG8:
359 : {
360 : uint64_t m;
361 0 : err = TIFFReadDirEntryCheckedLong8(tif, direntry, &m);
362 0 : if (err != TIFFReadDirEntryErrOk)
363 0 : return (err);
364 0 : err = TIFFReadDirEntryCheckRangeByteLong8(m);
365 0 : if (err != TIFFReadDirEntryErrOk)
366 0 : return (err);
367 0 : *value = (uint8_t)m;
368 0 : return (TIFFReadDirEntryErrOk);
369 : }
370 0 : case TIFF_SLONG8:
371 : {
372 : int64_t m;
373 0 : err = TIFFReadDirEntryCheckedSlong8(tif, direntry, &m);
374 0 : if (err != TIFFReadDirEntryErrOk)
375 0 : return (err);
376 0 : err = TIFFReadDirEntryCheckRangeByteSlong8(m);
377 0 : if (err != TIFFReadDirEntryErrOk)
378 0 : return (err);
379 0 : *value = (uint8_t)m;
380 0 : return (TIFFReadDirEntryErrOk);
381 : }
382 0 : default:
383 0 : return (TIFFReadDirEntryErrType);
384 : }
385 : }
386 :
387 : static enum TIFFReadDirEntryErr
388 0 : TIFFReadDirEntrySbyte(TIFF *tif, TIFFDirEntry *direntry, int8_t *value)
389 : {
390 : enum TIFFReadDirEntryErr err;
391 0 : if (direntry->tdir_count != 1)
392 0 : return (TIFFReadDirEntryErrCount);
393 0 : switch (direntry->tdir_type)
394 : {
395 0 : case TIFF_BYTE:
396 : case TIFF_UNDEFINED: /* Support to read TIFF_UNDEFINED with
397 : field_readcount==1 */
398 : {
399 : uint8_t m;
400 0 : TIFFReadDirEntryCheckedByte(tif, direntry, &m);
401 0 : err = TIFFReadDirEntryCheckRangeSbyteByte(m);
402 0 : if (err != TIFFReadDirEntryErrOk)
403 0 : return (err);
404 0 : *value = (int8_t)m;
405 0 : return (TIFFReadDirEntryErrOk);
406 : }
407 0 : case TIFF_SBYTE:
408 : {
409 0 : TIFFReadDirEntryCheckedSbyte(tif, direntry, value);
410 0 : return (TIFFReadDirEntryErrOk);
411 : }
412 0 : case TIFF_SHORT:
413 : {
414 : uint16_t m;
415 0 : TIFFReadDirEntryCheckedShort(tif, direntry, &m);
416 0 : err = TIFFReadDirEntryCheckRangeSbyteShort(m);
417 0 : if (err != TIFFReadDirEntryErrOk)
418 0 : return (err);
419 0 : *value = (int8_t)m;
420 0 : return (TIFFReadDirEntryErrOk);
421 : }
422 0 : case TIFF_SSHORT:
423 : {
424 : int16_t m;
425 0 : TIFFReadDirEntryCheckedSshort(tif, direntry, &m);
426 0 : err = TIFFReadDirEntryCheckRangeSbyteSshort(m);
427 0 : if (err != TIFFReadDirEntryErrOk)
428 0 : return (err);
429 0 : *value = (int8_t)m;
430 0 : return (TIFFReadDirEntryErrOk);
431 : }
432 0 : case TIFF_LONG:
433 : {
434 : uint32_t m;
435 0 : TIFFReadDirEntryCheckedLong(tif, direntry, &m);
436 0 : err = TIFFReadDirEntryCheckRangeSbyteLong(m);
437 0 : if (err != TIFFReadDirEntryErrOk)
438 0 : return (err);
439 0 : *value = (int8_t)m;
440 0 : return (TIFFReadDirEntryErrOk);
441 : }
442 0 : case TIFF_SLONG:
443 : {
444 : int32_t m;
445 0 : TIFFReadDirEntryCheckedSlong(tif, direntry, &m);
446 0 : err = TIFFReadDirEntryCheckRangeSbyteSlong(m);
447 0 : if (err != TIFFReadDirEntryErrOk)
448 0 : return (err);
449 0 : *value = (int8_t)m;
450 0 : return (TIFFReadDirEntryErrOk);
451 : }
452 0 : case TIFF_LONG8:
453 : {
454 : uint64_t m;
455 0 : err = TIFFReadDirEntryCheckedLong8(tif, direntry, &m);
456 0 : if (err != TIFFReadDirEntryErrOk)
457 0 : return (err);
458 0 : err = TIFFReadDirEntryCheckRangeSbyteLong8(m);
459 0 : if (err != TIFFReadDirEntryErrOk)
460 0 : return (err);
461 0 : *value = (int8_t)m;
462 0 : return (TIFFReadDirEntryErrOk);
463 : }
464 0 : case TIFF_SLONG8:
465 : {
466 : int64_t m;
467 0 : err = TIFFReadDirEntryCheckedSlong8(tif, direntry, &m);
468 0 : if (err != TIFFReadDirEntryErrOk)
469 0 : return (err);
470 0 : err = TIFFReadDirEntryCheckRangeSbyteSlong8(m);
471 0 : if (err != TIFFReadDirEntryErrOk)
472 0 : return (err);
473 0 : *value = (int8_t)m;
474 0 : return (TIFFReadDirEntryErrOk);
475 : }
476 0 : default:
477 0 : return (TIFFReadDirEntryErrType);
478 : }
479 : } /*-- TIFFReadDirEntrySbyte() --*/
480 :
481 : static enum TIFFReadDirEntryErr
482 266800 : TIFFReadDirEntryShort(TIFF *tif, TIFFDirEntry *direntry, uint16_t *value)
483 : {
484 : enum TIFFReadDirEntryErr err;
485 266800 : if (direntry->tdir_count != 1)
486 28022 : return (TIFFReadDirEntryErrCount);
487 238778 : switch (direntry->tdir_type)
488 : {
489 0 : case TIFF_BYTE:
490 : {
491 : uint8_t m;
492 0 : TIFFReadDirEntryCheckedByte(tif, direntry, &m);
493 0 : *value = (uint16_t)m;
494 0 : return (TIFFReadDirEntryErrOk);
495 : }
496 0 : case TIFF_SBYTE:
497 : {
498 : int8_t m;
499 0 : TIFFReadDirEntryCheckedSbyte(tif, direntry, &m);
500 0 : err = TIFFReadDirEntryCheckRangeShortSbyte(m);
501 0 : if (err != TIFFReadDirEntryErrOk)
502 0 : return (err);
503 0 : *value = (uint16_t)m;
504 0 : return (TIFFReadDirEntryErrOk);
505 : }
506 238675 : case TIFF_SHORT:
507 238675 : TIFFReadDirEntryCheckedShort(tif, direntry, value);
508 238644 : return (TIFFReadDirEntryErrOk);
509 0 : case TIFF_SSHORT:
510 : {
511 : int16_t m;
512 0 : TIFFReadDirEntryCheckedSshort(tif, direntry, &m);
513 0 : err = TIFFReadDirEntryCheckRangeShortSshort(m);
514 0 : if (err != TIFFReadDirEntryErrOk)
515 0 : return (err);
516 0 : *value = (uint16_t)m;
517 0 : return (TIFFReadDirEntryErrOk);
518 : }
519 1 : case TIFF_LONG:
520 : {
521 : uint32_t m;
522 1 : TIFFReadDirEntryCheckedLong(tif, direntry, &m);
523 1 : err = TIFFReadDirEntryCheckRangeShortLong(m);
524 1 : if (err != TIFFReadDirEntryErrOk)
525 0 : return (err);
526 1 : *value = (uint16_t)m;
527 1 : return (TIFFReadDirEntryErrOk);
528 : }
529 0 : case TIFF_SLONG:
530 : {
531 : int32_t m;
532 0 : TIFFReadDirEntryCheckedSlong(tif, direntry, &m);
533 0 : err = TIFFReadDirEntryCheckRangeShortSlong(m);
534 0 : if (err != TIFFReadDirEntryErrOk)
535 0 : return (err);
536 0 : *value = (uint16_t)m;
537 0 : return (TIFFReadDirEntryErrOk);
538 : }
539 0 : case TIFF_LONG8:
540 : {
541 : uint64_t m;
542 0 : err = TIFFReadDirEntryCheckedLong8(tif, direntry, &m);
543 0 : if (err != TIFFReadDirEntryErrOk)
544 0 : return (err);
545 0 : err = TIFFReadDirEntryCheckRangeShortLong8(m);
546 0 : if (err != TIFFReadDirEntryErrOk)
547 0 : return (err);
548 0 : *value = (uint16_t)m;
549 0 : return (TIFFReadDirEntryErrOk);
550 : }
551 0 : case TIFF_SLONG8:
552 : {
553 : int64_t m;
554 0 : err = TIFFReadDirEntryCheckedSlong8(tif, direntry, &m);
555 0 : if (err != TIFFReadDirEntryErrOk)
556 0 : return (err);
557 0 : err = TIFFReadDirEntryCheckRangeShortSlong8(m);
558 0 : if (err != TIFFReadDirEntryErrOk)
559 0 : return (err);
560 0 : *value = (uint16_t)m;
561 0 : return (TIFFReadDirEntryErrOk);
562 : }
563 102 : default:
564 102 : return (TIFFReadDirEntryErrType);
565 : }
566 : } /*-- TIFFReadDirEntryShort() --*/
567 :
568 : static enum TIFFReadDirEntryErr
569 0 : TIFFReadDirEntrySshort(TIFF *tif, TIFFDirEntry *direntry, int16_t *value)
570 : {
571 : enum TIFFReadDirEntryErr err;
572 0 : if (direntry->tdir_count != 1)
573 0 : return (TIFFReadDirEntryErrCount);
574 0 : switch (direntry->tdir_type)
575 : {
576 0 : case TIFF_BYTE:
577 : {
578 : uint8_t m;
579 0 : TIFFReadDirEntryCheckedByte(tif, direntry, &m);
580 0 : *value = (int16_t)m;
581 0 : return (TIFFReadDirEntryErrOk);
582 : }
583 0 : case TIFF_SBYTE:
584 : {
585 : int8_t m;
586 0 : TIFFReadDirEntryCheckedSbyte(tif, direntry, &m);
587 0 : *value = (int16_t)m;
588 0 : return (TIFFReadDirEntryErrOk);
589 : }
590 0 : case TIFF_SHORT:
591 : {
592 : uint16_t m;
593 0 : TIFFReadDirEntryCheckedShort(tif, direntry, &m);
594 0 : err = TIFFReadDirEntryCheckRangeSshortShort(m);
595 0 : if (err != TIFFReadDirEntryErrOk)
596 0 : return (err);
597 0 : *value = (uint16_t)m;
598 0 : return (TIFFReadDirEntryErrOk);
599 : }
600 0 : case TIFF_SSHORT:
601 0 : TIFFReadDirEntryCheckedSshort(tif, direntry, value);
602 0 : return (TIFFReadDirEntryErrOk);
603 0 : case TIFF_LONG:
604 : {
605 : uint32_t m;
606 0 : TIFFReadDirEntryCheckedLong(tif, direntry, &m);
607 0 : err = TIFFReadDirEntryCheckRangeSshortLong(m);
608 0 : if (err != TIFFReadDirEntryErrOk)
609 0 : return (err);
610 0 : *value = (int16_t)m;
611 0 : return (TIFFReadDirEntryErrOk);
612 : }
613 0 : case TIFF_SLONG:
614 : {
615 : int32_t m;
616 0 : TIFFReadDirEntryCheckedSlong(tif, direntry, &m);
617 0 : err = TIFFReadDirEntryCheckRangeSshortSlong(m);
618 0 : if (err != TIFFReadDirEntryErrOk)
619 0 : return (err);
620 0 : *value = (int16_t)m;
621 0 : return (TIFFReadDirEntryErrOk);
622 : }
623 0 : case TIFF_LONG8:
624 : {
625 : uint64_t m;
626 0 : err = TIFFReadDirEntryCheckedLong8(tif, direntry, &m);
627 0 : if (err != TIFFReadDirEntryErrOk)
628 0 : return (err);
629 0 : err = TIFFReadDirEntryCheckRangeSshortLong8(m);
630 0 : if (err != TIFFReadDirEntryErrOk)
631 0 : return (err);
632 0 : *value = (int16_t)m;
633 0 : return (TIFFReadDirEntryErrOk);
634 : }
635 0 : case TIFF_SLONG8:
636 : {
637 : int64_t m;
638 0 : err = TIFFReadDirEntryCheckedSlong8(tif, direntry, &m);
639 0 : if (err != TIFFReadDirEntryErrOk)
640 0 : return (err);
641 0 : err = TIFFReadDirEntryCheckRangeSshortSlong8(m);
642 0 : if (err != TIFFReadDirEntryErrOk)
643 0 : return (err);
644 0 : *value = (int16_t)m;
645 0 : return (TIFFReadDirEntryErrOk);
646 : }
647 0 : default:
648 0 : return (TIFFReadDirEntryErrType);
649 : }
650 : } /*-- TIFFReadDirEntrySshort() --*/
651 :
652 : static enum TIFFReadDirEntryErr
653 144684 : TIFFReadDirEntryLong(TIFF *tif, TIFFDirEntry *direntry, uint32_t *value)
654 : {
655 : enum TIFFReadDirEntryErr err;
656 144684 : if (direntry->tdir_count != 1)
657 0 : return (TIFFReadDirEntryErrCount);
658 144684 : switch (direntry->tdir_type)
659 : {
660 0 : case TIFF_BYTE:
661 : {
662 : uint8_t m;
663 0 : TIFFReadDirEntryCheckedByte(tif, direntry, &m);
664 0 : *value = (uint32_t)m;
665 0 : return (TIFFReadDirEntryErrOk);
666 : }
667 0 : case TIFF_SBYTE:
668 : {
669 : int8_t m;
670 0 : TIFFReadDirEntryCheckedSbyte(tif, direntry, &m);
671 0 : err = TIFFReadDirEntryCheckRangeLongSbyte(m);
672 0 : if (err != TIFFReadDirEntryErrOk)
673 0 : return (err);
674 0 : *value = (uint32_t)m;
675 0 : return (TIFFReadDirEntryErrOk);
676 : }
677 139306 : case TIFF_SHORT:
678 : {
679 : uint16_t m;
680 139306 : TIFFReadDirEntryCheckedShort(tif, direntry, &m);
681 139275 : *value = (uint32_t)m;
682 139275 : return (TIFFReadDirEntryErrOk);
683 : }
684 0 : case TIFF_SSHORT:
685 : {
686 : int16_t m;
687 0 : TIFFReadDirEntryCheckedSshort(tif, direntry, &m);
688 0 : err = TIFFReadDirEntryCheckRangeLongSshort(m);
689 0 : if (err != TIFFReadDirEntryErrOk)
690 0 : return (err);
691 0 : *value = (uint32_t)m;
692 0 : return (TIFFReadDirEntryErrOk);
693 : }
694 5349 : case TIFF_LONG:
695 5349 : TIFFReadDirEntryCheckedLong(tif, direntry, value);
696 5349 : return (TIFFReadDirEntryErrOk);
697 0 : case TIFF_SLONG:
698 : {
699 : int32_t m;
700 0 : TIFFReadDirEntryCheckedSlong(tif, direntry, &m);
701 0 : err = TIFFReadDirEntryCheckRangeLongSlong(m);
702 0 : if (err != TIFFReadDirEntryErrOk)
703 0 : return (err);
704 0 : *value = (uint32_t)m;
705 0 : return (TIFFReadDirEntryErrOk);
706 : }
707 0 : case TIFF_LONG8:
708 : {
709 : uint64_t m;
710 0 : err = TIFFReadDirEntryCheckedLong8(tif, direntry, &m);
711 0 : if (err != TIFFReadDirEntryErrOk)
712 0 : return (err);
713 0 : err = TIFFReadDirEntryCheckRangeLongLong8(m);
714 0 : if (err != TIFFReadDirEntryErrOk)
715 0 : return (err);
716 0 : *value = (uint32_t)m;
717 0 : return (TIFFReadDirEntryErrOk);
718 : }
719 0 : case TIFF_SLONG8:
720 : {
721 : int64_t m;
722 0 : err = TIFFReadDirEntryCheckedSlong8(tif, direntry, &m);
723 0 : if (err != TIFFReadDirEntryErrOk)
724 0 : return (err);
725 0 : err = TIFFReadDirEntryCheckRangeLongSlong8(m);
726 0 : if (err != TIFFReadDirEntryErrOk)
727 0 : return (err);
728 0 : *value = (uint32_t)m;
729 0 : return (TIFFReadDirEntryErrOk);
730 : }
731 29 : default:
732 29 : return (TIFFReadDirEntryErrType);
733 : }
734 : } /*-- TIFFReadDirEntryLong() --*/
735 :
736 : static enum TIFFReadDirEntryErr
737 0 : TIFFReadDirEntrySlong(TIFF *tif, TIFFDirEntry *direntry, int32_t *value)
738 : {
739 : enum TIFFReadDirEntryErr err;
740 0 : if (direntry->tdir_count != 1)
741 0 : return (TIFFReadDirEntryErrCount);
742 0 : switch (direntry->tdir_type)
743 : {
744 0 : case TIFF_BYTE:
745 : {
746 : uint8_t m;
747 0 : TIFFReadDirEntryCheckedByte(tif, direntry, &m);
748 0 : *value = (int32_t)m;
749 0 : return (TIFFReadDirEntryErrOk);
750 : }
751 0 : case TIFF_SBYTE:
752 : {
753 : int8_t m;
754 0 : TIFFReadDirEntryCheckedSbyte(tif, direntry, &m);
755 0 : *value = (int32_t)m;
756 0 : return (TIFFReadDirEntryErrOk);
757 : }
758 0 : case TIFF_SHORT:
759 : {
760 : uint16_t m;
761 0 : TIFFReadDirEntryCheckedShort(tif, direntry, &m);
762 0 : *value = (int32_t)m;
763 0 : return (TIFFReadDirEntryErrOk);
764 : }
765 0 : case TIFF_SSHORT:
766 : {
767 : int16_t m;
768 0 : TIFFReadDirEntryCheckedSshort(tif, direntry, &m);
769 0 : *value = (int32_t)m;
770 0 : return (TIFFReadDirEntryErrOk);
771 : }
772 0 : case TIFF_LONG:
773 : {
774 : uint32_t m;
775 0 : TIFFReadDirEntryCheckedLong(tif, direntry, &m);
776 0 : err = TIFFReadDirEntryCheckRangeSlongLong(m);
777 0 : if (err != TIFFReadDirEntryErrOk)
778 0 : return (err);
779 0 : *value = (int32_t)m;
780 0 : return (TIFFReadDirEntryErrOk);
781 : }
782 0 : case TIFF_SLONG:
783 0 : TIFFReadDirEntryCheckedSlong(tif, direntry, value);
784 0 : return (TIFFReadDirEntryErrOk);
785 0 : case TIFF_LONG8:
786 : {
787 : uint64_t m;
788 0 : err = TIFFReadDirEntryCheckedLong8(tif, direntry, &m);
789 0 : if (err != TIFFReadDirEntryErrOk)
790 0 : return (err);
791 0 : err = TIFFReadDirEntryCheckRangeSlongLong8(m);
792 0 : if (err != TIFFReadDirEntryErrOk)
793 0 : return (err);
794 0 : *value = (int32_t)m;
795 0 : return (TIFFReadDirEntryErrOk);
796 : }
797 0 : case TIFF_SLONG8:
798 : {
799 : int64_t m;
800 0 : err = TIFFReadDirEntryCheckedSlong8(tif, direntry, &m);
801 0 : if (err != TIFFReadDirEntryErrOk)
802 0 : return (err);
803 0 : err = TIFFReadDirEntryCheckRangeSlongSlong8(m);
804 0 : if (err != TIFFReadDirEntryErrOk)
805 0 : return (err);
806 0 : *value = (int32_t)m;
807 0 : return (TIFFReadDirEntryErrOk);
808 : }
809 0 : default:
810 0 : return (TIFFReadDirEntryErrType);
811 : }
812 : } /*-- TIFFReadDirEntrySlong() --*/
813 :
814 : static enum TIFFReadDirEntryErr
815 0 : TIFFReadDirEntryLong8(TIFF *tif, TIFFDirEntry *direntry, uint64_t *value)
816 : {
817 : enum TIFFReadDirEntryErr err;
818 0 : if (direntry->tdir_count != 1)
819 0 : return (TIFFReadDirEntryErrCount);
820 0 : switch (direntry->tdir_type)
821 : {
822 0 : case TIFF_BYTE:
823 : {
824 : uint8_t m;
825 0 : TIFFReadDirEntryCheckedByte(tif, direntry, &m);
826 0 : *value = (uint64_t)m;
827 0 : return (TIFFReadDirEntryErrOk);
828 : }
829 0 : case TIFF_SBYTE:
830 : {
831 : int8_t m;
832 0 : TIFFReadDirEntryCheckedSbyte(tif, direntry, &m);
833 0 : err = TIFFReadDirEntryCheckRangeLong8Sbyte(m);
834 0 : if (err != TIFFReadDirEntryErrOk)
835 0 : return (err);
836 0 : *value = (uint64_t)m;
837 0 : return (TIFFReadDirEntryErrOk);
838 : }
839 0 : case TIFF_SHORT:
840 : {
841 : uint16_t m;
842 0 : TIFFReadDirEntryCheckedShort(tif, direntry, &m);
843 0 : *value = (uint64_t)m;
844 0 : return (TIFFReadDirEntryErrOk);
845 : }
846 0 : case TIFF_SSHORT:
847 : {
848 : int16_t m;
849 0 : TIFFReadDirEntryCheckedSshort(tif, direntry, &m);
850 0 : err = TIFFReadDirEntryCheckRangeLong8Sshort(m);
851 0 : if (err != TIFFReadDirEntryErrOk)
852 0 : return (err);
853 0 : *value = (uint64_t)m;
854 0 : return (TIFFReadDirEntryErrOk);
855 : }
856 0 : case TIFF_LONG:
857 : {
858 : uint32_t m;
859 0 : TIFFReadDirEntryCheckedLong(tif, direntry, &m);
860 0 : *value = (uint64_t)m;
861 0 : return (TIFFReadDirEntryErrOk);
862 : }
863 0 : case TIFF_SLONG:
864 : {
865 : int32_t m;
866 0 : TIFFReadDirEntryCheckedSlong(tif, direntry, &m);
867 0 : err = TIFFReadDirEntryCheckRangeLong8Slong(m);
868 0 : if (err != TIFFReadDirEntryErrOk)
869 0 : return (err);
870 0 : *value = (uint64_t)m;
871 0 : return (TIFFReadDirEntryErrOk);
872 : }
873 0 : case TIFF_LONG8:
874 0 : err = TIFFReadDirEntryCheckedLong8(tif, direntry, value);
875 0 : return (err);
876 0 : case TIFF_SLONG8:
877 : {
878 : int64_t m;
879 0 : err = TIFFReadDirEntryCheckedSlong8(tif, direntry, &m);
880 0 : if (err != TIFFReadDirEntryErrOk)
881 0 : return (err);
882 0 : err = TIFFReadDirEntryCheckRangeLong8Slong8(m);
883 0 : if (err != TIFFReadDirEntryErrOk)
884 0 : return (err);
885 0 : *value = (uint64_t)m;
886 0 : return (TIFFReadDirEntryErrOk);
887 : }
888 0 : default:
889 0 : return (TIFFReadDirEntryErrType);
890 : }
891 : } /*-- TIFFReadDirEntryLong8() --*/
892 :
893 : static enum TIFFReadDirEntryErr
894 0 : TIFFReadDirEntrySlong8(TIFF *tif, TIFFDirEntry *direntry, int64_t *value)
895 : {
896 : enum TIFFReadDirEntryErr err;
897 0 : if (direntry->tdir_count != 1)
898 0 : return (TIFFReadDirEntryErrCount);
899 0 : switch (direntry->tdir_type)
900 : {
901 0 : case TIFF_BYTE:
902 : {
903 : uint8_t m;
904 0 : TIFFReadDirEntryCheckedByte(tif, direntry, &m);
905 0 : *value = (int64_t)m;
906 0 : return (TIFFReadDirEntryErrOk);
907 : }
908 0 : case TIFF_SBYTE:
909 : {
910 : int8_t m;
911 0 : TIFFReadDirEntryCheckedSbyte(tif, direntry, &m);
912 0 : *value = (int64_t)m;
913 0 : return (TIFFReadDirEntryErrOk);
914 : }
915 0 : case TIFF_SHORT:
916 : {
917 : uint16_t m;
918 0 : TIFFReadDirEntryCheckedShort(tif, direntry, &m);
919 0 : *value = (int64_t)m;
920 0 : return (TIFFReadDirEntryErrOk);
921 : }
922 0 : case TIFF_SSHORT:
923 : {
924 : int16_t m;
925 0 : TIFFReadDirEntryCheckedSshort(tif, direntry, &m);
926 0 : *value = (int64_t)m;
927 0 : return (TIFFReadDirEntryErrOk);
928 : }
929 0 : case TIFF_LONG:
930 : {
931 : uint32_t m;
932 0 : TIFFReadDirEntryCheckedLong(tif, direntry, &m);
933 0 : *value = (int64_t)m;
934 0 : return (TIFFReadDirEntryErrOk);
935 : }
936 0 : case TIFF_SLONG:
937 : {
938 : int32_t m;
939 0 : TIFFReadDirEntryCheckedSlong(tif, direntry, &m);
940 0 : *value = (int64_t)m;
941 0 : return (TIFFReadDirEntryErrOk);
942 : }
943 0 : case TIFF_LONG8:
944 : {
945 : uint64_t m;
946 0 : err = TIFFReadDirEntryCheckedLong8(tif, direntry, &m);
947 0 : if (err != TIFFReadDirEntryErrOk)
948 0 : return (err);
949 0 : err = TIFFReadDirEntryCheckRangeSlong8Long8(m);
950 0 : if (err != TIFFReadDirEntryErrOk)
951 0 : return (err);
952 0 : *value = (int64_t)m;
953 0 : return (TIFFReadDirEntryErrOk);
954 : }
955 0 : case TIFF_SLONG8:
956 0 : err = TIFFReadDirEntryCheckedSlong8(tif, direntry, value);
957 0 : return (err);
958 0 : default:
959 0 : return (TIFFReadDirEntryErrType);
960 : }
961 : } /*-- TIFFReadDirEntrySlong8() --*/
962 :
963 : static enum TIFFReadDirEntryErr
964 246 : TIFFReadDirEntryFloat(TIFF *tif, TIFFDirEntry *direntry, float *value)
965 : {
966 : enum TIFFReadDirEntryErr err;
967 246 : if (direntry->tdir_count != 1)
968 0 : return (TIFFReadDirEntryErrCount);
969 246 : switch (direntry->tdir_type)
970 : {
971 0 : case TIFF_BYTE:
972 : {
973 : uint8_t m;
974 0 : TIFFReadDirEntryCheckedByte(tif, direntry, &m);
975 0 : *value = (float)m;
976 0 : return (TIFFReadDirEntryErrOk);
977 : }
978 0 : case TIFF_SBYTE:
979 : {
980 : int8_t m;
981 0 : TIFFReadDirEntryCheckedSbyte(tif, direntry, &m);
982 0 : *value = (float)m;
983 0 : return (TIFFReadDirEntryErrOk);
984 : }
985 0 : case TIFF_SHORT:
986 : {
987 : uint16_t m;
988 0 : TIFFReadDirEntryCheckedShort(tif, direntry, &m);
989 0 : *value = (float)m;
990 0 : return (TIFFReadDirEntryErrOk);
991 : }
992 0 : case TIFF_SSHORT:
993 : {
994 : int16_t m;
995 0 : TIFFReadDirEntryCheckedSshort(tif, direntry, &m);
996 0 : *value = (float)m;
997 0 : return (TIFFReadDirEntryErrOk);
998 : }
999 0 : case TIFF_LONG:
1000 : {
1001 : uint32_t m;
1002 0 : TIFFReadDirEntryCheckedLong(tif, direntry, &m);
1003 0 : *value = (float)m;
1004 0 : return (TIFFReadDirEntryErrOk);
1005 : }
1006 0 : case TIFF_SLONG:
1007 : {
1008 : int32_t m;
1009 0 : TIFFReadDirEntryCheckedSlong(tif, direntry, &m);
1010 0 : *value = (float)m;
1011 0 : return (TIFFReadDirEntryErrOk);
1012 : }
1013 0 : case TIFF_LONG8:
1014 : {
1015 : uint64_t m;
1016 0 : err = TIFFReadDirEntryCheckedLong8(tif, direntry, &m);
1017 0 : if (err != TIFFReadDirEntryErrOk)
1018 0 : return (err);
1019 0 : *value = (float)m;
1020 0 : return (TIFFReadDirEntryErrOk);
1021 : }
1022 0 : case TIFF_SLONG8:
1023 : {
1024 : int64_t m;
1025 0 : err = TIFFReadDirEntryCheckedSlong8(tif, direntry, &m);
1026 0 : if (err != TIFFReadDirEntryErrOk)
1027 0 : return (err);
1028 0 : *value = (float)m;
1029 0 : return (TIFFReadDirEntryErrOk);
1030 : }
1031 246 : case TIFF_RATIONAL:
1032 : {
1033 : double m;
1034 246 : err = TIFFReadDirEntryCheckedRational(tif, direntry, &m);
1035 246 : if (err != TIFFReadDirEntryErrOk)
1036 0 : return (err);
1037 246 : *value = (float)m;
1038 246 : return (TIFFReadDirEntryErrOk);
1039 : }
1040 0 : case TIFF_SRATIONAL:
1041 : {
1042 : double m;
1043 0 : err = TIFFReadDirEntryCheckedSrational(tif, direntry, &m);
1044 0 : if (err != TIFFReadDirEntryErrOk)
1045 0 : return (err);
1046 0 : *value = (float)m;
1047 0 : return (TIFFReadDirEntryErrOk);
1048 : }
1049 0 : case TIFF_FLOAT:
1050 0 : TIFFReadDirEntryCheckedFloat(tif, direntry, value);
1051 0 : return (TIFFReadDirEntryErrOk);
1052 0 : case TIFF_DOUBLE:
1053 : {
1054 : double m;
1055 0 : err = TIFFReadDirEntryCheckedDouble(tif, direntry, &m);
1056 0 : if (err != TIFFReadDirEntryErrOk)
1057 0 : return (err);
1058 0 : if ((m > FLT_MAX) || (m < -FLT_MAX))
1059 0 : return (TIFFReadDirEntryErrRange);
1060 0 : *value = (float)m;
1061 0 : return (TIFFReadDirEntryErrOk);
1062 : }
1063 0 : default:
1064 0 : return (TIFFReadDirEntryErrType);
1065 : }
1066 : }
1067 :
1068 : static enum TIFFReadDirEntryErr
1069 0 : TIFFReadDirEntryDouble(TIFF *tif, TIFFDirEntry *direntry, double *value)
1070 : {
1071 : enum TIFFReadDirEntryErr err;
1072 0 : if (direntry->tdir_count != 1)
1073 0 : return (TIFFReadDirEntryErrCount);
1074 0 : switch (direntry->tdir_type)
1075 : {
1076 0 : case TIFF_BYTE:
1077 : {
1078 : uint8_t m;
1079 0 : TIFFReadDirEntryCheckedByte(tif, direntry, &m);
1080 0 : *value = (double)m;
1081 0 : return (TIFFReadDirEntryErrOk);
1082 : }
1083 0 : case TIFF_SBYTE:
1084 : {
1085 : int8_t m;
1086 0 : TIFFReadDirEntryCheckedSbyte(tif, direntry, &m);
1087 0 : *value = (double)m;
1088 0 : return (TIFFReadDirEntryErrOk);
1089 : }
1090 0 : case TIFF_SHORT:
1091 : {
1092 : uint16_t m;
1093 0 : TIFFReadDirEntryCheckedShort(tif, direntry, &m);
1094 0 : *value = (double)m;
1095 0 : return (TIFFReadDirEntryErrOk);
1096 : }
1097 0 : case TIFF_SSHORT:
1098 : {
1099 : int16_t m;
1100 0 : TIFFReadDirEntryCheckedSshort(tif, direntry, &m);
1101 0 : *value = (double)m;
1102 0 : return (TIFFReadDirEntryErrOk);
1103 : }
1104 0 : case TIFF_LONG:
1105 : {
1106 : uint32_t m;
1107 0 : TIFFReadDirEntryCheckedLong(tif, direntry, &m);
1108 0 : *value = (double)m;
1109 0 : return (TIFFReadDirEntryErrOk);
1110 : }
1111 0 : case TIFF_SLONG:
1112 : {
1113 : int32_t m;
1114 0 : TIFFReadDirEntryCheckedSlong(tif, direntry, &m);
1115 0 : *value = (double)m;
1116 0 : return (TIFFReadDirEntryErrOk);
1117 : }
1118 0 : case TIFF_LONG8:
1119 : {
1120 : uint64_t m;
1121 0 : err = TIFFReadDirEntryCheckedLong8(tif, direntry, &m);
1122 0 : if (err != TIFFReadDirEntryErrOk)
1123 0 : return (err);
1124 0 : *value = (double)m;
1125 0 : return (TIFFReadDirEntryErrOk);
1126 : }
1127 0 : case TIFF_SLONG8:
1128 : {
1129 : int64_t m;
1130 0 : err = TIFFReadDirEntryCheckedSlong8(tif, direntry, &m);
1131 0 : if (err != TIFFReadDirEntryErrOk)
1132 0 : return (err);
1133 0 : *value = (double)m;
1134 0 : return (TIFFReadDirEntryErrOk);
1135 : }
1136 0 : case TIFF_RATIONAL:
1137 0 : err = TIFFReadDirEntryCheckedRational(tif, direntry, value);
1138 0 : return (err);
1139 0 : case TIFF_SRATIONAL:
1140 0 : err = TIFFReadDirEntryCheckedSrational(tif, direntry, value);
1141 0 : return (err);
1142 0 : case TIFF_FLOAT:
1143 : {
1144 : float m;
1145 0 : TIFFReadDirEntryCheckedFloat(tif, direntry, &m);
1146 0 : *value = (double)m;
1147 0 : return (TIFFReadDirEntryErrOk);
1148 : }
1149 0 : case TIFF_DOUBLE:
1150 0 : err = TIFFReadDirEntryCheckedDouble(tif, direntry, value);
1151 0 : return (err);
1152 0 : default:
1153 0 : return (TIFFReadDirEntryErrType);
1154 : }
1155 : }
1156 :
1157 : static enum TIFFReadDirEntryErr
1158 8 : TIFFReadDirEntryIfd8(TIFF *tif, TIFFDirEntry *direntry, uint64_t *value)
1159 : {
1160 : enum TIFFReadDirEntryErr err;
1161 8 : if (direntry->tdir_count != 1)
1162 0 : return (TIFFReadDirEntryErrCount);
1163 8 : switch (direntry->tdir_type)
1164 : {
1165 8 : case TIFF_LONG:
1166 : case TIFF_IFD:
1167 : {
1168 : uint32_t m;
1169 8 : TIFFReadDirEntryCheckedLong(tif, direntry, &m);
1170 8 : *value = (uint64_t)m;
1171 8 : return (TIFFReadDirEntryErrOk);
1172 : }
1173 0 : case TIFF_LONG8:
1174 : case TIFF_IFD8:
1175 0 : err = TIFFReadDirEntryCheckedLong8(tif, direntry, value);
1176 0 : return (err);
1177 0 : default:
1178 0 : return (TIFFReadDirEntryErrType);
1179 : }
1180 : }
1181 :
1182 : #define INITIAL_THRESHOLD (1024 * 1024)
1183 : #define THRESHOLD_MULTIPLIER 10
1184 : #define MAX_THRESHOLD \
1185 : (THRESHOLD_MULTIPLIER * THRESHOLD_MULTIPLIER * THRESHOLD_MULTIPLIER * \
1186 : INITIAL_THRESHOLD)
1187 :
1188 158163 : static enum TIFFReadDirEntryErr TIFFReadDirEntryDataAndRealloc(TIFF *tif,
1189 : uint64_t offset,
1190 : tmsize_t size,
1191 : void **pdest)
1192 : {
1193 : #if SIZEOF_SIZE_T == 8
1194 158163 : tmsize_t threshold = INITIAL_THRESHOLD;
1195 : #endif
1196 158163 : tmsize_t already_read = 0;
1197 :
1198 158163 : assert(!isMapped(tif));
1199 :
1200 158163 : if (!SeekOK(tif, offset))
1201 0 : return (TIFFReadDirEntryErrIo);
1202 :
1203 : /* On 64 bit processes, read first a maximum of 1 MB, then 10 MB, etc */
1204 : /* so as to avoid allocating too much memory in case the file is too */
1205 : /* short. We could ask for the file size, but this might be */
1206 : /* expensive with some I/O layers (think of reading a gzipped file) */
1207 : /* Restrict to 64 bit processes, so as to avoid reallocs() */
1208 : /* on 32 bit processes where virtual memory is scarce. */
1209 316430 : while (already_read < size)
1210 : {
1211 : void *new_dest;
1212 : tmsize_t bytes_read;
1213 158200 : tmsize_t to_read = size - already_read;
1214 : #if SIZEOF_SIZE_T == 8
1215 158200 : if (to_read >= threshold && threshold < MAX_THRESHOLD)
1216 : {
1217 18 : to_read = threshold;
1218 18 : threshold *= THRESHOLD_MULTIPLIER;
1219 : }
1220 : #endif
1221 :
1222 : new_dest =
1223 158200 : (uint8_t *)_TIFFreallocExt(tif, *pdest, already_read + to_read);
1224 158233 : if (new_dest == NULL)
1225 : {
1226 0 : TIFFErrorExtR(tif, tif->tif_name,
1227 : "Failed to allocate memory for %s "
1228 : "(%" TIFF_SSIZE_FORMAT
1229 : " elements of %" TIFF_SSIZE_FORMAT " bytes each)",
1230 : "TIFFReadDirEntryArray", (tmsize_t)1,
1231 : already_read + to_read);
1232 0 : return TIFFReadDirEntryErrAlloc;
1233 : }
1234 158233 : *pdest = new_dest;
1235 :
1236 158233 : bytes_read = TIFFReadFile(tif, (char *)*pdest + already_read, to_read);
1237 158244 : already_read += bytes_read;
1238 158244 : if (bytes_read != to_read)
1239 : {
1240 10 : return TIFFReadDirEntryErrIo;
1241 : }
1242 : }
1243 158230 : return TIFFReadDirEntryErrOk;
1244 : }
1245 :
1246 : /* Caution: if raising that value, make sure int32 / uint32 overflows can't
1247 : * occur elsewhere */
1248 : #define MAX_SIZE_TAG_DATA 2147483647U
1249 :
1250 : static enum TIFFReadDirEntryErr
1251 224562 : TIFFReadDirEntryArrayWithLimit(TIFF *tif, TIFFDirEntry *direntry,
1252 : uint32_t *count, uint32_t desttypesize,
1253 : void **value, uint64_t maxcount)
1254 : {
1255 : int typesize;
1256 : uint32_t datasize;
1257 : void *data;
1258 : uint64_t target_count64;
1259 : int original_datasize_clamped;
1260 224562 : typesize = TIFFDataWidth(direntry->tdir_type);
1261 :
1262 224417 : target_count64 =
1263 224417 : (direntry->tdir_count > maxcount) ? maxcount : direntry->tdir_count;
1264 :
1265 224417 : if ((target_count64 == 0) || (typesize == 0))
1266 : {
1267 15 : *value = 0;
1268 15 : return (TIFFReadDirEntryErrOk);
1269 : }
1270 : (void)desttypesize;
1271 :
1272 : /* We just want to know if the original tag size is more than 4 bytes
1273 : * (classic TIFF) or 8 bytes (BigTIFF)
1274 : */
1275 224402 : original_datasize_clamped =
1276 224402 : ((direntry->tdir_count > 10) ? 10 : (int)direntry->tdir_count) *
1277 : typesize;
1278 :
1279 : /*
1280 : * As a sanity check, make sure we have no more than a 2GB tag array
1281 : * in either the current data type or the dest data type. This also
1282 : * avoids problems with overflow of tmsize_t on 32bit systems.
1283 : */
1284 224402 : if ((uint64_t)(MAX_SIZE_TAG_DATA / typesize) < target_count64)
1285 0 : return (TIFFReadDirEntryErrSizesan);
1286 224402 : if ((uint64_t)(MAX_SIZE_TAG_DATA / desttypesize) < target_count64)
1287 0 : return (TIFFReadDirEntryErrSizesan);
1288 :
1289 224402 : *count = (uint32_t)target_count64;
1290 224402 : datasize = (*count) * typesize;
1291 224402 : assert((tmsize_t)datasize > 0);
1292 :
1293 224402 : if (datasize > 100 * 1024 * 1024)
1294 : {
1295 : /* Before allocating a huge amount of memory for corrupted files, check
1296 : * if size of requested memory is not greater than file size.
1297 : */
1298 0 : const uint64_t filesize = TIFFGetFileSize(tif);
1299 0 : if (datasize > filesize)
1300 : {
1301 0 : TIFFWarningExtR(tif, "ReadDirEntryArray",
1302 : "Requested memory size for tag %d (0x%x) %" PRIu32
1303 : " is greater than filesize %" PRIu64
1304 : ". Memory not allocated, tag not read",
1305 0 : direntry->tdir_tag, direntry->tdir_tag, datasize,
1306 : filesize);
1307 0 : return (TIFFReadDirEntryErrAlloc);
1308 : }
1309 : }
1310 :
1311 224402 : if (isMapped(tif) && datasize > (uint64_t)tif->tif_size)
1312 0 : return TIFFReadDirEntryErrIo;
1313 :
1314 224402 : if (!isMapped(tif) && (((tif->tif_flags & TIFF_BIGTIFF) && datasize > 8) ||
1315 223408 : (!(tif->tif_flags & TIFF_BIGTIFF) && datasize > 4)))
1316 : {
1317 158104 : data = NULL;
1318 : }
1319 : else
1320 : {
1321 66298 : data = _TIFFCheckMalloc(tif, *count, typesize, "ReadDirEntryArray");
1322 66335 : if (data == 0)
1323 0 : return (TIFFReadDirEntryErrAlloc);
1324 : }
1325 224439 : if (!(tif->tif_flags & TIFF_BIGTIFF))
1326 : {
1327 : /* Only the condition on original_datasize_clamped. The second
1328 : * one is implied, but Coverity Scan cannot see it. */
1329 222131 : if (original_datasize_clamped <= 4 && datasize <= 4)
1330 65046 : _TIFFmemcpy(data, &direntry->tdir_offset, datasize);
1331 : else
1332 : {
1333 : enum TIFFReadDirEntryErr err;
1334 157085 : uint32_t offset = direntry->tdir_offset.toff_long;
1335 157085 : if (tif->tif_flags & TIFF_SWAB)
1336 1915 : TIFFSwabLong(&offset);
1337 157167 : if (isMapped(tif))
1338 32 : err = TIFFReadDirEntryData(tif, (uint64_t)offset,
1339 : (tmsize_t)datasize, data);
1340 : else
1341 157135 : err = TIFFReadDirEntryDataAndRealloc(tif, (uint64_t)offset,
1342 : (tmsize_t)datasize, &data);
1343 157224 : if (err != TIFFReadDirEntryErrOk)
1344 : {
1345 10 : _TIFFfreeExt(tif, data);
1346 10 : return (err);
1347 : }
1348 : }
1349 : }
1350 : else
1351 : {
1352 : /* See above comment for the Classic TIFF case */
1353 2308 : if (original_datasize_clamped <= 8 && datasize <= 8)
1354 1229 : _TIFFmemcpy(data, &direntry->tdir_offset, datasize);
1355 : else
1356 : {
1357 : enum TIFFReadDirEntryErr err;
1358 1079 : uint64_t offset = direntry->tdir_offset.toff_long8;
1359 1079 : if (tif->tif_flags & TIFF_SWAB)
1360 14 : TIFFSwabLong8(&offset);
1361 997 : if (isMapped(tif))
1362 0 : err = TIFFReadDirEntryData(tif, (uint64_t)offset,
1363 : (tmsize_t)datasize, data);
1364 : else
1365 997 : err = TIFFReadDirEntryDataAndRealloc(tif, (uint64_t)offset,
1366 : (tmsize_t)datasize, &data);
1367 997 : if (err != TIFFReadDirEntryErrOk)
1368 : {
1369 0 : _TIFFfreeExt(tif, data);
1370 0 : return (err);
1371 : }
1372 : }
1373 : }
1374 224482 : *value = data;
1375 224482 : return (TIFFReadDirEntryErrOk);
1376 : }
1377 :
1378 : static enum TIFFReadDirEntryErr
1379 156471 : TIFFReadDirEntryArray(TIFF *tif, TIFFDirEntry *direntry, uint32_t *count,
1380 : uint32_t desttypesize, void **value)
1381 : {
1382 156471 : return TIFFReadDirEntryArrayWithLimit(tif, direntry, count, desttypesize,
1383 : value, ~((uint64_t)0));
1384 : }
1385 :
1386 : static enum TIFFReadDirEntryErr
1387 34562 : TIFFReadDirEntryByteArray(TIFF *tif, TIFFDirEntry *direntry, uint8_t **value)
1388 : {
1389 : enum TIFFReadDirEntryErr err;
1390 : uint32_t count;
1391 : void *origdata;
1392 : uint8_t *data;
1393 34562 : switch (direntry->tdir_type)
1394 : {
1395 34557 : case TIFF_ASCII:
1396 : case TIFF_UNDEFINED:
1397 : case TIFF_BYTE:
1398 : case TIFF_SBYTE:
1399 : case TIFF_SHORT:
1400 : case TIFF_SSHORT:
1401 : case TIFF_LONG:
1402 : case TIFF_SLONG:
1403 : case TIFF_LONG8:
1404 : case TIFF_SLONG8:
1405 34557 : break;
1406 5 : default:
1407 5 : return (TIFFReadDirEntryErrType);
1408 : }
1409 34557 : err = TIFFReadDirEntryArray(tif, direntry, &count, 1, &origdata);
1410 34529 : if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
1411 : {
1412 46 : *value = 0;
1413 46 : return (err);
1414 : }
1415 34483 : switch (direntry->tdir_type)
1416 : {
1417 34470 : case TIFF_ASCII:
1418 : case TIFF_UNDEFINED:
1419 : case TIFF_BYTE:
1420 34470 : *value = (uint8_t *)origdata;
1421 34470 : return (TIFFReadDirEntryErrOk);
1422 0 : case TIFF_SBYTE:
1423 : {
1424 : int8_t *m;
1425 : uint32_t n;
1426 0 : m = (int8_t *)origdata;
1427 0 : for (n = 0; n < count; n++)
1428 : {
1429 0 : err = TIFFReadDirEntryCheckRangeByteSbyte(*m);
1430 0 : if (err != TIFFReadDirEntryErrOk)
1431 : {
1432 0 : _TIFFfreeExt(tif, origdata);
1433 0 : return (err);
1434 : }
1435 0 : m++;
1436 : }
1437 0 : *value = (uint8_t *)origdata;
1438 0 : return (TIFFReadDirEntryErrOk);
1439 : }
1440 : }
1441 13 : data = (uint8_t *)_TIFFmallocExt(tif, count);
1442 0 : if (data == 0)
1443 : {
1444 0 : _TIFFfreeExt(tif, origdata);
1445 0 : return (TIFFReadDirEntryErrAlloc);
1446 : }
1447 0 : switch (direntry->tdir_type)
1448 : {
1449 0 : case TIFF_SHORT:
1450 : {
1451 : uint16_t *ma;
1452 : uint8_t *mb;
1453 : uint32_t n;
1454 0 : ma = (uint16_t *)origdata;
1455 0 : mb = data;
1456 0 : for (n = 0; n < count; n++)
1457 : {
1458 0 : if (tif->tif_flags & TIFF_SWAB)
1459 0 : TIFFSwabShort(ma);
1460 0 : err = TIFFReadDirEntryCheckRangeByteShort(*ma);
1461 0 : if (err != TIFFReadDirEntryErrOk)
1462 0 : break;
1463 0 : *mb++ = (uint8_t)(*ma++);
1464 : }
1465 : }
1466 0 : break;
1467 0 : case TIFF_SSHORT:
1468 : {
1469 : int16_t *ma;
1470 : uint8_t *mb;
1471 : uint32_t n;
1472 0 : ma = (int16_t *)origdata;
1473 0 : mb = data;
1474 0 : for (n = 0; n < count; n++)
1475 : {
1476 0 : if (tif->tif_flags & TIFF_SWAB)
1477 0 : TIFFSwabShort((uint16_t *)ma);
1478 0 : err = TIFFReadDirEntryCheckRangeByteSshort(*ma);
1479 0 : if (err != TIFFReadDirEntryErrOk)
1480 0 : break;
1481 0 : *mb++ = (uint8_t)(*ma++);
1482 : }
1483 : }
1484 0 : break;
1485 0 : case TIFF_LONG:
1486 : {
1487 : uint32_t *ma;
1488 : uint8_t *mb;
1489 : uint32_t n;
1490 0 : ma = (uint32_t *)origdata;
1491 0 : mb = data;
1492 0 : for (n = 0; n < count; n++)
1493 : {
1494 0 : if (tif->tif_flags & TIFF_SWAB)
1495 0 : TIFFSwabLong(ma);
1496 0 : err = TIFFReadDirEntryCheckRangeByteLong(*ma);
1497 0 : if (err != TIFFReadDirEntryErrOk)
1498 0 : break;
1499 0 : *mb++ = (uint8_t)(*ma++);
1500 : }
1501 : }
1502 0 : break;
1503 0 : case TIFF_SLONG:
1504 : {
1505 : int32_t *ma;
1506 : uint8_t *mb;
1507 : uint32_t n;
1508 0 : ma = (int32_t *)origdata;
1509 0 : mb = data;
1510 0 : for (n = 0; n < count; n++)
1511 : {
1512 0 : if (tif->tif_flags & TIFF_SWAB)
1513 0 : TIFFSwabLong((uint32_t *)ma);
1514 0 : err = TIFFReadDirEntryCheckRangeByteSlong(*ma);
1515 0 : if (err != TIFFReadDirEntryErrOk)
1516 0 : break;
1517 0 : *mb++ = (uint8_t)(*ma++);
1518 : }
1519 : }
1520 0 : break;
1521 0 : case TIFF_LONG8:
1522 : {
1523 : uint64_t *ma;
1524 : uint8_t *mb;
1525 : uint32_t n;
1526 0 : ma = (uint64_t *)origdata;
1527 0 : mb = data;
1528 0 : for (n = 0; n < count; n++)
1529 : {
1530 0 : if (tif->tif_flags & TIFF_SWAB)
1531 0 : TIFFSwabLong8(ma);
1532 0 : err = TIFFReadDirEntryCheckRangeByteLong8(*ma);
1533 0 : if (err != TIFFReadDirEntryErrOk)
1534 0 : break;
1535 0 : *mb++ = (uint8_t)(*ma++);
1536 : }
1537 : }
1538 0 : break;
1539 0 : case TIFF_SLONG8:
1540 : {
1541 : int64_t *ma;
1542 : uint8_t *mb;
1543 : uint32_t n;
1544 0 : ma = (int64_t *)origdata;
1545 0 : mb = data;
1546 0 : for (n = 0; n < count; n++)
1547 : {
1548 0 : if (tif->tif_flags & TIFF_SWAB)
1549 0 : TIFFSwabLong8((uint64_t *)ma);
1550 0 : err = TIFFReadDirEntryCheckRangeByteSlong8(*ma);
1551 0 : if (err != TIFFReadDirEntryErrOk)
1552 0 : break;
1553 0 : *mb++ = (uint8_t)(*ma++);
1554 : }
1555 : }
1556 0 : break;
1557 : }
1558 0 : _TIFFfreeExt(tif, origdata);
1559 0 : if (err != TIFFReadDirEntryErrOk)
1560 : {
1561 0 : _TIFFfreeExt(tif, data);
1562 0 : return (err);
1563 : }
1564 0 : *value = data;
1565 0 : return (TIFFReadDirEntryErrOk);
1566 : }
1567 :
1568 : static enum TIFFReadDirEntryErr
1569 0 : TIFFReadDirEntrySbyteArray(TIFF *tif, TIFFDirEntry *direntry, int8_t **value)
1570 : {
1571 : enum TIFFReadDirEntryErr err;
1572 : uint32_t count;
1573 : void *origdata;
1574 : int8_t *data;
1575 0 : switch (direntry->tdir_type)
1576 : {
1577 0 : case TIFF_UNDEFINED:
1578 : case TIFF_BYTE:
1579 : case TIFF_SBYTE:
1580 : case TIFF_SHORT:
1581 : case TIFF_SSHORT:
1582 : case TIFF_LONG:
1583 : case TIFF_SLONG:
1584 : case TIFF_LONG8:
1585 : case TIFF_SLONG8:
1586 0 : break;
1587 0 : default:
1588 0 : return (TIFFReadDirEntryErrType);
1589 : }
1590 0 : err = TIFFReadDirEntryArray(tif, direntry, &count, 1, &origdata);
1591 0 : if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
1592 : {
1593 0 : *value = 0;
1594 0 : return (err);
1595 : }
1596 0 : switch (direntry->tdir_type)
1597 : {
1598 0 : case TIFF_UNDEFINED:
1599 : case TIFF_BYTE:
1600 : {
1601 : uint8_t *m;
1602 : uint32_t n;
1603 0 : m = (uint8_t *)origdata;
1604 0 : for (n = 0; n < count; n++)
1605 : {
1606 0 : err = TIFFReadDirEntryCheckRangeSbyteByte(*m);
1607 0 : if (err != TIFFReadDirEntryErrOk)
1608 : {
1609 0 : _TIFFfreeExt(tif, origdata);
1610 0 : return (err);
1611 : }
1612 0 : m++;
1613 : }
1614 0 : *value = (int8_t *)origdata;
1615 0 : return (TIFFReadDirEntryErrOk);
1616 : }
1617 0 : case TIFF_SBYTE:
1618 0 : *value = (int8_t *)origdata;
1619 0 : return (TIFFReadDirEntryErrOk);
1620 : }
1621 0 : data = (int8_t *)_TIFFmallocExt(tif, count);
1622 0 : if (data == 0)
1623 : {
1624 0 : _TIFFfreeExt(tif, origdata);
1625 0 : return (TIFFReadDirEntryErrAlloc);
1626 : }
1627 0 : switch (direntry->tdir_type)
1628 : {
1629 0 : case TIFF_SHORT:
1630 : {
1631 : uint16_t *ma;
1632 : int8_t *mb;
1633 : uint32_t n;
1634 0 : ma = (uint16_t *)origdata;
1635 0 : mb = data;
1636 0 : for (n = 0; n < count; n++)
1637 : {
1638 0 : if (tif->tif_flags & TIFF_SWAB)
1639 0 : TIFFSwabShort(ma);
1640 0 : err = TIFFReadDirEntryCheckRangeSbyteShort(*ma);
1641 0 : if (err != TIFFReadDirEntryErrOk)
1642 0 : break;
1643 0 : *mb++ = (int8_t)(*ma++);
1644 : }
1645 : }
1646 0 : break;
1647 0 : case TIFF_SSHORT:
1648 : {
1649 : int16_t *ma;
1650 : int8_t *mb;
1651 : uint32_t n;
1652 0 : ma = (int16_t *)origdata;
1653 0 : mb = data;
1654 0 : for (n = 0; n < count; n++)
1655 : {
1656 0 : if (tif->tif_flags & TIFF_SWAB)
1657 0 : TIFFSwabShort((uint16_t *)ma);
1658 0 : err = TIFFReadDirEntryCheckRangeSbyteSshort(*ma);
1659 0 : if (err != TIFFReadDirEntryErrOk)
1660 0 : break;
1661 0 : *mb++ = (int8_t)(*ma++);
1662 : }
1663 : }
1664 0 : break;
1665 0 : case TIFF_LONG:
1666 : {
1667 : uint32_t *ma;
1668 : int8_t *mb;
1669 : uint32_t n;
1670 0 : ma = (uint32_t *)origdata;
1671 0 : mb = data;
1672 0 : for (n = 0; n < count; n++)
1673 : {
1674 0 : if (tif->tif_flags & TIFF_SWAB)
1675 0 : TIFFSwabLong(ma);
1676 0 : err = TIFFReadDirEntryCheckRangeSbyteLong(*ma);
1677 0 : if (err != TIFFReadDirEntryErrOk)
1678 0 : break;
1679 0 : *mb++ = (int8_t)(*ma++);
1680 : }
1681 : }
1682 0 : break;
1683 0 : case TIFF_SLONG:
1684 : {
1685 : int32_t *ma;
1686 : int8_t *mb;
1687 : uint32_t n;
1688 0 : ma = (int32_t *)origdata;
1689 0 : mb = data;
1690 0 : for (n = 0; n < count; n++)
1691 : {
1692 0 : if (tif->tif_flags & TIFF_SWAB)
1693 0 : TIFFSwabLong((uint32_t *)ma);
1694 0 : err = TIFFReadDirEntryCheckRangeSbyteSlong(*ma);
1695 0 : if (err != TIFFReadDirEntryErrOk)
1696 0 : break;
1697 0 : *mb++ = (int8_t)(*ma++);
1698 : }
1699 : }
1700 0 : break;
1701 0 : case TIFF_LONG8:
1702 : {
1703 : uint64_t *ma;
1704 : int8_t *mb;
1705 : uint32_t n;
1706 0 : ma = (uint64_t *)origdata;
1707 0 : mb = data;
1708 0 : for (n = 0; n < count; n++)
1709 : {
1710 0 : if (tif->tif_flags & TIFF_SWAB)
1711 0 : TIFFSwabLong8(ma);
1712 0 : err = TIFFReadDirEntryCheckRangeSbyteLong8(*ma);
1713 0 : if (err != TIFFReadDirEntryErrOk)
1714 0 : break;
1715 0 : *mb++ = (int8_t)(*ma++);
1716 : }
1717 : }
1718 0 : break;
1719 0 : case TIFF_SLONG8:
1720 : {
1721 : int64_t *ma;
1722 : int8_t *mb;
1723 : uint32_t n;
1724 0 : ma = (int64_t *)origdata;
1725 0 : mb = data;
1726 0 : for (n = 0; n < count; n++)
1727 : {
1728 0 : if (tif->tif_flags & TIFF_SWAB)
1729 0 : TIFFSwabLong8((uint64_t *)ma);
1730 0 : err = TIFFReadDirEntryCheckRangeSbyteSlong8(*ma);
1731 0 : if (err != TIFFReadDirEntryErrOk)
1732 0 : break;
1733 0 : *mb++ = (int8_t)(*ma++);
1734 : }
1735 : }
1736 0 : break;
1737 : }
1738 0 : _TIFFfreeExt(tif, origdata);
1739 0 : if (err != TIFFReadDirEntryErrOk)
1740 : {
1741 0 : _TIFFfreeExt(tif, data);
1742 0 : return (err);
1743 : }
1744 0 : *value = data;
1745 0 : return (TIFFReadDirEntryErrOk);
1746 : }
1747 :
1748 : static enum TIFFReadDirEntryErr
1749 59045 : TIFFReadDirEntryShortArray(TIFF *tif, TIFFDirEntry *direntry, uint16_t **value)
1750 : {
1751 : enum TIFFReadDirEntryErr err;
1752 : uint32_t count;
1753 : void *origdata;
1754 : uint16_t *data;
1755 59045 : switch (direntry->tdir_type)
1756 : {
1757 59008 : case TIFF_BYTE:
1758 : case TIFF_SBYTE:
1759 : case TIFF_SHORT:
1760 : case TIFF_SSHORT:
1761 : case TIFF_LONG:
1762 : case TIFF_SLONG:
1763 : case TIFF_LONG8:
1764 : case TIFF_SLONG8:
1765 59008 : break;
1766 37 : default:
1767 37 : return (TIFFReadDirEntryErrType);
1768 : }
1769 59008 : err = TIFFReadDirEntryArray(tif, direntry, &count, 2, &origdata);
1770 59002 : if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
1771 : {
1772 0 : *value = 0;
1773 0 : return (err);
1774 : }
1775 59003 : switch (direntry->tdir_type)
1776 : {
1777 58955 : case TIFF_SHORT:
1778 58955 : *value = (uint16_t *)origdata;
1779 58955 : if (tif->tif_flags & TIFF_SWAB)
1780 1009 : TIFFSwabArrayOfShort(*value, count);
1781 58956 : return (TIFFReadDirEntryErrOk);
1782 0 : case TIFF_SSHORT:
1783 : {
1784 : int16_t *m;
1785 : uint32_t n;
1786 0 : m = (int16_t *)origdata;
1787 0 : for (n = 0; n < count; n++)
1788 : {
1789 0 : if (tif->tif_flags & TIFF_SWAB)
1790 0 : TIFFSwabShort((uint16_t *)m);
1791 0 : err = TIFFReadDirEntryCheckRangeShortSshort(*m);
1792 0 : if (err != TIFFReadDirEntryErrOk)
1793 : {
1794 0 : _TIFFfreeExt(tif, origdata);
1795 0 : return (err);
1796 : }
1797 0 : m++;
1798 : }
1799 0 : *value = (uint16_t *)origdata;
1800 0 : return (TIFFReadDirEntryErrOk);
1801 : }
1802 : }
1803 48 : data = (uint16_t *)_TIFFmallocExt(tif, count * 2);
1804 0 : if (data == 0)
1805 : {
1806 0 : _TIFFfreeExt(tif, origdata);
1807 0 : return (TIFFReadDirEntryErrAlloc);
1808 : }
1809 0 : switch (direntry->tdir_type)
1810 : {
1811 0 : case TIFF_BYTE:
1812 : {
1813 : uint8_t *ma;
1814 : uint16_t *mb;
1815 : uint32_t n;
1816 0 : ma = (uint8_t *)origdata;
1817 0 : mb = data;
1818 0 : for (n = 0; n < count; n++)
1819 0 : *mb++ = (uint16_t)(*ma++);
1820 : }
1821 0 : break;
1822 0 : case TIFF_SBYTE:
1823 : {
1824 : int8_t *ma;
1825 : uint16_t *mb;
1826 : uint32_t n;
1827 0 : ma = (int8_t *)origdata;
1828 0 : mb = data;
1829 0 : for (n = 0; n < count; n++)
1830 : {
1831 0 : err = TIFFReadDirEntryCheckRangeShortSbyte(*ma);
1832 0 : if (err != TIFFReadDirEntryErrOk)
1833 0 : break;
1834 0 : *mb++ = (uint16_t)(*ma++);
1835 : }
1836 : }
1837 0 : break;
1838 0 : case TIFF_LONG:
1839 : {
1840 : uint32_t *ma;
1841 : uint16_t *mb;
1842 : uint32_t n;
1843 0 : ma = (uint32_t *)origdata;
1844 0 : mb = data;
1845 0 : for (n = 0; n < count; n++)
1846 : {
1847 0 : if (tif->tif_flags & TIFF_SWAB)
1848 0 : TIFFSwabLong(ma);
1849 0 : err = TIFFReadDirEntryCheckRangeShortLong(*ma);
1850 0 : if (err != TIFFReadDirEntryErrOk)
1851 0 : break;
1852 0 : *mb++ = (uint16_t)(*ma++);
1853 : }
1854 : }
1855 0 : break;
1856 0 : case TIFF_SLONG:
1857 : {
1858 : int32_t *ma;
1859 : uint16_t *mb;
1860 : uint32_t n;
1861 0 : ma = (int32_t *)origdata;
1862 0 : mb = data;
1863 0 : for (n = 0; n < count; n++)
1864 : {
1865 0 : if (tif->tif_flags & TIFF_SWAB)
1866 0 : TIFFSwabLong((uint32_t *)ma);
1867 0 : err = TIFFReadDirEntryCheckRangeShortSlong(*ma);
1868 0 : if (err != TIFFReadDirEntryErrOk)
1869 0 : break;
1870 0 : *mb++ = (uint16_t)(*ma++);
1871 : }
1872 : }
1873 0 : break;
1874 0 : case TIFF_LONG8:
1875 : {
1876 : uint64_t *ma;
1877 : uint16_t *mb;
1878 : uint32_t n;
1879 0 : ma = (uint64_t *)origdata;
1880 0 : mb = data;
1881 0 : for (n = 0; n < count; n++)
1882 : {
1883 0 : if (tif->tif_flags & TIFF_SWAB)
1884 0 : TIFFSwabLong8(ma);
1885 0 : err = TIFFReadDirEntryCheckRangeShortLong8(*ma);
1886 0 : if (err != TIFFReadDirEntryErrOk)
1887 0 : break;
1888 0 : *mb++ = (uint16_t)(*ma++);
1889 : }
1890 : }
1891 0 : break;
1892 0 : case TIFF_SLONG8:
1893 : {
1894 : int64_t *ma;
1895 : uint16_t *mb;
1896 : uint32_t n;
1897 0 : ma = (int64_t *)origdata;
1898 0 : mb = data;
1899 0 : for (n = 0; n < count; n++)
1900 : {
1901 0 : if (tif->tif_flags & TIFF_SWAB)
1902 0 : TIFFSwabLong8((uint64_t *)ma);
1903 0 : err = TIFFReadDirEntryCheckRangeShortSlong8(*ma);
1904 0 : if (err != TIFFReadDirEntryErrOk)
1905 0 : break;
1906 0 : *mb++ = (uint16_t)(*ma++);
1907 : }
1908 : }
1909 0 : break;
1910 : }
1911 0 : _TIFFfreeExt(tif, origdata);
1912 0 : if (err != TIFFReadDirEntryErrOk)
1913 : {
1914 0 : _TIFFfreeExt(tif, data);
1915 0 : return (err);
1916 : }
1917 0 : *value = data;
1918 0 : return (TIFFReadDirEntryErrOk);
1919 : }
1920 :
1921 : static enum TIFFReadDirEntryErr
1922 0 : TIFFReadDirEntrySshortArray(TIFF *tif, TIFFDirEntry *direntry, int16_t **value)
1923 : {
1924 : enum TIFFReadDirEntryErr err;
1925 : uint32_t count;
1926 : void *origdata;
1927 : int16_t *data;
1928 0 : switch (direntry->tdir_type)
1929 : {
1930 0 : case TIFF_BYTE:
1931 : case TIFF_SBYTE:
1932 : case TIFF_SHORT:
1933 : case TIFF_SSHORT:
1934 : case TIFF_LONG:
1935 : case TIFF_SLONG:
1936 : case TIFF_LONG8:
1937 : case TIFF_SLONG8:
1938 0 : break;
1939 0 : default:
1940 0 : return (TIFFReadDirEntryErrType);
1941 : }
1942 0 : err = TIFFReadDirEntryArray(tif, direntry, &count, 2, &origdata);
1943 0 : if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
1944 : {
1945 0 : *value = 0;
1946 0 : return (err);
1947 : }
1948 0 : switch (direntry->tdir_type)
1949 : {
1950 0 : case TIFF_SHORT:
1951 : {
1952 : uint16_t *m;
1953 : uint32_t n;
1954 0 : m = (uint16_t *)origdata;
1955 0 : for (n = 0; n < count; n++)
1956 : {
1957 0 : if (tif->tif_flags & TIFF_SWAB)
1958 0 : TIFFSwabShort(m);
1959 0 : err = TIFFReadDirEntryCheckRangeSshortShort(*m);
1960 0 : if (err != TIFFReadDirEntryErrOk)
1961 : {
1962 0 : _TIFFfreeExt(tif, origdata);
1963 0 : return (err);
1964 : }
1965 0 : m++;
1966 : }
1967 0 : *value = (int16_t *)origdata;
1968 0 : return (TIFFReadDirEntryErrOk);
1969 : }
1970 0 : case TIFF_SSHORT:
1971 0 : *value = (int16_t *)origdata;
1972 0 : if (tif->tif_flags & TIFF_SWAB)
1973 0 : TIFFSwabArrayOfShort((uint16_t *)(*value), count);
1974 0 : return (TIFFReadDirEntryErrOk);
1975 : }
1976 0 : data = (int16_t *)_TIFFmallocExt(tif, count * 2);
1977 0 : if (data == 0)
1978 : {
1979 0 : _TIFFfreeExt(tif, origdata);
1980 0 : return (TIFFReadDirEntryErrAlloc);
1981 : }
1982 0 : switch (direntry->tdir_type)
1983 : {
1984 0 : case TIFF_BYTE:
1985 : {
1986 : uint8_t *ma;
1987 : int16_t *mb;
1988 : uint32_t n;
1989 0 : ma = (uint8_t *)origdata;
1990 0 : mb = data;
1991 0 : for (n = 0; n < count; n++)
1992 0 : *mb++ = (int16_t)(*ma++);
1993 : }
1994 0 : break;
1995 0 : case TIFF_SBYTE:
1996 : {
1997 : int8_t *ma;
1998 : int16_t *mb;
1999 : uint32_t n;
2000 0 : ma = (int8_t *)origdata;
2001 0 : mb = data;
2002 0 : for (n = 0; n < count; n++)
2003 0 : *mb++ = (int16_t)(*ma++);
2004 : }
2005 0 : break;
2006 0 : case TIFF_LONG:
2007 : {
2008 : uint32_t *ma;
2009 : int16_t *mb;
2010 : uint32_t n;
2011 0 : ma = (uint32_t *)origdata;
2012 0 : mb = data;
2013 0 : for (n = 0; n < count; n++)
2014 : {
2015 0 : if (tif->tif_flags & TIFF_SWAB)
2016 0 : TIFFSwabLong(ma);
2017 0 : err = TIFFReadDirEntryCheckRangeSshortLong(*ma);
2018 0 : if (err != TIFFReadDirEntryErrOk)
2019 0 : break;
2020 0 : *mb++ = (int16_t)(*ma++);
2021 : }
2022 : }
2023 0 : break;
2024 0 : case TIFF_SLONG:
2025 : {
2026 : int32_t *ma;
2027 : int16_t *mb;
2028 : uint32_t n;
2029 0 : ma = (int32_t *)origdata;
2030 0 : mb = data;
2031 0 : for (n = 0; n < count; n++)
2032 : {
2033 0 : if (tif->tif_flags & TIFF_SWAB)
2034 0 : TIFFSwabLong((uint32_t *)ma);
2035 0 : err = TIFFReadDirEntryCheckRangeSshortSlong(*ma);
2036 0 : if (err != TIFFReadDirEntryErrOk)
2037 0 : break;
2038 0 : *mb++ = (int16_t)(*ma++);
2039 : }
2040 : }
2041 0 : break;
2042 0 : case TIFF_LONG8:
2043 : {
2044 : uint64_t *ma;
2045 : int16_t *mb;
2046 : uint32_t n;
2047 0 : ma = (uint64_t *)origdata;
2048 0 : mb = data;
2049 0 : for (n = 0; n < count; n++)
2050 : {
2051 0 : if (tif->tif_flags & TIFF_SWAB)
2052 0 : TIFFSwabLong8(ma);
2053 0 : err = TIFFReadDirEntryCheckRangeSshortLong8(*ma);
2054 0 : if (err != TIFFReadDirEntryErrOk)
2055 0 : break;
2056 0 : *mb++ = (int16_t)(*ma++);
2057 : }
2058 : }
2059 0 : break;
2060 0 : case TIFF_SLONG8:
2061 : {
2062 : int64_t *ma;
2063 : int16_t *mb;
2064 : uint32_t n;
2065 0 : ma = (int64_t *)origdata;
2066 0 : mb = data;
2067 0 : for (n = 0; n < count; n++)
2068 : {
2069 0 : if (tif->tif_flags & TIFF_SWAB)
2070 0 : TIFFSwabLong8((uint64_t *)ma);
2071 0 : err = TIFFReadDirEntryCheckRangeSshortSlong8(*ma);
2072 0 : if (err != TIFFReadDirEntryErrOk)
2073 0 : break;
2074 0 : *mb++ = (int16_t)(*ma++);
2075 : }
2076 : }
2077 0 : break;
2078 : }
2079 0 : _TIFFfreeExt(tif, origdata);
2080 0 : if (err != TIFFReadDirEntryErrOk)
2081 : {
2082 0 : _TIFFfreeExt(tif, data);
2083 0 : return (err);
2084 : }
2085 0 : *value = data;
2086 0 : return (TIFFReadDirEntryErrOk);
2087 : }
2088 :
2089 : static enum TIFFReadDirEntryErr
2090 789 : TIFFReadDirEntryLongArray(TIFF *tif, TIFFDirEntry *direntry, uint32_t **value)
2091 : {
2092 : enum TIFFReadDirEntryErr err;
2093 : uint32_t count;
2094 : void *origdata;
2095 : uint32_t *data;
2096 789 : switch (direntry->tdir_type)
2097 : {
2098 789 : case TIFF_BYTE:
2099 : case TIFF_SBYTE:
2100 : case TIFF_SHORT:
2101 : case TIFF_SSHORT:
2102 : case TIFF_LONG:
2103 : case TIFF_SLONG:
2104 : case TIFF_LONG8:
2105 : case TIFF_SLONG8:
2106 789 : break;
2107 0 : default:
2108 0 : return (TIFFReadDirEntryErrType);
2109 : }
2110 789 : err = TIFFReadDirEntryArray(tif, direntry, &count, 4, &origdata);
2111 789 : if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
2112 : {
2113 0 : *value = 0;
2114 0 : return (err);
2115 : }
2116 789 : switch (direntry->tdir_type)
2117 : {
2118 789 : case TIFF_LONG:
2119 789 : *value = (uint32_t *)origdata;
2120 789 : if (tif->tif_flags & TIFF_SWAB)
2121 0 : TIFFSwabArrayOfLong(*value, count);
2122 789 : return (TIFFReadDirEntryErrOk);
2123 0 : case TIFF_SLONG:
2124 : {
2125 : int32_t *m;
2126 : uint32_t n;
2127 0 : m = (int32_t *)origdata;
2128 0 : for (n = 0; n < count; n++)
2129 : {
2130 0 : if (tif->tif_flags & TIFF_SWAB)
2131 0 : TIFFSwabLong((uint32_t *)m);
2132 0 : err = TIFFReadDirEntryCheckRangeLongSlong(*m);
2133 0 : if (err != TIFFReadDirEntryErrOk)
2134 : {
2135 0 : _TIFFfreeExt(tif, origdata);
2136 0 : return (err);
2137 : }
2138 0 : m++;
2139 : }
2140 0 : *value = (uint32_t *)origdata;
2141 0 : return (TIFFReadDirEntryErrOk);
2142 : }
2143 : }
2144 0 : data = (uint32_t *)_TIFFmallocExt(tif, count * 4);
2145 0 : if (data == 0)
2146 : {
2147 0 : _TIFFfreeExt(tif, origdata);
2148 0 : return (TIFFReadDirEntryErrAlloc);
2149 : }
2150 0 : switch (direntry->tdir_type)
2151 : {
2152 0 : case TIFF_BYTE:
2153 : {
2154 : uint8_t *ma;
2155 : uint32_t *mb;
2156 : uint32_t n;
2157 0 : ma = (uint8_t *)origdata;
2158 0 : mb = data;
2159 0 : for (n = 0; n < count; n++)
2160 0 : *mb++ = (uint32_t)(*ma++);
2161 : }
2162 0 : break;
2163 0 : case TIFF_SBYTE:
2164 : {
2165 : int8_t *ma;
2166 : uint32_t *mb;
2167 : uint32_t n;
2168 0 : ma = (int8_t *)origdata;
2169 0 : mb = data;
2170 0 : for (n = 0; n < count; n++)
2171 : {
2172 0 : err = TIFFReadDirEntryCheckRangeLongSbyte(*ma);
2173 0 : if (err != TIFFReadDirEntryErrOk)
2174 0 : break;
2175 0 : *mb++ = (uint32_t)(*ma++);
2176 : }
2177 : }
2178 0 : break;
2179 0 : case TIFF_SHORT:
2180 : {
2181 : uint16_t *ma;
2182 : uint32_t *mb;
2183 : uint32_t n;
2184 0 : ma = (uint16_t *)origdata;
2185 0 : mb = data;
2186 0 : for (n = 0; n < count; n++)
2187 : {
2188 0 : if (tif->tif_flags & TIFF_SWAB)
2189 0 : TIFFSwabShort(ma);
2190 0 : *mb++ = (uint32_t)(*ma++);
2191 : }
2192 : }
2193 0 : break;
2194 0 : case TIFF_SSHORT:
2195 : {
2196 : int16_t *ma;
2197 : uint32_t *mb;
2198 : uint32_t n;
2199 0 : ma = (int16_t *)origdata;
2200 0 : mb = data;
2201 0 : for (n = 0; n < count; n++)
2202 : {
2203 0 : if (tif->tif_flags & TIFF_SWAB)
2204 0 : TIFFSwabShort((uint16_t *)ma);
2205 0 : err = TIFFReadDirEntryCheckRangeLongSshort(*ma);
2206 0 : if (err != TIFFReadDirEntryErrOk)
2207 0 : break;
2208 0 : *mb++ = (uint32_t)(*ma++);
2209 : }
2210 : }
2211 0 : break;
2212 0 : case TIFF_LONG8:
2213 : {
2214 : uint64_t *ma;
2215 : uint32_t *mb;
2216 : uint32_t n;
2217 0 : ma = (uint64_t *)origdata;
2218 0 : mb = data;
2219 0 : for (n = 0; n < count; n++)
2220 : {
2221 0 : if (tif->tif_flags & TIFF_SWAB)
2222 0 : TIFFSwabLong8(ma);
2223 0 : err = TIFFReadDirEntryCheckRangeLongLong8(*ma);
2224 0 : if (err != TIFFReadDirEntryErrOk)
2225 0 : break;
2226 0 : *mb++ = (uint32_t)(*ma++);
2227 : }
2228 : }
2229 0 : break;
2230 0 : case TIFF_SLONG8:
2231 : {
2232 : int64_t *ma;
2233 : uint32_t *mb;
2234 : uint32_t n;
2235 0 : ma = (int64_t *)origdata;
2236 0 : mb = data;
2237 0 : for (n = 0; n < count; n++)
2238 : {
2239 0 : if (tif->tif_flags & TIFF_SWAB)
2240 0 : TIFFSwabLong8((uint64_t *)ma);
2241 0 : err = TIFFReadDirEntryCheckRangeLongSlong8(*ma);
2242 0 : if (err != TIFFReadDirEntryErrOk)
2243 0 : break;
2244 0 : *mb++ = (uint32_t)(*ma++);
2245 : }
2246 : }
2247 0 : break;
2248 : }
2249 0 : _TIFFfreeExt(tif, origdata);
2250 0 : if (err != TIFFReadDirEntryErrOk)
2251 : {
2252 0 : _TIFFfreeExt(tif, data);
2253 0 : return (err);
2254 : }
2255 0 : *value = data;
2256 0 : return (TIFFReadDirEntryErrOk);
2257 : }
2258 :
2259 : static enum TIFFReadDirEntryErr
2260 0 : TIFFReadDirEntrySlongArray(TIFF *tif, TIFFDirEntry *direntry, int32_t **value)
2261 : {
2262 : enum TIFFReadDirEntryErr err;
2263 : uint32_t count;
2264 : void *origdata;
2265 : int32_t *data;
2266 0 : switch (direntry->tdir_type)
2267 : {
2268 0 : case TIFF_BYTE:
2269 : case TIFF_SBYTE:
2270 : case TIFF_SHORT:
2271 : case TIFF_SSHORT:
2272 : case TIFF_LONG:
2273 : case TIFF_SLONG:
2274 : case TIFF_LONG8:
2275 : case TIFF_SLONG8:
2276 0 : break;
2277 0 : default:
2278 0 : return (TIFFReadDirEntryErrType);
2279 : }
2280 0 : err = TIFFReadDirEntryArray(tif, direntry, &count, 4, &origdata);
2281 0 : if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
2282 : {
2283 0 : *value = 0;
2284 0 : return (err);
2285 : }
2286 0 : switch (direntry->tdir_type)
2287 : {
2288 0 : case TIFF_LONG:
2289 : {
2290 : uint32_t *m;
2291 : uint32_t n;
2292 0 : m = (uint32_t *)origdata;
2293 0 : for (n = 0; n < count; n++)
2294 : {
2295 0 : if (tif->tif_flags & TIFF_SWAB)
2296 0 : TIFFSwabLong((uint32_t *)m);
2297 0 : err = TIFFReadDirEntryCheckRangeSlongLong(*m);
2298 0 : if (err != TIFFReadDirEntryErrOk)
2299 : {
2300 0 : _TIFFfreeExt(tif, origdata);
2301 0 : return (err);
2302 : }
2303 0 : m++;
2304 : }
2305 0 : *value = (int32_t *)origdata;
2306 0 : return (TIFFReadDirEntryErrOk);
2307 : }
2308 0 : case TIFF_SLONG:
2309 0 : *value = (int32_t *)origdata;
2310 0 : if (tif->tif_flags & TIFF_SWAB)
2311 0 : TIFFSwabArrayOfLong((uint32_t *)(*value), count);
2312 0 : return (TIFFReadDirEntryErrOk);
2313 : }
2314 0 : data = (int32_t *)_TIFFmallocExt(tif, count * 4);
2315 0 : if (data == 0)
2316 : {
2317 0 : _TIFFfreeExt(tif, origdata);
2318 0 : return (TIFFReadDirEntryErrAlloc);
2319 : }
2320 0 : switch (direntry->tdir_type)
2321 : {
2322 0 : case TIFF_BYTE:
2323 : {
2324 : uint8_t *ma;
2325 : int32_t *mb;
2326 : uint32_t n;
2327 0 : ma = (uint8_t *)origdata;
2328 0 : mb = data;
2329 0 : for (n = 0; n < count; n++)
2330 0 : *mb++ = (int32_t)(*ma++);
2331 : }
2332 0 : break;
2333 0 : case TIFF_SBYTE:
2334 : {
2335 : int8_t *ma;
2336 : int32_t *mb;
2337 : uint32_t n;
2338 0 : ma = (int8_t *)origdata;
2339 0 : mb = data;
2340 0 : for (n = 0; n < count; n++)
2341 0 : *mb++ = (int32_t)(*ma++);
2342 : }
2343 0 : break;
2344 0 : case TIFF_SHORT:
2345 : {
2346 : uint16_t *ma;
2347 : int32_t *mb;
2348 : uint32_t n;
2349 0 : ma = (uint16_t *)origdata;
2350 0 : mb = data;
2351 0 : for (n = 0; n < count; n++)
2352 : {
2353 0 : if (tif->tif_flags & TIFF_SWAB)
2354 0 : TIFFSwabShort(ma);
2355 0 : *mb++ = (int32_t)(*ma++);
2356 : }
2357 : }
2358 0 : break;
2359 0 : case TIFF_SSHORT:
2360 : {
2361 : int16_t *ma;
2362 : int32_t *mb;
2363 : uint32_t n;
2364 0 : ma = (int16_t *)origdata;
2365 0 : mb = data;
2366 0 : for (n = 0; n < count; n++)
2367 : {
2368 0 : if (tif->tif_flags & TIFF_SWAB)
2369 0 : TIFFSwabShort((uint16_t *)ma);
2370 0 : *mb++ = (int32_t)(*ma++);
2371 : }
2372 : }
2373 0 : break;
2374 0 : case TIFF_LONG8:
2375 : {
2376 : uint64_t *ma;
2377 : int32_t *mb;
2378 : uint32_t n;
2379 0 : ma = (uint64_t *)origdata;
2380 0 : mb = data;
2381 0 : for (n = 0; n < count; n++)
2382 : {
2383 0 : if (tif->tif_flags & TIFF_SWAB)
2384 0 : TIFFSwabLong8(ma);
2385 0 : err = TIFFReadDirEntryCheckRangeSlongLong8(*ma);
2386 0 : if (err != TIFFReadDirEntryErrOk)
2387 0 : break;
2388 0 : *mb++ = (int32_t)(*ma++);
2389 : }
2390 : }
2391 0 : break;
2392 0 : case TIFF_SLONG8:
2393 : {
2394 : int64_t *ma;
2395 : int32_t *mb;
2396 : uint32_t n;
2397 0 : ma = (int64_t *)origdata;
2398 0 : mb = data;
2399 0 : for (n = 0; n < count; n++)
2400 : {
2401 0 : if (tif->tif_flags & TIFF_SWAB)
2402 0 : TIFFSwabLong8((uint64_t *)ma);
2403 0 : err = TIFFReadDirEntryCheckRangeSlongSlong8(*ma);
2404 0 : if (err != TIFFReadDirEntryErrOk)
2405 0 : break;
2406 0 : *mb++ = (int32_t)(*ma++);
2407 : }
2408 : }
2409 0 : break;
2410 : }
2411 0 : _TIFFfreeExt(tif, origdata);
2412 0 : if (err != TIFFReadDirEntryErrOk)
2413 : {
2414 0 : _TIFFfreeExt(tif, data);
2415 0 : return (err);
2416 : }
2417 0 : *value = data;
2418 0 : return (TIFFReadDirEntryErrOk);
2419 : }
2420 :
2421 : static enum TIFFReadDirEntryErr
2422 68143 : TIFFReadDirEntryLong8ArrayWithLimit(TIFF *tif, TIFFDirEntry *direntry,
2423 : uint64_t **value, uint64_t maxcount)
2424 : {
2425 : enum TIFFReadDirEntryErr err;
2426 : uint32_t count;
2427 : void *origdata;
2428 : uint64_t *data;
2429 68143 : switch (direntry->tdir_type)
2430 : {
2431 68132 : case TIFF_BYTE:
2432 : case TIFF_SBYTE:
2433 : case TIFF_SHORT:
2434 : case TIFF_SSHORT:
2435 : case TIFF_LONG:
2436 : case TIFF_SLONG:
2437 : case TIFF_LONG8:
2438 : case TIFF_SLONG8:
2439 68132 : break;
2440 11 : default:
2441 11 : return (TIFFReadDirEntryErrType);
2442 : }
2443 68132 : err = TIFFReadDirEntryArrayWithLimit(tif, direntry, &count, 8, &origdata,
2444 : maxcount);
2445 68109 : if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
2446 : {
2447 26 : *value = 0;
2448 26 : return (err);
2449 : }
2450 68083 : switch (direntry->tdir_type)
2451 : {
2452 492 : case TIFF_LONG8:
2453 492 : *value = (uint64_t *)origdata;
2454 492 : if (tif->tif_flags & TIFF_SWAB)
2455 15 : TIFFSwabArrayOfLong8(*value, count);
2456 492 : return (TIFFReadDirEntryErrOk);
2457 1 : case TIFF_SLONG8:
2458 : {
2459 : int64_t *m;
2460 : uint32_t n;
2461 1 : m = (int64_t *)origdata;
2462 2 : for (n = 0; n < count; n++)
2463 : {
2464 1 : if (tif->tif_flags & TIFF_SWAB)
2465 0 : TIFFSwabLong8((uint64_t *)m);
2466 1 : err = TIFFReadDirEntryCheckRangeLong8Slong8(*m);
2467 1 : if (err != TIFFReadDirEntryErrOk)
2468 : {
2469 0 : _TIFFfreeExt(tif, origdata);
2470 0 : return (err);
2471 : }
2472 1 : m++;
2473 : }
2474 1 : *value = (uint64_t *)origdata;
2475 1 : return (TIFFReadDirEntryErrOk);
2476 : }
2477 : }
2478 67590 : data = (uint64_t *)_TIFFmallocExt(tif, count * 8);
2479 67720 : if (data == 0)
2480 : {
2481 0 : _TIFFfreeExt(tif, origdata);
2482 0 : return (TIFFReadDirEntryErrAlloc);
2483 : }
2484 67720 : switch (direntry->tdir_type)
2485 : {
2486 1 : case TIFF_BYTE:
2487 : {
2488 : uint8_t *ma;
2489 : uint64_t *mb;
2490 : uint32_t n;
2491 1 : ma = (uint8_t *)origdata;
2492 1 : mb = data;
2493 2 : for (n = 0; n < count; n++)
2494 1 : *mb++ = (uint64_t)(*ma++);
2495 : }
2496 1 : break;
2497 0 : case TIFF_SBYTE:
2498 : {
2499 : int8_t *ma;
2500 : uint64_t *mb;
2501 : uint32_t n;
2502 0 : ma = (int8_t *)origdata;
2503 0 : mb = data;
2504 0 : for (n = 0; n < count; n++)
2505 : {
2506 0 : err = TIFFReadDirEntryCheckRangeLong8Sbyte(*ma);
2507 0 : if (err != TIFFReadDirEntryErrOk)
2508 0 : break;
2509 0 : *mb++ = (uint64_t)(*ma++);
2510 : }
2511 : }
2512 0 : break;
2513 3796 : case TIFF_SHORT:
2514 : {
2515 : uint16_t *ma;
2516 : uint64_t *mb;
2517 : uint32_t n;
2518 3796 : ma = (uint16_t *)origdata;
2519 3796 : mb = data;
2520 3284070 : for (n = 0; n < count; n++)
2521 : {
2522 3280270 : if (tif->tif_flags & TIFF_SWAB)
2523 7435 : TIFFSwabShort(ma);
2524 3280270 : *mb++ = (uint64_t)(*ma++);
2525 : }
2526 : }
2527 3796 : break;
2528 0 : case TIFF_SSHORT:
2529 : {
2530 : int16_t *ma;
2531 : uint64_t *mb;
2532 : uint32_t n;
2533 0 : ma = (int16_t *)origdata;
2534 0 : mb = data;
2535 0 : for (n = 0; n < count; n++)
2536 : {
2537 0 : if (tif->tif_flags & TIFF_SWAB)
2538 0 : TIFFSwabShort((uint16_t *)ma);
2539 0 : err = TIFFReadDirEntryCheckRangeLong8Sshort(*ma);
2540 0 : if (err != TIFFReadDirEntryErrOk)
2541 0 : break;
2542 0 : *mb++ = (uint64_t)(*ma++);
2543 : }
2544 : }
2545 0 : break;
2546 63903 : case TIFF_LONG:
2547 : {
2548 : uint32_t *ma;
2549 : uint64_t *mb;
2550 : uint32_t n;
2551 63903 : ma = (uint32_t *)origdata;
2552 63903 : mb = data;
2553 7633650 : for (n = 0; n < count; n++)
2554 : {
2555 7569790 : if (tif->tif_flags & TIFF_SWAB)
2556 409160 : TIFFSwabLong(ma);
2557 7569750 : *mb++ = (uint64_t)(*ma++);
2558 : }
2559 : }
2560 63861 : break;
2561 0 : case TIFF_SLONG:
2562 : {
2563 : int32_t *ma;
2564 : uint64_t *mb;
2565 : uint32_t n;
2566 0 : ma = (int32_t *)origdata;
2567 0 : mb = data;
2568 0 : for (n = 0; n < count; n++)
2569 : {
2570 0 : if (tif->tif_flags & TIFF_SWAB)
2571 0 : TIFFSwabLong((uint32_t *)ma);
2572 0 : err = TIFFReadDirEntryCheckRangeLong8Slong(*ma);
2573 0 : if (err != TIFFReadDirEntryErrOk)
2574 0 : break;
2575 0 : *mb++ = (uint64_t)(*ma++);
2576 : }
2577 : }
2578 0 : break;
2579 : }
2580 67678 : _TIFFfreeExt(tif, origdata);
2581 67703 : if (err != TIFFReadDirEntryErrOk)
2582 : {
2583 42 : _TIFFfreeExt(tif, data);
2584 0 : return (err);
2585 : }
2586 67661 : *value = data;
2587 67661 : return (TIFFReadDirEntryErrOk);
2588 : }
2589 :
2590 : static enum TIFFReadDirEntryErr
2591 6 : TIFFReadDirEntryLong8Array(TIFF *tif, TIFFDirEntry *direntry, uint64_t **value)
2592 : {
2593 6 : return TIFFReadDirEntryLong8ArrayWithLimit(tif, direntry, value,
2594 : ~((uint64_t)0));
2595 : }
2596 :
2597 : static enum TIFFReadDirEntryErr
2598 0 : TIFFReadDirEntrySlong8Array(TIFF *tif, TIFFDirEntry *direntry, int64_t **value)
2599 : {
2600 : enum TIFFReadDirEntryErr err;
2601 : uint32_t count;
2602 : void *origdata;
2603 : int64_t *data;
2604 0 : switch (direntry->tdir_type)
2605 : {
2606 0 : case TIFF_BYTE:
2607 : case TIFF_SBYTE:
2608 : case TIFF_SHORT:
2609 : case TIFF_SSHORT:
2610 : case TIFF_LONG:
2611 : case TIFF_SLONG:
2612 : case TIFF_LONG8:
2613 : case TIFF_SLONG8:
2614 0 : break;
2615 0 : default:
2616 0 : return (TIFFReadDirEntryErrType);
2617 : }
2618 0 : err = TIFFReadDirEntryArray(tif, direntry, &count, 8, &origdata);
2619 0 : if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
2620 : {
2621 0 : *value = 0;
2622 0 : return (err);
2623 : }
2624 0 : switch (direntry->tdir_type)
2625 : {
2626 0 : case TIFF_LONG8:
2627 : {
2628 : uint64_t *m;
2629 : uint32_t n;
2630 0 : m = (uint64_t *)origdata;
2631 0 : for (n = 0; n < count; n++)
2632 : {
2633 0 : if (tif->tif_flags & TIFF_SWAB)
2634 0 : TIFFSwabLong8(m);
2635 0 : err = TIFFReadDirEntryCheckRangeSlong8Long8(*m);
2636 0 : if (err != TIFFReadDirEntryErrOk)
2637 : {
2638 0 : _TIFFfreeExt(tif, origdata);
2639 0 : return (err);
2640 : }
2641 0 : m++;
2642 : }
2643 0 : *value = (int64_t *)origdata;
2644 0 : return (TIFFReadDirEntryErrOk);
2645 : }
2646 0 : case TIFF_SLONG8:
2647 0 : *value = (int64_t *)origdata;
2648 0 : if (tif->tif_flags & TIFF_SWAB)
2649 0 : TIFFSwabArrayOfLong8((uint64_t *)(*value), count);
2650 0 : return (TIFFReadDirEntryErrOk);
2651 : }
2652 0 : data = (int64_t *)_TIFFmallocExt(tif, count * 8);
2653 0 : if (data == 0)
2654 : {
2655 0 : _TIFFfreeExt(tif, origdata);
2656 0 : return (TIFFReadDirEntryErrAlloc);
2657 : }
2658 0 : switch (direntry->tdir_type)
2659 : {
2660 0 : case TIFF_BYTE:
2661 : {
2662 : uint8_t *ma;
2663 : int64_t *mb;
2664 : uint32_t n;
2665 0 : ma = (uint8_t *)origdata;
2666 0 : mb = data;
2667 0 : for (n = 0; n < count; n++)
2668 0 : *mb++ = (int64_t)(*ma++);
2669 : }
2670 0 : break;
2671 0 : case TIFF_SBYTE:
2672 : {
2673 : int8_t *ma;
2674 : int64_t *mb;
2675 : uint32_t n;
2676 0 : ma = (int8_t *)origdata;
2677 0 : mb = data;
2678 0 : for (n = 0; n < count; n++)
2679 0 : *mb++ = (int64_t)(*ma++);
2680 : }
2681 0 : break;
2682 0 : case TIFF_SHORT:
2683 : {
2684 : uint16_t *ma;
2685 : int64_t *mb;
2686 : uint32_t n;
2687 0 : ma = (uint16_t *)origdata;
2688 0 : mb = data;
2689 0 : for (n = 0; n < count; n++)
2690 : {
2691 0 : if (tif->tif_flags & TIFF_SWAB)
2692 0 : TIFFSwabShort(ma);
2693 0 : *mb++ = (int64_t)(*ma++);
2694 : }
2695 : }
2696 0 : break;
2697 0 : case TIFF_SSHORT:
2698 : {
2699 : int16_t *ma;
2700 : int64_t *mb;
2701 : uint32_t n;
2702 0 : ma = (int16_t *)origdata;
2703 0 : mb = data;
2704 0 : for (n = 0; n < count; n++)
2705 : {
2706 0 : if (tif->tif_flags & TIFF_SWAB)
2707 0 : TIFFSwabShort((uint16_t *)ma);
2708 0 : *mb++ = (int64_t)(*ma++);
2709 : }
2710 : }
2711 0 : break;
2712 0 : case TIFF_LONG:
2713 : {
2714 : uint32_t *ma;
2715 : int64_t *mb;
2716 : uint32_t n;
2717 0 : ma = (uint32_t *)origdata;
2718 0 : mb = data;
2719 0 : for (n = 0; n < count; n++)
2720 : {
2721 0 : if (tif->tif_flags & TIFF_SWAB)
2722 0 : TIFFSwabLong(ma);
2723 0 : *mb++ = (int64_t)(*ma++);
2724 : }
2725 : }
2726 0 : break;
2727 0 : case TIFF_SLONG:
2728 : {
2729 : int32_t *ma;
2730 : int64_t *mb;
2731 : uint32_t n;
2732 0 : ma = (int32_t *)origdata;
2733 0 : mb = data;
2734 0 : for (n = 0; n < count; n++)
2735 : {
2736 0 : if (tif->tif_flags & TIFF_SWAB)
2737 0 : TIFFSwabLong((uint32_t *)ma);
2738 0 : *mb++ = (int64_t)(*ma++);
2739 : }
2740 : }
2741 0 : break;
2742 : }
2743 0 : _TIFFfreeExt(tif, origdata);
2744 0 : *value = data;
2745 0 : return (TIFFReadDirEntryErrOk);
2746 : }
2747 :
2748 : static enum TIFFReadDirEntryErr
2749 1071 : TIFFReadDirEntryFloatArray(TIFF *tif, TIFFDirEntry *direntry, float **value)
2750 : {
2751 : enum TIFFReadDirEntryErr err;
2752 : uint32_t count;
2753 : void *origdata;
2754 : float *data;
2755 1071 : switch (direntry->tdir_type)
2756 : {
2757 1071 : case TIFF_BYTE:
2758 : case TIFF_SBYTE:
2759 : case TIFF_SHORT:
2760 : case TIFF_SSHORT:
2761 : case TIFF_LONG:
2762 : case TIFF_SLONG:
2763 : case TIFF_LONG8:
2764 : case TIFF_SLONG8:
2765 : case TIFF_RATIONAL:
2766 : case TIFF_SRATIONAL:
2767 : case TIFF_FLOAT:
2768 : case TIFF_DOUBLE:
2769 1071 : break;
2770 0 : default:
2771 0 : return (TIFFReadDirEntryErrType);
2772 : }
2773 1071 : err = TIFFReadDirEntryArray(tif, direntry, &count, 4, &origdata);
2774 1071 : if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
2775 : {
2776 0 : *value = 0;
2777 0 : return (err);
2778 : }
2779 1071 : switch (direntry->tdir_type)
2780 : {
2781 0 : case TIFF_FLOAT:
2782 0 : if (tif->tif_flags & TIFF_SWAB)
2783 0 : TIFFSwabArrayOfLong((uint32_t *)origdata, count);
2784 : TIFFCvtIEEEDoubleToNative(tif, count, (float *)origdata);
2785 0 : *value = (float *)origdata;
2786 0 : return (TIFFReadDirEntryErrOk);
2787 : }
2788 1071 : data = (float *)_TIFFmallocExt(tif, count * sizeof(float));
2789 1071 : if (data == 0)
2790 : {
2791 0 : _TIFFfreeExt(tif, origdata);
2792 0 : return (TIFFReadDirEntryErrAlloc);
2793 : }
2794 1071 : switch (direntry->tdir_type)
2795 : {
2796 0 : case TIFF_BYTE:
2797 : {
2798 : uint8_t *ma;
2799 : float *mb;
2800 : uint32_t n;
2801 0 : ma = (uint8_t *)origdata;
2802 0 : mb = data;
2803 0 : for (n = 0; n < count; n++)
2804 0 : *mb++ = (float)(*ma++);
2805 : }
2806 0 : break;
2807 0 : case TIFF_SBYTE:
2808 : {
2809 : int8_t *ma;
2810 : float *mb;
2811 : uint32_t n;
2812 0 : ma = (int8_t *)origdata;
2813 0 : mb = data;
2814 0 : for (n = 0; n < count; n++)
2815 0 : *mb++ = (float)(*ma++);
2816 : }
2817 0 : break;
2818 0 : case TIFF_SHORT:
2819 : {
2820 : uint16_t *ma;
2821 : float *mb;
2822 : uint32_t n;
2823 0 : ma = (uint16_t *)origdata;
2824 0 : mb = data;
2825 0 : for (n = 0; n < count; n++)
2826 : {
2827 0 : if (tif->tif_flags & TIFF_SWAB)
2828 0 : TIFFSwabShort(ma);
2829 0 : *mb++ = (float)(*ma++);
2830 : }
2831 : }
2832 0 : break;
2833 0 : case TIFF_SSHORT:
2834 : {
2835 : int16_t *ma;
2836 : float *mb;
2837 : uint32_t n;
2838 0 : ma = (int16_t *)origdata;
2839 0 : mb = data;
2840 0 : for (n = 0; n < count; n++)
2841 : {
2842 0 : if (tif->tif_flags & TIFF_SWAB)
2843 0 : TIFFSwabShort((uint16_t *)ma);
2844 0 : *mb++ = (float)(*ma++);
2845 : }
2846 : }
2847 0 : break;
2848 2 : case TIFF_LONG:
2849 : {
2850 : uint32_t *ma;
2851 : float *mb;
2852 : uint32_t n;
2853 2 : ma = (uint32_t *)origdata;
2854 2 : mb = data;
2855 14 : for (n = 0; n < count; n++)
2856 : {
2857 12 : if (tif->tif_flags & TIFF_SWAB)
2858 12 : TIFFSwabLong(ma);
2859 12 : *mb++ = (float)(*ma++);
2860 : }
2861 : }
2862 2 : break;
2863 0 : case TIFF_SLONG:
2864 : {
2865 : int32_t *ma;
2866 : float *mb;
2867 : uint32_t n;
2868 0 : ma = (int32_t *)origdata;
2869 0 : mb = data;
2870 0 : for (n = 0; n < count; n++)
2871 : {
2872 0 : if (tif->tif_flags & TIFF_SWAB)
2873 0 : TIFFSwabLong((uint32_t *)ma);
2874 0 : *mb++ = (float)(*ma++);
2875 : }
2876 : }
2877 0 : break;
2878 0 : case TIFF_LONG8:
2879 : {
2880 : uint64_t *ma;
2881 : float *mb;
2882 : uint32_t n;
2883 0 : ma = (uint64_t *)origdata;
2884 0 : mb = data;
2885 0 : for (n = 0; n < count; n++)
2886 : {
2887 0 : if (tif->tif_flags & TIFF_SWAB)
2888 0 : TIFFSwabLong8(ma);
2889 0 : *mb++ = (float)(*ma++);
2890 : }
2891 : }
2892 0 : break;
2893 0 : case TIFF_SLONG8:
2894 : {
2895 : int64_t *ma;
2896 : float *mb;
2897 : uint32_t n;
2898 0 : ma = (int64_t *)origdata;
2899 0 : mb = data;
2900 0 : for (n = 0; n < count; n++)
2901 : {
2902 0 : if (tif->tif_flags & TIFF_SWAB)
2903 0 : TIFFSwabLong8((uint64_t *)ma);
2904 0 : *mb++ = (float)(*ma++);
2905 : }
2906 : }
2907 0 : break;
2908 1069 : case TIFF_RATIONAL:
2909 : {
2910 : uint32_t *ma;
2911 : uint32_t maa;
2912 : uint32_t mab;
2913 : float *mb;
2914 : uint32_t n;
2915 1069 : ma = (uint32_t *)origdata;
2916 1069 : mb = data;
2917 7364 : for (n = 0; n < count; n++)
2918 : {
2919 6295 : if (tif->tif_flags & TIFF_SWAB)
2920 96 : TIFFSwabLong(ma);
2921 6295 : maa = *ma++;
2922 6295 : if (tif->tif_flags & TIFF_SWAB)
2923 96 : TIFFSwabLong(ma);
2924 6295 : mab = *ma++;
2925 6295 : if (mab == 0)
2926 0 : *mb++ = 0.0;
2927 : else
2928 6295 : *mb++ = (float)maa / (float)mab;
2929 : }
2930 : }
2931 1069 : break;
2932 0 : case TIFF_SRATIONAL:
2933 : {
2934 : uint32_t *ma;
2935 : int32_t maa;
2936 : uint32_t mab;
2937 : float *mb;
2938 : uint32_t n;
2939 0 : ma = (uint32_t *)origdata;
2940 0 : mb = data;
2941 0 : for (n = 0; n < count; n++)
2942 : {
2943 0 : if (tif->tif_flags & TIFF_SWAB)
2944 0 : TIFFSwabLong(ma);
2945 0 : maa = *(int32_t *)ma;
2946 0 : ma++;
2947 0 : if (tif->tif_flags & TIFF_SWAB)
2948 0 : TIFFSwabLong(ma);
2949 0 : mab = *ma++;
2950 0 : if (mab == 0)
2951 0 : *mb++ = 0.0;
2952 : else
2953 0 : *mb++ = (float)maa / (float)mab;
2954 : }
2955 : }
2956 0 : break;
2957 0 : case TIFF_DOUBLE:
2958 : {
2959 : double *ma;
2960 : float *mb;
2961 : uint32_t n;
2962 0 : if (tif->tif_flags & TIFF_SWAB)
2963 0 : TIFFSwabArrayOfLong8((uint64_t *)origdata, count);
2964 : TIFFCvtIEEEDoubleToNative(tif, count, (double *)origdata);
2965 0 : ma = (double *)origdata;
2966 0 : mb = data;
2967 0 : for (n = 0; n < count; n++)
2968 : {
2969 0 : double val = *ma++;
2970 0 : if (val > FLT_MAX)
2971 0 : val = FLT_MAX;
2972 0 : else if (val < -FLT_MAX)
2973 0 : val = -FLT_MAX;
2974 0 : *mb++ = (float)val;
2975 : }
2976 : }
2977 0 : break;
2978 : }
2979 1071 : _TIFFfreeExt(tif, origdata);
2980 1071 : *value = data;
2981 1071 : return (TIFFReadDirEntryErrOk);
2982 : }
2983 :
2984 : static enum TIFFReadDirEntryErr
2985 60999 : TIFFReadDirEntryDoubleArray(TIFF *tif, TIFFDirEntry *direntry, double **value)
2986 : {
2987 : enum TIFFReadDirEntryErr err;
2988 : uint32_t count;
2989 : void *origdata;
2990 : double *data;
2991 60999 : switch (direntry->tdir_type)
2992 : {
2993 60962 : case TIFF_BYTE:
2994 : case TIFF_SBYTE:
2995 : case TIFF_SHORT:
2996 : case TIFF_SSHORT:
2997 : case TIFF_LONG:
2998 : case TIFF_SLONG:
2999 : case TIFF_LONG8:
3000 : case TIFF_SLONG8:
3001 : case TIFF_RATIONAL:
3002 : case TIFF_SRATIONAL:
3003 : case TIFF_FLOAT:
3004 : case TIFF_DOUBLE:
3005 60962 : break;
3006 37 : default:
3007 37 : return (TIFFReadDirEntryErrType);
3008 : }
3009 60962 : err = TIFFReadDirEntryArray(tif, direntry, &count, 8, &origdata);
3010 60879 : if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
3011 : {
3012 42 : *value = 0;
3013 42 : return (err);
3014 : }
3015 60837 : switch (direntry->tdir_type)
3016 : {
3017 60859 : case TIFF_DOUBLE:
3018 60859 : if (tif->tif_flags & TIFF_SWAB)
3019 281 : TIFFSwabArrayOfLong8((uint64_t *)origdata, count);
3020 : TIFFCvtIEEEDoubleToNative(tif, count, (double *)origdata);
3021 60877 : *value = (double *)origdata;
3022 60877 : return (TIFFReadDirEntryErrOk);
3023 : }
3024 0 : data = (double *)_TIFFmallocExt(tif, count * sizeof(double));
3025 0 : if (data == 0)
3026 : {
3027 0 : _TIFFfreeExt(tif, origdata);
3028 0 : return (TIFFReadDirEntryErrAlloc);
3029 : }
3030 0 : switch (direntry->tdir_type)
3031 : {
3032 0 : case TIFF_BYTE:
3033 : {
3034 : uint8_t *ma;
3035 : double *mb;
3036 : uint32_t n;
3037 0 : ma = (uint8_t *)origdata;
3038 0 : mb = data;
3039 0 : for (n = 0; n < count; n++)
3040 0 : *mb++ = (double)(*ma++);
3041 : }
3042 0 : break;
3043 0 : case TIFF_SBYTE:
3044 : {
3045 : int8_t *ma;
3046 : double *mb;
3047 : uint32_t n;
3048 0 : ma = (int8_t *)origdata;
3049 0 : mb = data;
3050 0 : for (n = 0; n < count; n++)
3051 0 : *mb++ = (double)(*ma++);
3052 : }
3053 0 : break;
3054 0 : case TIFF_SHORT:
3055 : {
3056 : uint16_t *ma;
3057 : double *mb;
3058 : uint32_t n;
3059 0 : ma = (uint16_t *)origdata;
3060 0 : mb = data;
3061 0 : for (n = 0; n < count; n++)
3062 : {
3063 0 : if (tif->tif_flags & TIFF_SWAB)
3064 0 : TIFFSwabShort(ma);
3065 0 : *mb++ = (double)(*ma++);
3066 : }
3067 : }
3068 0 : break;
3069 0 : case TIFF_SSHORT:
3070 : {
3071 : int16_t *ma;
3072 : double *mb;
3073 : uint32_t n;
3074 0 : ma = (int16_t *)origdata;
3075 0 : mb = data;
3076 0 : for (n = 0; n < count; n++)
3077 : {
3078 0 : if (tif->tif_flags & TIFF_SWAB)
3079 0 : TIFFSwabShort((uint16_t *)ma);
3080 0 : *mb++ = (double)(*ma++);
3081 : }
3082 : }
3083 0 : break;
3084 0 : case TIFF_LONG:
3085 : {
3086 : uint32_t *ma;
3087 : double *mb;
3088 : uint32_t n;
3089 0 : ma = (uint32_t *)origdata;
3090 0 : mb = data;
3091 0 : for (n = 0; n < count; n++)
3092 : {
3093 0 : if (tif->tif_flags & TIFF_SWAB)
3094 0 : TIFFSwabLong(ma);
3095 0 : *mb++ = (double)(*ma++);
3096 : }
3097 : }
3098 0 : break;
3099 0 : case TIFF_SLONG:
3100 : {
3101 : int32_t *ma;
3102 : double *mb;
3103 : uint32_t n;
3104 0 : ma = (int32_t *)origdata;
3105 0 : mb = data;
3106 0 : for (n = 0; n < count; n++)
3107 : {
3108 0 : if (tif->tif_flags & TIFF_SWAB)
3109 0 : TIFFSwabLong((uint32_t *)ma);
3110 0 : *mb++ = (double)(*ma++);
3111 : }
3112 : }
3113 0 : break;
3114 0 : case TIFF_LONG8:
3115 : {
3116 : uint64_t *ma;
3117 : double *mb;
3118 : uint32_t n;
3119 0 : ma = (uint64_t *)origdata;
3120 0 : mb = data;
3121 0 : for (n = 0; n < count; n++)
3122 : {
3123 0 : if (tif->tif_flags & TIFF_SWAB)
3124 0 : TIFFSwabLong8(ma);
3125 0 : *mb++ = (double)(*ma++);
3126 : }
3127 : }
3128 0 : break;
3129 0 : case TIFF_SLONG8:
3130 : {
3131 : int64_t *ma;
3132 : double *mb;
3133 : uint32_t n;
3134 0 : ma = (int64_t *)origdata;
3135 0 : mb = data;
3136 0 : for (n = 0; n < count; n++)
3137 : {
3138 0 : if (tif->tif_flags & TIFF_SWAB)
3139 0 : TIFFSwabLong8((uint64_t *)ma);
3140 0 : *mb++ = (double)(*ma++);
3141 : }
3142 : }
3143 0 : break;
3144 0 : case TIFF_RATIONAL:
3145 : {
3146 : uint32_t *ma;
3147 : uint32_t maa;
3148 : uint32_t mab;
3149 : double *mb;
3150 : uint32_t n;
3151 0 : ma = (uint32_t *)origdata;
3152 0 : mb = data;
3153 0 : for (n = 0; n < count; n++)
3154 : {
3155 0 : if (tif->tif_flags & TIFF_SWAB)
3156 0 : TIFFSwabLong(ma);
3157 0 : maa = *ma++;
3158 0 : if (tif->tif_flags & TIFF_SWAB)
3159 0 : TIFFSwabLong(ma);
3160 0 : mab = *ma++;
3161 0 : if (mab == 0)
3162 0 : *mb++ = 0.0;
3163 : else
3164 0 : *mb++ = (double)maa / (double)mab;
3165 : }
3166 : }
3167 0 : break;
3168 0 : case TIFF_SRATIONAL:
3169 : {
3170 : uint32_t *ma;
3171 : int32_t maa;
3172 : uint32_t mab;
3173 : double *mb;
3174 : uint32_t n;
3175 0 : ma = (uint32_t *)origdata;
3176 0 : mb = data;
3177 0 : for (n = 0; n < count; n++)
3178 : {
3179 0 : if (tif->tif_flags & TIFF_SWAB)
3180 0 : TIFFSwabLong(ma);
3181 0 : maa = *(int32_t *)ma;
3182 0 : ma++;
3183 0 : if (tif->tif_flags & TIFF_SWAB)
3184 0 : TIFFSwabLong(ma);
3185 0 : mab = *ma++;
3186 0 : if (mab == 0)
3187 0 : *mb++ = 0.0;
3188 : else
3189 0 : *mb++ = (double)maa / (double)mab;
3190 : }
3191 : }
3192 0 : break;
3193 0 : case TIFF_FLOAT:
3194 : {
3195 : float *ma;
3196 : double *mb;
3197 : uint32_t n;
3198 0 : if (tif->tif_flags & TIFF_SWAB)
3199 0 : TIFFSwabArrayOfLong((uint32_t *)origdata, count);
3200 : TIFFCvtIEEEFloatToNative(tif, count, (float *)origdata);
3201 0 : ma = (float *)origdata;
3202 0 : mb = data;
3203 0 : for (n = 0; n < count; n++)
3204 0 : *mb++ = (double)(*ma++);
3205 : }
3206 0 : break;
3207 : }
3208 0 : _TIFFfreeExt(tif, origdata);
3209 0 : *value = data;
3210 0 : return (TIFFReadDirEntryErrOk);
3211 : }
3212 :
3213 : static enum TIFFReadDirEntryErr
3214 60 : TIFFReadDirEntryIfd8Array(TIFF *tif, TIFFDirEntry *direntry, uint64_t **value)
3215 : {
3216 : enum TIFFReadDirEntryErr err;
3217 : uint32_t count;
3218 : void *origdata;
3219 : uint64_t *data;
3220 60 : switch (direntry->tdir_type)
3221 : {
3222 60 : case TIFF_LONG:
3223 : case TIFF_LONG8:
3224 : case TIFF_IFD:
3225 : case TIFF_IFD8:
3226 60 : break;
3227 0 : default:
3228 0 : return (TIFFReadDirEntryErrType);
3229 : }
3230 60 : err = TIFFReadDirEntryArray(tif, direntry, &count, 8, &origdata);
3231 60 : if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
3232 : {
3233 0 : *value = 0;
3234 0 : return (err);
3235 : }
3236 60 : switch (direntry->tdir_type)
3237 : {
3238 0 : case TIFF_LONG8:
3239 : case TIFF_IFD8:
3240 0 : *value = (uint64_t *)origdata;
3241 0 : if (tif->tif_flags & TIFF_SWAB)
3242 0 : TIFFSwabArrayOfLong8(*value, count);
3243 0 : return (TIFFReadDirEntryErrOk);
3244 : }
3245 60 : data = (uint64_t *)_TIFFmallocExt(tif, count * 8);
3246 60 : if (data == 0)
3247 : {
3248 0 : _TIFFfreeExt(tif, origdata);
3249 0 : return (TIFFReadDirEntryErrAlloc);
3250 : }
3251 60 : switch (direntry->tdir_type)
3252 : {
3253 60 : case TIFF_LONG:
3254 : case TIFF_IFD:
3255 : {
3256 : uint32_t *ma;
3257 : uint64_t *mb;
3258 : uint32_t n;
3259 60 : ma = (uint32_t *)origdata;
3260 60 : mb = data;
3261 180 : for (n = 0; n < count; n++)
3262 : {
3263 120 : if (tif->tif_flags & TIFF_SWAB)
3264 0 : TIFFSwabLong(ma);
3265 120 : *mb++ = (uint64_t)(*ma++);
3266 : }
3267 : }
3268 60 : break;
3269 : }
3270 60 : _TIFFfreeExt(tif, origdata);
3271 60 : *value = data;
3272 60 : return (TIFFReadDirEntryErrOk);
3273 : }
3274 :
3275 : static enum TIFFReadDirEntryErr
3276 28023 : TIFFReadDirEntryPersampleShort(TIFF *tif, TIFFDirEntry *direntry,
3277 : uint16_t *value)
3278 : {
3279 : enum TIFFReadDirEntryErr err;
3280 : uint16_t *m;
3281 : uint16_t *na;
3282 : uint16_t nb;
3283 28023 : if (direntry->tdir_count < (uint64_t)tif->tif_dir.td_samplesperpixel)
3284 0 : return (TIFFReadDirEntryErrCount);
3285 28023 : err = TIFFReadDirEntryShortArray(tif, direntry, &m);
3286 28024 : if (err != TIFFReadDirEntryErrOk || m == NULL)
3287 2 : return (err);
3288 28022 : na = m;
3289 28022 : nb = tif->tif_dir.td_samplesperpixel;
3290 28022 : *value = *na++;
3291 28022 : nb--;
3292 1267820 : while (nb > 0)
3293 : {
3294 1239800 : if (*na++ != *value)
3295 : {
3296 0 : err = TIFFReadDirEntryErrPsdif;
3297 0 : break;
3298 : }
3299 1239800 : nb--;
3300 : }
3301 28022 : _TIFFfreeExt(tif, m);
3302 28023 : return (err);
3303 : }
3304 :
3305 0 : static void TIFFReadDirEntryCheckedByte(TIFF *tif, TIFFDirEntry *direntry,
3306 : uint8_t *value)
3307 : {
3308 : (void)tif;
3309 0 : *value = *(uint8_t *)(&direntry->tdir_offset);
3310 0 : }
3311 :
3312 0 : static void TIFFReadDirEntryCheckedSbyte(TIFF *tif, TIFFDirEntry *direntry,
3313 : int8_t *value)
3314 : {
3315 : (void)tif;
3316 0 : *value = *(int8_t *)(&direntry->tdir_offset);
3317 0 : }
3318 :
3319 377971 : static void TIFFReadDirEntryCheckedShort(TIFF *tif, TIFFDirEntry *direntry,
3320 : uint16_t *value)
3321 : {
3322 377971 : *value = direntry->tdir_offset.toff_short;
3323 : /* *value=*(uint16_t*)(&direntry->tdir_offset); */
3324 377971 : if (tif->tif_flags & TIFF_SWAB)
3325 4731 : TIFFSwabShort(value);
3326 377971 : }
3327 :
3328 0 : static void TIFFReadDirEntryCheckedSshort(TIFF *tif, TIFFDirEntry *direntry,
3329 : int16_t *value)
3330 : {
3331 0 : *value = *(int16_t *)(&direntry->tdir_offset);
3332 0 : if (tif->tif_flags & TIFF_SWAB)
3333 0 : TIFFSwabShort((uint16_t *)value);
3334 0 : }
3335 :
3336 5358 : static void TIFFReadDirEntryCheckedLong(TIFF *tif, TIFFDirEntry *direntry,
3337 : uint32_t *value)
3338 : {
3339 5358 : *value = *(uint32_t *)(&direntry->tdir_offset);
3340 5358 : if (tif->tif_flags & TIFF_SWAB)
3341 114 : TIFFSwabLong(value);
3342 5358 : }
3343 :
3344 0 : static void TIFFReadDirEntryCheckedSlong(TIFF *tif, TIFFDirEntry *direntry,
3345 : int32_t *value)
3346 : {
3347 0 : *value = *(int32_t *)(&direntry->tdir_offset);
3348 0 : if (tif->tif_flags & TIFF_SWAB)
3349 0 : TIFFSwabLong((uint32_t *)value);
3350 0 : }
3351 :
3352 : static enum TIFFReadDirEntryErr
3353 0 : TIFFReadDirEntryCheckedLong8(TIFF *tif, TIFFDirEntry *direntry, uint64_t *value)
3354 : {
3355 0 : if (!(tif->tif_flags & TIFF_BIGTIFF))
3356 : {
3357 : enum TIFFReadDirEntryErr err;
3358 0 : uint32_t offset = direntry->tdir_offset.toff_long;
3359 0 : if (tif->tif_flags & TIFF_SWAB)
3360 0 : TIFFSwabLong(&offset);
3361 0 : err = TIFFReadDirEntryData(tif, offset, 8, value);
3362 0 : if (err != TIFFReadDirEntryErrOk)
3363 0 : return (err);
3364 : }
3365 : else
3366 0 : *value = direntry->tdir_offset.toff_long8;
3367 0 : if (tif->tif_flags & TIFF_SWAB)
3368 0 : TIFFSwabLong8(value);
3369 0 : return (TIFFReadDirEntryErrOk);
3370 : }
3371 :
3372 : static enum TIFFReadDirEntryErr
3373 0 : TIFFReadDirEntryCheckedSlong8(TIFF *tif, TIFFDirEntry *direntry, int64_t *value)
3374 : {
3375 0 : if (!(tif->tif_flags & TIFF_BIGTIFF))
3376 : {
3377 : enum TIFFReadDirEntryErr err;
3378 0 : uint32_t offset = direntry->tdir_offset.toff_long;
3379 0 : if (tif->tif_flags & TIFF_SWAB)
3380 0 : TIFFSwabLong(&offset);
3381 0 : err = TIFFReadDirEntryData(tif, offset, 8, value);
3382 0 : if (err != TIFFReadDirEntryErrOk)
3383 0 : return (err);
3384 : }
3385 : else
3386 0 : *value = *(int64_t *)(&direntry->tdir_offset);
3387 0 : if (tif->tif_flags & TIFF_SWAB)
3388 0 : TIFFSwabLong8((uint64_t *)value);
3389 0 : return (TIFFReadDirEntryErrOk);
3390 : }
3391 :
3392 : static enum TIFFReadDirEntryErr
3393 246 : TIFFReadDirEntryCheckedRational(TIFF *tif, TIFFDirEntry *direntry,
3394 : double *value)
3395 : {
3396 : UInt64Aligned_t m;
3397 :
3398 : assert(sizeof(double) == 8);
3399 : assert(sizeof(uint64_t) == 8);
3400 : assert(sizeof(uint32_t) == 4);
3401 246 : if (!(tif->tif_flags & TIFF_BIGTIFF))
3402 : {
3403 : enum TIFFReadDirEntryErr err;
3404 246 : uint32_t offset = direntry->tdir_offset.toff_long;
3405 246 : if (tif->tif_flags & TIFF_SWAB)
3406 8 : TIFFSwabLong(&offset);
3407 246 : err = TIFFReadDirEntryData(tif, offset, 8, m.i);
3408 246 : if (err != TIFFReadDirEntryErrOk)
3409 0 : return (err);
3410 : }
3411 : else
3412 0 : m.l = direntry->tdir_offset.toff_long8;
3413 246 : if (tif->tif_flags & TIFF_SWAB)
3414 8 : TIFFSwabArrayOfLong(m.i, 2);
3415 : /* Not completely sure what we should do when m.i[1]==0, but some */
3416 : /* sanitizers do not like division by 0.0: */
3417 : /* http://bugzilla.maptools.org/show_bug.cgi?id=2644 */
3418 246 : if (m.i[0] == 0 || m.i[1] == 0)
3419 36 : *value = 0.0;
3420 : else
3421 210 : *value = (double)m.i[0] / (double)m.i[1];
3422 246 : return (TIFFReadDirEntryErrOk);
3423 : }
3424 :
3425 : static enum TIFFReadDirEntryErr
3426 0 : TIFFReadDirEntryCheckedSrational(TIFF *tif, TIFFDirEntry *direntry,
3427 : double *value)
3428 : {
3429 : UInt64Aligned_t m;
3430 : assert(sizeof(double) == 8);
3431 : assert(sizeof(uint64_t) == 8);
3432 : assert(sizeof(int32_t) == 4);
3433 : assert(sizeof(uint32_t) == 4);
3434 0 : if (!(tif->tif_flags & TIFF_BIGTIFF))
3435 : {
3436 : enum TIFFReadDirEntryErr err;
3437 0 : uint32_t offset = direntry->tdir_offset.toff_long;
3438 0 : if (tif->tif_flags & TIFF_SWAB)
3439 0 : TIFFSwabLong(&offset);
3440 0 : err = TIFFReadDirEntryData(tif, offset, 8, m.i);
3441 0 : if (err != TIFFReadDirEntryErrOk)
3442 0 : return (err);
3443 : }
3444 : else
3445 0 : m.l = direntry->tdir_offset.toff_long8;
3446 0 : if (tif->tif_flags & TIFF_SWAB)
3447 0 : TIFFSwabArrayOfLong(m.i, 2);
3448 : /* Not completely sure what we should do when m.i[1]==0, but some */
3449 : /* sanitizers do not like division by 0.0: */
3450 : /* http://bugzilla.maptools.org/show_bug.cgi?id=2644 */
3451 0 : if ((int32_t)m.i[0] == 0 || m.i[1] == 0)
3452 0 : *value = 0.0;
3453 : else
3454 0 : *value = (double)((int32_t)m.i[0]) / (double)m.i[1];
3455 0 : return (TIFFReadDirEntryErrOk);
3456 : }
3457 :
3458 : #if 0
3459 : static enum TIFFReadDirEntryErr
3460 : TIFFReadDirEntryCheckedRationalDirect(TIFF *tif, TIFFDirEntry *direntry,
3461 : TIFFRational_t *value)
3462 : { /*--: SetGetRATIONAL_directly:_CustomTag: Read rational (and signed rationals)
3463 : directly --*/
3464 : UInt64Aligned_t m;
3465 :
3466 : assert(sizeof(double) == 8);
3467 : assert(sizeof(uint64_t) == 8);
3468 : assert(sizeof(uint32_t) == 4);
3469 :
3470 : if (direntry->tdir_count != 1)
3471 : return (TIFFReadDirEntryErrCount);
3472 :
3473 : if (direntry->tdir_type != TIFF_RATIONAL &&
3474 : direntry->tdir_type != TIFF_SRATIONAL)
3475 : return (TIFFReadDirEntryErrType);
3476 :
3477 : if (!(tif->tif_flags & TIFF_BIGTIFF))
3478 : {
3479 : enum TIFFReadDirEntryErr err;
3480 : uint32_t offset = direntry->tdir_offset.toff_long;
3481 : if (tif->tif_flags & TIFF_SWAB)
3482 : TIFFSwabLong(&offset);
3483 : err = TIFFReadDirEntryData(tif, offset, 8, m.i);
3484 : if (err != TIFFReadDirEntryErrOk)
3485 : return (err);
3486 : }
3487 : else
3488 : {
3489 : m.l = direntry->tdir_offset.toff_long8;
3490 : }
3491 :
3492 : if (tif->tif_flags & TIFF_SWAB)
3493 : TIFFSwabArrayOfLong(m.i, 2);
3494 :
3495 : value->uNum = m.i[0];
3496 : value->uDenom = m.i[1];
3497 : return (TIFFReadDirEntryErrOk);
3498 : } /*-- TIFFReadDirEntryCheckedRationalDirect() --*/
3499 : #endif
3500 :
3501 0 : static void TIFFReadDirEntryCheckedFloat(TIFF *tif, TIFFDirEntry *direntry,
3502 : float *value)
3503 : {
3504 : union
3505 : {
3506 : float f;
3507 : uint32_t i;
3508 : } float_union;
3509 : assert(sizeof(float) == 4);
3510 : assert(sizeof(uint32_t) == 4);
3511 : assert(sizeof(float_union) == 4);
3512 0 : float_union.i = *(uint32_t *)(&direntry->tdir_offset);
3513 0 : *value = float_union.f;
3514 0 : if (tif->tif_flags & TIFF_SWAB)
3515 0 : TIFFSwabLong((uint32_t *)value);
3516 0 : }
3517 :
3518 : static enum TIFFReadDirEntryErr
3519 0 : TIFFReadDirEntryCheckedDouble(TIFF *tif, TIFFDirEntry *direntry, double *value)
3520 : {
3521 : assert(sizeof(double) == 8);
3522 : assert(sizeof(uint64_t) == 8);
3523 : assert(sizeof(UInt64Aligned_t) == 8);
3524 0 : if (!(tif->tif_flags & TIFF_BIGTIFF))
3525 : {
3526 : enum TIFFReadDirEntryErr err;
3527 0 : uint32_t offset = direntry->tdir_offset.toff_long;
3528 0 : if (tif->tif_flags & TIFF_SWAB)
3529 0 : TIFFSwabLong(&offset);
3530 0 : err = TIFFReadDirEntryData(tif, offset, 8, value);
3531 0 : if (err != TIFFReadDirEntryErrOk)
3532 0 : return (err);
3533 : }
3534 : else
3535 : {
3536 : UInt64Aligned_t uint64_union;
3537 0 : uint64_union.l = direntry->tdir_offset.toff_long8;
3538 0 : *value = uint64_union.d;
3539 : }
3540 0 : if (tif->tif_flags & TIFF_SWAB)
3541 0 : TIFFSwabLong8((uint64_t *)value);
3542 0 : return (TIFFReadDirEntryErrOk);
3543 : }
3544 :
3545 : static enum TIFFReadDirEntryErr
3546 0 : TIFFReadDirEntryCheckRangeByteSbyte(int8_t value)
3547 : {
3548 0 : if (value < 0)
3549 0 : return (TIFFReadDirEntryErrRange);
3550 : else
3551 0 : return (TIFFReadDirEntryErrOk);
3552 : }
3553 :
3554 : static enum TIFFReadDirEntryErr
3555 0 : TIFFReadDirEntryCheckRangeByteShort(uint16_t value)
3556 : {
3557 0 : if (value > 0xFF)
3558 0 : return (TIFFReadDirEntryErrRange);
3559 : else
3560 0 : return (TIFFReadDirEntryErrOk);
3561 : }
3562 :
3563 : static enum TIFFReadDirEntryErr
3564 0 : TIFFReadDirEntryCheckRangeByteSshort(int16_t value)
3565 : {
3566 0 : if ((value < 0) || (value > 0xFF))
3567 0 : return (TIFFReadDirEntryErrRange);
3568 : else
3569 0 : return (TIFFReadDirEntryErrOk);
3570 : }
3571 :
3572 : static enum TIFFReadDirEntryErr
3573 0 : TIFFReadDirEntryCheckRangeByteLong(uint32_t value)
3574 : {
3575 0 : if (value > 0xFF)
3576 0 : return (TIFFReadDirEntryErrRange);
3577 : else
3578 0 : return (TIFFReadDirEntryErrOk);
3579 : }
3580 :
3581 : static enum TIFFReadDirEntryErr
3582 0 : TIFFReadDirEntryCheckRangeByteSlong(int32_t value)
3583 : {
3584 0 : if ((value < 0) || (value > 0xFF))
3585 0 : return (TIFFReadDirEntryErrRange);
3586 : else
3587 0 : return (TIFFReadDirEntryErrOk);
3588 : }
3589 :
3590 : static enum TIFFReadDirEntryErr
3591 0 : TIFFReadDirEntryCheckRangeByteLong8(uint64_t value)
3592 : {
3593 0 : if (value > 0xFF)
3594 0 : return (TIFFReadDirEntryErrRange);
3595 : else
3596 0 : return (TIFFReadDirEntryErrOk);
3597 : }
3598 :
3599 : static enum TIFFReadDirEntryErr
3600 0 : TIFFReadDirEntryCheckRangeByteSlong8(int64_t value)
3601 : {
3602 0 : if ((value < 0) || (value > 0xFF))
3603 0 : return (TIFFReadDirEntryErrRange);
3604 : else
3605 0 : return (TIFFReadDirEntryErrOk);
3606 : }
3607 :
3608 : static enum TIFFReadDirEntryErr
3609 0 : TIFFReadDirEntryCheckRangeSbyteByte(uint8_t value)
3610 : {
3611 0 : if (value > 0x7F)
3612 0 : return (TIFFReadDirEntryErrRange);
3613 : else
3614 0 : return (TIFFReadDirEntryErrOk);
3615 : }
3616 :
3617 : static enum TIFFReadDirEntryErr
3618 0 : TIFFReadDirEntryCheckRangeSbyteShort(uint16_t value)
3619 : {
3620 0 : if (value > 0x7F)
3621 0 : return (TIFFReadDirEntryErrRange);
3622 : else
3623 0 : return (TIFFReadDirEntryErrOk);
3624 : }
3625 :
3626 : static enum TIFFReadDirEntryErr
3627 0 : TIFFReadDirEntryCheckRangeSbyteSshort(int16_t value)
3628 : {
3629 0 : if ((value < -0x80) || (value > 0x7F))
3630 0 : return (TIFFReadDirEntryErrRange);
3631 : else
3632 0 : return (TIFFReadDirEntryErrOk);
3633 : }
3634 :
3635 : static enum TIFFReadDirEntryErr
3636 0 : TIFFReadDirEntryCheckRangeSbyteLong(uint32_t value)
3637 : {
3638 0 : if (value > 0x7F)
3639 0 : return (TIFFReadDirEntryErrRange);
3640 : else
3641 0 : return (TIFFReadDirEntryErrOk);
3642 : }
3643 :
3644 : static enum TIFFReadDirEntryErr
3645 0 : TIFFReadDirEntryCheckRangeSbyteSlong(int32_t value)
3646 : {
3647 0 : if ((value < -0x80) || (value > 0x7F))
3648 0 : return (TIFFReadDirEntryErrRange);
3649 : else
3650 0 : return (TIFFReadDirEntryErrOk);
3651 : }
3652 :
3653 : static enum TIFFReadDirEntryErr
3654 0 : TIFFReadDirEntryCheckRangeSbyteLong8(uint64_t value)
3655 : {
3656 0 : if (value > 0x7F)
3657 0 : return (TIFFReadDirEntryErrRange);
3658 : else
3659 0 : return (TIFFReadDirEntryErrOk);
3660 : }
3661 :
3662 : static enum TIFFReadDirEntryErr
3663 0 : TIFFReadDirEntryCheckRangeSbyteSlong8(int64_t value)
3664 : {
3665 0 : if ((value < -0x80) || (value > 0x7F))
3666 0 : return (TIFFReadDirEntryErrRange);
3667 : else
3668 0 : return (TIFFReadDirEntryErrOk);
3669 : }
3670 :
3671 : static enum TIFFReadDirEntryErr
3672 0 : TIFFReadDirEntryCheckRangeShortSbyte(int8_t value)
3673 : {
3674 0 : if (value < 0)
3675 0 : return (TIFFReadDirEntryErrRange);
3676 : else
3677 0 : return (TIFFReadDirEntryErrOk);
3678 : }
3679 :
3680 : static enum TIFFReadDirEntryErr
3681 0 : TIFFReadDirEntryCheckRangeShortSshort(int16_t value)
3682 : {
3683 0 : if (value < 0)
3684 0 : return (TIFFReadDirEntryErrRange);
3685 : else
3686 0 : return (TIFFReadDirEntryErrOk);
3687 : }
3688 :
3689 : static enum TIFFReadDirEntryErr
3690 1 : TIFFReadDirEntryCheckRangeShortLong(uint32_t value)
3691 : {
3692 1 : if (value > 0xFFFF)
3693 0 : return (TIFFReadDirEntryErrRange);
3694 : else
3695 1 : return (TIFFReadDirEntryErrOk);
3696 : }
3697 :
3698 : static enum TIFFReadDirEntryErr
3699 0 : TIFFReadDirEntryCheckRangeShortSlong(int32_t value)
3700 : {
3701 0 : if ((value < 0) || (value > 0xFFFF))
3702 0 : return (TIFFReadDirEntryErrRange);
3703 : else
3704 0 : return (TIFFReadDirEntryErrOk);
3705 : }
3706 :
3707 : static enum TIFFReadDirEntryErr
3708 0 : TIFFReadDirEntryCheckRangeShortLong8(uint64_t value)
3709 : {
3710 0 : if (value > 0xFFFF)
3711 0 : return (TIFFReadDirEntryErrRange);
3712 : else
3713 0 : return (TIFFReadDirEntryErrOk);
3714 : }
3715 :
3716 : static enum TIFFReadDirEntryErr
3717 0 : TIFFReadDirEntryCheckRangeShortSlong8(int64_t value)
3718 : {
3719 0 : if ((value < 0) || (value > 0xFFFF))
3720 0 : return (TIFFReadDirEntryErrRange);
3721 : else
3722 0 : return (TIFFReadDirEntryErrOk);
3723 : }
3724 :
3725 : static enum TIFFReadDirEntryErr
3726 0 : TIFFReadDirEntryCheckRangeSshortShort(uint16_t value)
3727 : {
3728 0 : if (value > 0x7FFF)
3729 0 : return (TIFFReadDirEntryErrRange);
3730 : else
3731 0 : return (TIFFReadDirEntryErrOk);
3732 : }
3733 :
3734 : static enum TIFFReadDirEntryErr
3735 0 : TIFFReadDirEntryCheckRangeSshortLong(uint32_t value)
3736 : {
3737 0 : if (value > 0x7FFF)
3738 0 : return (TIFFReadDirEntryErrRange);
3739 : else
3740 0 : return (TIFFReadDirEntryErrOk);
3741 : }
3742 :
3743 : static enum TIFFReadDirEntryErr
3744 0 : TIFFReadDirEntryCheckRangeSshortSlong(int32_t value)
3745 : {
3746 0 : if ((value < -0x8000) || (value > 0x7FFF))
3747 0 : return (TIFFReadDirEntryErrRange);
3748 : else
3749 0 : return (TIFFReadDirEntryErrOk);
3750 : }
3751 :
3752 : static enum TIFFReadDirEntryErr
3753 0 : TIFFReadDirEntryCheckRangeSshortLong8(uint64_t value)
3754 : {
3755 0 : if (value > 0x7FFF)
3756 0 : return (TIFFReadDirEntryErrRange);
3757 : else
3758 0 : return (TIFFReadDirEntryErrOk);
3759 : }
3760 :
3761 : static enum TIFFReadDirEntryErr
3762 0 : TIFFReadDirEntryCheckRangeSshortSlong8(int64_t value)
3763 : {
3764 0 : if ((value < -0x8000) || (value > 0x7FFF))
3765 0 : return (TIFFReadDirEntryErrRange);
3766 : else
3767 0 : return (TIFFReadDirEntryErrOk);
3768 : }
3769 :
3770 : static enum TIFFReadDirEntryErr
3771 0 : TIFFReadDirEntryCheckRangeLongSbyte(int8_t value)
3772 : {
3773 0 : if (value < 0)
3774 0 : return (TIFFReadDirEntryErrRange);
3775 : else
3776 0 : return (TIFFReadDirEntryErrOk);
3777 : }
3778 :
3779 : static enum TIFFReadDirEntryErr
3780 0 : TIFFReadDirEntryCheckRangeLongSshort(int16_t value)
3781 : {
3782 0 : if (value < 0)
3783 0 : return (TIFFReadDirEntryErrRange);
3784 : else
3785 0 : return (TIFFReadDirEntryErrOk);
3786 : }
3787 :
3788 : static enum TIFFReadDirEntryErr
3789 0 : TIFFReadDirEntryCheckRangeLongSlong(int32_t value)
3790 : {
3791 0 : if (value < 0)
3792 0 : return (TIFFReadDirEntryErrRange);
3793 : else
3794 0 : return (TIFFReadDirEntryErrOk);
3795 : }
3796 :
3797 : static enum TIFFReadDirEntryErr
3798 0 : TIFFReadDirEntryCheckRangeLongLong8(uint64_t value)
3799 : {
3800 0 : if (value > UINT32_MAX)
3801 0 : return (TIFFReadDirEntryErrRange);
3802 : else
3803 0 : return (TIFFReadDirEntryErrOk);
3804 : }
3805 :
3806 : static enum TIFFReadDirEntryErr
3807 0 : TIFFReadDirEntryCheckRangeLongSlong8(int64_t value)
3808 : {
3809 0 : if ((value < 0) || (value > (int64_t)UINT32_MAX))
3810 0 : return (TIFFReadDirEntryErrRange);
3811 : else
3812 0 : return (TIFFReadDirEntryErrOk);
3813 : }
3814 :
3815 : static enum TIFFReadDirEntryErr
3816 0 : TIFFReadDirEntryCheckRangeSlongLong(uint32_t value)
3817 : {
3818 0 : if (value > 0x7FFFFFFFUL)
3819 0 : return (TIFFReadDirEntryErrRange);
3820 : else
3821 0 : return (TIFFReadDirEntryErrOk);
3822 : }
3823 :
3824 : /* Check that the 8-byte unsigned value can fit in a 4-byte unsigned range */
3825 : static enum TIFFReadDirEntryErr
3826 0 : TIFFReadDirEntryCheckRangeSlongLong8(uint64_t value)
3827 : {
3828 0 : if (value > 0x7FFFFFFF)
3829 0 : return (TIFFReadDirEntryErrRange);
3830 : else
3831 0 : return (TIFFReadDirEntryErrOk);
3832 : }
3833 :
3834 : /* Check that the 8-byte signed value can fit in a 4-byte signed range */
3835 : static enum TIFFReadDirEntryErr
3836 0 : TIFFReadDirEntryCheckRangeSlongSlong8(int64_t value)
3837 : {
3838 0 : if ((value < 0 - ((int64_t)0x7FFFFFFF + 1)) || (value > 0x7FFFFFFF))
3839 0 : return (TIFFReadDirEntryErrRange);
3840 : else
3841 0 : return (TIFFReadDirEntryErrOk);
3842 : }
3843 :
3844 : static enum TIFFReadDirEntryErr
3845 0 : TIFFReadDirEntryCheckRangeLong8Sbyte(int8_t value)
3846 : {
3847 0 : if (value < 0)
3848 0 : return (TIFFReadDirEntryErrRange);
3849 : else
3850 0 : return (TIFFReadDirEntryErrOk);
3851 : }
3852 :
3853 : static enum TIFFReadDirEntryErr
3854 0 : TIFFReadDirEntryCheckRangeLong8Sshort(int16_t value)
3855 : {
3856 0 : if (value < 0)
3857 0 : return (TIFFReadDirEntryErrRange);
3858 : else
3859 0 : return (TIFFReadDirEntryErrOk);
3860 : }
3861 :
3862 : static enum TIFFReadDirEntryErr
3863 0 : TIFFReadDirEntryCheckRangeLong8Slong(int32_t value)
3864 : {
3865 0 : if (value < 0)
3866 0 : return (TIFFReadDirEntryErrRange);
3867 : else
3868 0 : return (TIFFReadDirEntryErrOk);
3869 : }
3870 :
3871 : static enum TIFFReadDirEntryErr
3872 1 : TIFFReadDirEntryCheckRangeLong8Slong8(int64_t value)
3873 : {
3874 1 : if (value < 0)
3875 0 : return (TIFFReadDirEntryErrRange);
3876 : else
3877 1 : return (TIFFReadDirEntryErrOk);
3878 : }
3879 :
3880 : static enum TIFFReadDirEntryErr
3881 0 : TIFFReadDirEntryCheckRangeSlong8Long8(uint64_t value)
3882 : {
3883 0 : if (value > INT64_MAX)
3884 0 : return (TIFFReadDirEntryErrRange);
3885 : else
3886 0 : return (TIFFReadDirEntryErrOk);
3887 : }
3888 :
3889 278 : static enum TIFFReadDirEntryErr TIFFReadDirEntryData(TIFF *tif, uint64_t offset,
3890 : tmsize_t size, void *dest)
3891 : {
3892 278 : assert(size > 0);
3893 278 : if (!isMapped(tif))
3894 : {
3895 246 : if (!SeekOK(tif, offset))
3896 0 : return (TIFFReadDirEntryErrIo);
3897 246 : if (!ReadOK(tif, dest, size))
3898 0 : return (TIFFReadDirEntryErrIo);
3899 : }
3900 : else
3901 : {
3902 : size_t ma, mb;
3903 32 : ma = (size_t)offset;
3904 32 : if ((uint64_t)ma != offset || ma > (~(size_t)0) - (size_t)size)
3905 : {
3906 0 : return TIFFReadDirEntryErrIo;
3907 : }
3908 32 : mb = ma + size;
3909 32 : if (mb > (uint64_t)tif->tif_size)
3910 0 : return (TIFFReadDirEntryErrIo);
3911 32 : _TIFFmemcpy(dest, tif->tif_base + ma, size);
3912 : }
3913 278 : return (TIFFReadDirEntryErrOk);
3914 : }
3915 :
3916 12 : static void TIFFReadDirEntryOutputErr(TIFF *tif, enum TIFFReadDirEntryErr err,
3917 : const char *module, const char *tagname,
3918 : int recover)
3919 : {
3920 12 : if (!recover)
3921 : {
3922 0 : switch (err)
3923 : {
3924 0 : case TIFFReadDirEntryErrCount:
3925 0 : TIFFErrorExtR(tif, module, "Incorrect count for \"%s\"",
3926 : tagname);
3927 0 : break;
3928 0 : case TIFFReadDirEntryErrType:
3929 0 : TIFFErrorExtR(tif, module, "Incompatible type for \"%s\"",
3930 : tagname);
3931 0 : break;
3932 0 : case TIFFReadDirEntryErrIo:
3933 0 : TIFFErrorExtR(tif, module, "IO error during reading of \"%s\"",
3934 : tagname);
3935 0 : break;
3936 0 : case TIFFReadDirEntryErrRange:
3937 0 : TIFFErrorExtR(tif, module, "Incorrect value for \"%s\"",
3938 : tagname);
3939 0 : break;
3940 0 : case TIFFReadDirEntryErrPsdif:
3941 0 : TIFFErrorExtR(
3942 : tif, module,
3943 : "Cannot handle different values per sample for \"%s\"",
3944 : tagname);
3945 0 : break;
3946 0 : case TIFFReadDirEntryErrSizesan:
3947 0 : TIFFErrorExtR(tif, module,
3948 : "Sanity check on size of \"%s\" value failed",
3949 : tagname);
3950 0 : break;
3951 0 : case TIFFReadDirEntryErrAlloc:
3952 0 : TIFFErrorExtR(tif, module, "Out of memory reading of \"%s\"",
3953 : tagname);
3954 0 : break;
3955 0 : default:
3956 0 : assert(0); /* we should never get here */
3957 : break;
3958 : }
3959 : }
3960 : else
3961 : {
3962 12 : switch (err)
3963 : {
3964 2 : case TIFFReadDirEntryErrCount:
3965 2 : TIFFWarningExtR(tif, module,
3966 : "Incorrect count for \"%s\"; tag ignored",
3967 : tagname);
3968 2 : break;
3969 0 : case TIFFReadDirEntryErrType:
3970 0 : TIFFWarningExtR(tif, module,
3971 : "Incompatible type for \"%s\"; tag ignored",
3972 : tagname);
3973 0 : break;
3974 10 : case TIFFReadDirEntryErrIo:
3975 10 : TIFFWarningExtR(
3976 : tif, module,
3977 : "IO error during reading of \"%s\"; tag ignored", tagname);
3978 10 : break;
3979 0 : case TIFFReadDirEntryErrRange:
3980 0 : TIFFWarningExtR(tif, module,
3981 : "Incorrect value for \"%s\"; tag ignored",
3982 : tagname);
3983 0 : break;
3984 0 : case TIFFReadDirEntryErrPsdif:
3985 0 : TIFFWarningExtR(tif, module,
3986 : "Cannot handle different values per sample for "
3987 : "\"%s\"; tag ignored",
3988 : tagname);
3989 0 : break;
3990 0 : case TIFFReadDirEntryErrSizesan:
3991 0 : TIFFWarningExtR(
3992 : tif, module,
3993 : "Sanity check on size of \"%s\" value failed; tag ignored",
3994 : tagname);
3995 0 : break;
3996 0 : case TIFFReadDirEntryErrAlloc:
3997 0 : TIFFWarningExtR(tif, module,
3998 : "Out of memory reading of \"%s\"; tag ignored",
3999 : tagname);
4000 0 : break;
4001 0 : default:
4002 0 : assert(0); /* we should never get here */
4003 : break;
4004 : }
4005 : }
4006 12 : }
4007 :
4008 : /*
4009 : * Return the maximum number of color channels specified for a given photometric
4010 : * type. 0 is returned if photometric type isn't supported or no default value
4011 : * is defined by the specification.
4012 : */
4013 43878 : static int _TIFFGetMaxColorChannels(uint16_t photometric)
4014 : {
4015 43878 : switch (photometric)
4016 : {
4017 30481 : case PHOTOMETRIC_PALETTE:
4018 : case PHOTOMETRIC_MINISWHITE:
4019 : case PHOTOMETRIC_MINISBLACK:
4020 30481 : return 1;
4021 12768 : case PHOTOMETRIC_YCBCR:
4022 : case PHOTOMETRIC_RGB:
4023 : case PHOTOMETRIC_CIELAB:
4024 : case PHOTOMETRIC_LOGLUV:
4025 : case PHOTOMETRIC_ITULAB:
4026 : case PHOTOMETRIC_ICCLAB:
4027 12768 : return 3;
4028 613 : case PHOTOMETRIC_SEPARATED:
4029 : case PHOTOMETRIC_MASK:
4030 613 : return 4;
4031 16 : case PHOTOMETRIC_LOGL:
4032 : case PHOTOMETRIC_CFA:
4033 : default:
4034 16 : return 0;
4035 : }
4036 : }
4037 :
4038 26286 : static int ByteCountLooksBad(TIFF *tif)
4039 : {
4040 : /*
4041 : * Assume we have wrong StripByteCount value (in case
4042 : * of single strip) in following cases:
4043 : * - it is equal to zero along with StripOffset;
4044 : * - it is larger than file itself (in case of uncompressed
4045 : * image);
4046 : * - it is smaller than the size of the bytes per row
4047 : * multiplied on the number of rows. The last case should
4048 : * not be checked in the case of writing new image,
4049 : * because we may do not know the exact strip size
4050 : * until the whole image will be written and directory
4051 : * dumped out.
4052 : */
4053 26286 : uint64_t bytecount = TIFFGetStrileByteCount(tif, 0);
4054 26275 : uint64_t offset = TIFFGetStrileOffset(tif, 0);
4055 : uint64_t filesize;
4056 :
4057 26247 : if (offset == 0)
4058 7996 : return 0;
4059 18251 : if (bytecount == 0)
4060 1 : return 1;
4061 18250 : if (tif->tif_dir.td_compression != COMPRESSION_NONE)
4062 623 : return 0;
4063 17627 : filesize = TIFFGetFileSize(tif);
4064 17667 : if (offset <= filesize && bytecount > filesize - offset)
4065 2 : return 1;
4066 17665 : if (tif->tif_mode == O_RDONLY)
4067 : {
4068 16710 : uint64_t scanlinesize = TIFFScanlineSize64(tif);
4069 16695 : if (tif->tif_dir.td_imagelength > 0 &&
4070 16674 : scanlinesize > UINT64_MAX / tif->tif_dir.td_imagelength)
4071 : {
4072 0 : return 1;
4073 : }
4074 16695 : if (bytecount < scanlinesize * tif->tif_dir.td_imagelength)
4075 2 : return 1;
4076 : }
4077 17648 : return 0;
4078 : }
4079 :
4080 : /*
4081 : * To evaluate the IFD data size when reading, save the offset and data size of
4082 : * all data that does not fit into the IFD entries themselves.
4083 : */
4084 301871 : static bool EvaluateIFDdatasizeReading(TIFF *tif, TIFFDirEntry *dp)
4085 : {
4086 301871 : const uint64_t data_width = TIFFDataWidth(dp->tdir_type);
4087 301616 : if (data_width != 0 && dp->tdir_count > UINT64_MAX / data_width)
4088 : {
4089 1 : TIFFErrorExtR(tif, "EvaluateIFDdatasizeReading",
4090 : "Too large IFD data size");
4091 1 : return false;
4092 : }
4093 301615 : const uint64_t datalength = dp->tdir_count * data_width;
4094 301615 : if (datalength > ((tif->tif_flags & TIFF_BIGTIFF) ? 0x8U : 0x4U))
4095 : {
4096 171497 : if (tif->tif_dir.td_dirdatasize_read > UINT64_MAX - datalength)
4097 : {
4098 0 : TIFFErrorExtR(tif, "EvaluateIFDdatasizeReading",
4099 : "Too large IFD data size");
4100 0 : return false;
4101 : }
4102 171497 : tif->tif_dir.td_dirdatasize_read += datalength;
4103 171497 : if (!(tif->tif_flags & TIFF_BIGTIFF))
4104 : {
4105 : /* The offset of TIFFDirEntry are not swapped when read in. That has
4106 : * to be done when used. */
4107 169859 : uint32_t offset = dp->tdir_offset.toff_long;
4108 169859 : if (tif->tif_flags & TIFF_SWAB)
4109 2064 : TIFFSwabLong(&offset);
4110 : tif->tif_dir
4111 169816 : .td_dirdatasize_offsets[tif->tif_dir.td_dirdatasize_Noffsets]
4112 169816 : .offset = (uint64_t)offset;
4113 : }
4114 : else
4115 : {
4116 : tif->tif_dir
4117 1638 : .td_dirdatasize_offsets[tif->tif_dir.td_dirdatasize_Noffsets]
4118 1638 : .offset = dp->tdir_offset.toff_long8;
4119 1638 : if (tif->tif_flags & TIFF_SWAB)
4120 30 : TIFFSwabLong8(
4121 : &tif->tif_dir
4122 30 : .td_dirdatasize_offsets[tif->tif_dir
4123 30 : .td_dirdatasize_Noffsets]
4124 : .offset);
4125 : }
4126 : tif->tif_dir
4127 171472 : .td_dirdatasize_offsets[tif->tif_dir.td_dirdatasize_Noffsets]
4128 171472 : .length = datalength;
4129 171472 : tif->tif_dir.td_dirdatasize_Noffsets++;
4130 : }
4131 301590 : return true;
4132 : }
4133 :
4134 : /*
4135 : * Compare function for qsort() sorting TIFFEntryOffsetAndLength array entries.
4136 : */
4137 65334 : static int cmpTIFFEntryOffsetAndLength(const void *a, const void *b)
4138 : {
4139 65334 : const TIFFEntryOffsetAndLength *ta = (const TIFFEntryOffsetAndLength *)a;
4140 65334 : const TIFFEntryOffsetAndLength *tb = (const TIFFEntryOffsetAndLength *)b;
4141 : /* Compare offsets */
4142 65334 : if (ta->offset > tb->offset)
4143 8427 : return 1;
4144 56907 : else if (ta->offset < tb->offset)
4145 56907 : return -1;
4146 : else
4147 0 : return 0;
4148 : }
4149 :
4150 : /*
4151 : * Determine the IFD data size after reading an IFD from the file that can be
4152 : * overwritten and saving it in tif_dir.td_dirdatasize_read. This data size
4153 : * includes the IFD entries themselves as well as the data that does not fit
4154 : * directly into the IFD entries but is located directly after the IFD entries
4155 : * in the file.
4156 : */
4157 43877 : static void CalcFinalIFDdatasizeReading(TIFF *tif, uint16_t dircount)
4158 : {
4159 : /* IFD data size is only needed if file-writing is enabled.
4160 : * This also avoids the seek() to EOF to determine the file size, which
4161 : * causes the stdin-streaming-friendly mode of libtiff for GDAL to fail. */
4162 43877 : if (tif->tif_mode == O_RDONLY)
4163 29167 : return;
4164 :
4165 : /* Sort TIFFEntryOffsetAndLength array in ascending order. */
4166 14710 : qsort(tif->tif_dir.td_dirdatasize_offsets,
4167 14710 : tif->tif_dir.td_dirdatasize_Noffsets,
4168 : sizeof(TIFFEntryOffsetAndLength), cmpTIFFEntryOffsetAndLength);
4169 :
4170 : /* Get offset of end of IFD entry space. */
4171 : uint64_t IFDendoffset;
4172 14697 : if (!(tif->tif_flags & TIFF_BIGTIFF))
4173 14223 : IFDendoffset = tif->tif_diroff + 2 + dircount * 12 + 4;
4174 : else
4175 474 : IFDendoffset = tif->tif_diroff + 8 + dircount * 20 + 8;
4176 :
4177 : /* Check which offsets are right behind IFD entries. However, LibTIFF
4178 : * increments the writing address for every external data to an even offset.
4179 : * Thus gaps of 1 byte can occur. */
4180 14697 : uint64_t size = 0;
4181 : uint64_t offset;
4182 : uint32_t i;
4183 69924 : for (i = 0; i < tif->tif_dir.td_dirdatasize_Noffsets; i++)
4184 : {
4185 55237 : offset = tif->tif_dir.td_dirdatasize_offsets[i].offset;
4186 55237 : if (offset == IFDendoffset)
4187 : {
4188 53768 : size += tif->tif_dir.td_dirdatasize_offsets[i].length;
4189 53768 : IFDendoffset += tif->tif_dir.td_dirdatasize_offsets[i].length;
4190 : }
4191 1469 : else if (offset == IFDendoffset + 1)
4192 : {
4193 : /* Add gap byte after previous IFD data set. */
4194 1459 : size += tif->tif_dir.td_dirdatasize_offsets[i].length + 1;
4195 1459 : IFDendoffset += tif->tif_dir.td_dirdatasize_offsets[i].length;
4196 : }
4197 : else
4198 : {
4199 : /* Further data is no more continuously after IFD */
4200 10 : break;
4201 : }
4202 : }
4203 : /* Check for gap byte of some easy cases. This should cover 90% of cases.
4204 : * Otherwise, IFD will be re-written even it might be safely overwritten. */
4205 14697 : if (tif->tif_nextdiroff != 0)
4206 : {
4207 2492 : if (tif->tif_nextdiroff == IFDendoffset + 1)
4208 577 : size++;
4209 : }
4210 : else
4211 : {
4212 : /* Check for IFD data ends at EOF. Then IFD can always be safely
4213 : * overwritten. */
4214 12205 : offset = TIFFSeekFile(tif, 0, SEEK_END);
4215 12205 : if (offset == IFDendoffset)
4216 : {
4217 11021 : tif->tif_dir.td_dirdatasize_read = UINT64_MAX;
4218 11021 : return;
4219 : }
4220 : }
4221 :
4222 : /* Finally, add the size of the IFD tag entries themselves. */
4223 3676 : if (!(tif->tif_flags & TIFF_BIGTIFF))
4224 3471 : tif->tif_dir.td_dirdatasize_read = 2 + dircount * 12 + 4 + size;
4225 : else
4226 205 : tif->tif_dir.td_dirdatasize_read = 8 + dircount * 20 + 8 + size;
4227 : } /*-- CalcFinalIFDdatasizeReading() --*/
4228 :
4229 : /*
4230 : * Read the next TIFF directory from a file and convert it to the internal
4231 : * format. We read directories sequentially.
4232 : */
4233 50796 : int TIFFReadDirectory(TIFF *tif)
4234 : {
4235 : static const char module[] = "TIFFReadDirectory";
4236 : TIFFDirEntry *dir;
4237 : uint16_t dircount;
4238 : TIFFDirEntry *dp;
4239 : uint16_t di;
4240 : const TIFFField *fip;
4241 50796 : uint32_t fii = FAILED_FII;
4242 : toff_t nextdiroff;
4243 50796 : int bitspersample_read = FALSE;
4244 : int color_channels;
4245 :
4246 50796 : if (tif->tif_nextdiroff == 0)
4247 : {
4248 : /* In this special case, tif_diroff needs also to be set to 0.
4249 : * This is behind the last IFD, thus no checking or reading necessary.
4250 : */
4251 6903 : tif->tif_diroff = tif->tif_nextdiroff;
4252 6903 : return 0;
4253 : }
4254 :
4255 43893 : nextdiroff = tif->tif_nextdiroff;
4256 : /* tif_curdir++ and tif_nextdiroff should only be updated after SUCCESSFUL
4257 : * reading of the directory. Otherwise, invalid IFD offsets could corrupt
4258 : * the IFD list. */
4259 43893 : if (!_TIFFCheckDirNumberAndOffset(tif,
4260 43893 : tif->tif_curdir ==
4261 : TIFF_NON_EXISTENT_DIR_NUMBER
4262 : ? 0
4263 3261 : : tif->tif_curdir + 1,
4264 : nextdiroff))
4265 : {
4266 0 : return 0; /* bad offset (IFD looping or more than TIFF_MAX_DIR_COUNT
4267 : IFDs) */
4268 : }
4269 43851 : dircount = TIFFFetchDirectory(tif, nextdiroff, &dir, &tif->tif_nextdiroff);
4270 43824 : if (!dircount)
4271 : {
4272 23 : TIFFErrorExtR(tif, module,
4273 : "Failed to read directory at offset %" PRIu64,
4274 : nextdiroff);
4275 14 : return 0;
4276 : }
4277 : /* Set global values after a valid directory has been fetched.
4278 : * tif_diroff is already set to nextdiroff in TIFFFetchDirectory() in the
4279 : * beginning. */
4280 43801 : if (tif->tif_curdir == TIFF_NON_EXISTENT_DIR_NUMBER)
4281 40540 : tif->tif_curdir = 0;
4282 : else
4283 3261 : tif->tif_curdir++;
4284 :
4285 43801 : TIFFReadDirectoryCheckOrder(tif, dir, dircount);
4286 :
4287 : /*
4288 : * Mark duplicates of any tag to be ignored (bugzilla 1994)
4289 : * to avoid certain pathological problems.
4290 : */
4291 : {
4292 : TIFFDirEntry *ma;
4293 : uint16_t mb;
4294 671401 : for (ma = dir, mb = 0; mb < dircount; ma++, mb++)
4295 : {
4296 : TIFFDirEntry *na;
4297 : uint16_t nb;
4298 4871880 : for (na = ma + 1, nb = mb + 1; nb < dircount; na++, nb++)
4299 : {
4300 4244340 : if (ma->tdir_tag == na->tdir_tag)
4301 : {
4302 3 : na->tdir_ignore = TRUE;
4303 : }
4304 : }
4305 : }
4306 : }
4307 :
4308 43866 : tif->tif_flags &= ~TIFF_BEENWRITING; /* reset before new dir */
4309 43866 : tif->tif_flags &= ~TIFF_BUF4WRITE; /* reset before new dir */
4310 43866 : tif->tif_flags &= ~TIFF_CHOPPEDUPARRAYS;
4311 :
4312 : /* free any old stuff and reinit */
4313 43866 : (*tif->tif_cleanup)(tif); /* cleanup any previous compression state */
4314 43872 : TIFFFreeDirectory(tif);
4315 43797 : TIFFDefaultDirectory(tif);
4316 :
4317 : /* After setup a fresh directory indicate that now active IFD is also
4318 : * present on file, even if its entries could not be read successfully
4319 : * below. */
4320 43873 : tif->tif_dir.td_iswrittentofile = TRUE;
4321 :
4322 : /* Allocate arrays for offset values outside IFD entry for IFD data size
4323 : * checking. Note: Counter are reset within TIFFFreeDirectory(). */
4324 43818 : tif->tif_dir.td_dirdatasize_offsets =
4325 43873 : (TIFFEntryOffsetAndLength *)_TIFFmallocExt(
4326 43873 : tif, dircount * sizeof(TIFFEntryOffsetAndLength));
4327 43818 : if (tif->tif_dir.td_dirdatasize_offsets == NULL)
4328 : {
4329 0 : TIFFErrorExtR(
4330 : tif, module,
4331 : "Failed to allocate memory for counting IFD data size at reading");
4332 0 : goto bad;
4333 : }
4334 : /*
4335 : * Electronic Arts writes gray-scale TIFF files
4336 : * without a PlanarConfiguration directory entry.
4337 : * Thus we setup a default value here, even though
4338 : * the TIFF spec says there is no default value.
4339 : * After PlanarConfiguration is preset in TIFFDefaultDirectory()
4340 : * the following setting is not needed, but does not harm either.
4341 : */
4342 43818 : TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
4343 : /*
4344 : * Setup default value and then make a pass over
4345 : * the fields to check type and tag information,
4346 : * and to extract info required to size data
4347 : * structures. A second pass is made afterwards
4348 : * to read in everything not taken in the first pass.
4349 : * But we must process the Compression tag first
4350 : * in order to merge in codec-private tag definitions (otherwise
4351 : * we may get complaints about unknown tags). However, the
4352 : * Compression tag may be dependent on the SamplesPerPixel
4353 : * tag value because older TIFF specs permitted Compression
4354 : * to be written as a SamplesPerPixel-count tag entry.
4355 : * Thus if we don't first figure out the correct SamplesPerPixel
4356 : * tag value then we may end up ignoring the Compression tag
4357 : * value because it has an incorrect count value (if the
4358 : * true value of SamplesPerPixel is not 1).
4359 : */
4360 : dp =
4361 43850 : TIFFReadDirectoryFindEntry(tif, dir, dircount, TIFFTAG_SAMPLESPERPIXEL);
4362 43855 : if (dp)
4363 : {
4364 43829 : if (!TIFFFetchNormalTag(tif, dp, 0))
4365 0 : goto bad;
4366 43790 : dp->tdir_ignore = TRUE;
4367 : }
4368 43816 : dp = TIFFReadDirectoryFindEntry(tif, dir, dircount, TIFFTAG_COMPRESSION);
4369 43847 : if (dp)
4370 : {
4371 : /*
4372 : * The 5.0 spec says the Compression tag has one value, while
4373 : * earlier specs say it has one value per sample. Because of
4374 : * this, we accept the tag if one value is supplied with either
4375 : * count.
4376 : */
4377 : uint16_t value;
4378 : enum TIFFReadDirEntryErr err;
4379 43824 : err = TIFFReadDirEntryShort(tif, dp, &value);
4380 43833 : if (err == TIFFReadDirEntryErrCount)
4381 0 : err = TIFFReadDirEntryPersampleShort(tif, dp, &value);
4382 43794 : if (err != TIFFReadDirEntryErrOk)
4383 : {
4384 0 : TIFFReadDirEntryOutputErr(tif, err, module, "Compression", 0);
4385 0 : goto bad;
4386 : }
4387 43794 : if (!TIFFSetField(tif, TIFFTAG_COMPRESSION, value))
4388 0 : goto bad;
4389 43851 : dp->tdir_ignore = TRUE;
4390 : }
4391 : else
4392 : {
4393 23 : if (!TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE))
4394 0 : goto bad;
4395 : }
4396 : /*
4397 : * First real pass over the directory.
4398 : */
4399 671708 : for (di = 0, dp = dir; di < dircount; di++, dp++)
4400 : {
4401 627665 : if (!dp->tdir_ignore)
4402 : {
4403 540031 : TIFFReadDirectoryFindFieldInfo(tif, dp->tdir_tag, &fii);
4404 540335 : if (fii == FAILED_FII)
4405 : {
4406 5 : if (tif->tif_warn_about_unknown_tags)
4407 : {
4408 0 : TIFFWarningExtR(tif, module,
4409 : "Unknown field with tag %" PRIu16
4410 : " (0x%" PRIx16 ") encountered",
4411 0 : dp->tdir_tag, dp->tdir_tag);
4412 : }
4413 : /* the following knowingly leaks the
4414 : anonymous field structure */
4415 5 : const TIFFField *fld = _TIFFCreateAnonField(
4416 5 : tif, dp->tdir_tag, (TIFFDataType)dp->tdir_type);
4417 5 : if (fld == NULL || !_TIFFMergeFields(tif, fld, 1))
4418 : {
4419 0 : TIFFWarningExtR(
4420 : tif, module,
4421 : "Registering anonymous field with tag %" PRIu16
4422 : " (0x%" PRIx16 ") failed",
4423 0 : dp->tdir_tag, dp->tdir_tag);
4424 0 : dp->tdir_ignore = TRUE;
4425 : }
4426 : else
4427 : {
4428 5 : TIFFReadDirectoryFindFieldInfo(tif, dp->tdir_tag, &fii);
4429 5 : assert(fii != FAILED_FII);
4430 : }
4431 : }
4432 : }
4433 627937 : if (!dp->tdir_ignore)
4434 : {
4435 540269 : fip = tif->tif_fields[fii];
4436 540269 : if (fip->field_bit == FIELD_IGNORE)
4437 0 : dp->tdir_ignore = TRUE;
4438 : else
4439 : {
4440 540269 : switch (dp->tdir_tag)
4441 : {
4442 87736 : case TIFFTAG_STRIPOFFSETS:
4443 : case TIFFTAG_STRIPBYTECOUNTS:
4444 : case TIFFTAG_TILEOFFSETS:
4445 : case TIFFTAG_TILEBYTECOUNTS:
4446 87736 : TIFFSetFieldBit(tif, fip->field_bit);
4447 87736 : break;
4448 188101 : case TIFFTAG_IMAGEWIDTH:
4449 : case TIFFTAG_IMAGELENGTH:
4450 : case TIFFTAG_IMAGEDEPTH:
4451 : case TIFFTAG_TILELENGTH:
4452 : case TIFFTAG_TILEWIDTH:
4453 : case TIFFTAG_TILEDEPTH:
4454 : case TIFFTAG_PLANARCONFIG:
4455 : case TIFFTAG_ROWSPERSTRIP:
4456 : case TIFFTAG_EXTRASAMPLES:
4457 188101 : if (!TIFFFetchNormalTag(tif, dp, 0))
4458 0 : goto bad;
4459 188049 : dp->tdir_ignore = TRUE;
4460 188049 : break;
4461 264432 : default:
4462 264432 : if (!_TIFFCheckFieldIsValidForCodec(tif, dp->tdir_tag))
4463 0 : dp->tdir_ignore = TRUE;
4464 264393 : break;
4465 : }
4466 87668 : }
4467 : }
4468 : }
4469 : /*
4470 : * XXX: OJPEG hack.
4471 : * If a) compression is OJPEG, b) planarconfig tag says it's separate,
4472 : * c) strip offsets/bytecounts tag are both present and
4473 : * d) both contain exactly one value, then we consistently find
4474 : * that the buggy implementation of the buggy compression scheme
4475 : * matches contig planarconfig best. So we 'fix-up' the tag here
4476 : */
4477 44043 : if ((tif->tif_dir.td_compression == COMPRESSION_OJPEG) &&
4478 2 : (tif->tif_dir.td_planarconfig == PLANARCONFIG_SEPARATE))
4479 : {
4480 0 : if (!_TIFFFillStriles(tif))
4481 0 : goto bad;
4482 0 : dp = TIFFReadDirectoryFindEntry(tif, dir, dircount,
4483 : TIFFTAG_STRIPOFFSETS);
4484 0 : if ((dp != 0) && (dp->tdir_count == 1))
4485 : {
4486 0 : dp = TIFFReadDirectoryFindEntry(tif, dir, dircount,
4487 : TIFFTAG_STRIPBYTECOUNTS);
4488 0 : if ((dp != 0) && (dp->tdir_count == 1))
4489 : {
4490 0 : tif->tif_dir.td_planarconfig = PLANARCONFIG_CONTIG;
4491 0 : TIFFWarningExtR(tif, module,
4492 : "Planarconfig tag value assumed incorrect, "
4493 : "assuming data is contig instead of chunky");
4494 : }
4495 : }
4496 : }
4497 : /*
4498 : * Allocate directory structure and setup defaults.
4499 : */
4500 43847 : if (!TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS))
4501 : {
4502 0 : MissingRequired(tif, "ImageLength");
4503 0 : goto bad;
4504 : }
4505 :
4506 : /*
4507 : * Second pass: extract other information.
4508 : */
4509 671402 : for (di = 0, dp = dir; di < dircount; di++, dp++)
4510 : {
4511 627526 : if (!dp->tdir_ignore)
4512 : {
4513 351939 : switch (dp->tdir_tag)
4514 : {
4515 86962 : case TIFFTAG_MINSAMPLEVALUE:
4516 : case TIFFTAG_MAXSAMPLEVALUE:
4517 : case TIFFTAG_BITSPERSAMPLE:
4518 : case TIFFTAG_DATATYPE:
4519 : case TIFFTAG_SAMPLEFORMAT:
4520 : /*
4521 : * The MinSampleValue, MaxSampleValue, BitsPerSample
4522 : * DataType and SampleFormat tags are supposed to be
4523 : * written as one value/sample, but some vendors
4524 : * incorrectly write one value only -- so we accept
4525 : * that as well (yuck). Other vendors write correct
4526 : * value for NumberOfSamples, but incorrect one for
4527 : * BitsPerSample and friends, and we will read this
4528 : * too.
4529 : */
4530 : {
4531 : uint16_t value;
4532 : enum TIFFReadDirEntryErr err;
4533 86962 : err = TIFFReadDirEntryShort(tif, dp, &value);
4534 86898 : if (!EvaluateIFDdatasizeReading(tif, dp))
4535 0 : goto bad;
4536 86879 : if (err == TIFFReadDirEntryErrCount)
4537 : err =
4538 28022 : TIFFReadDirEntryPersampleShort(tif, dp, &value);
4539 86869 : if (err != TIFFReadDirEntryErrOk)
4540 : {
4541 0 : fip = TIFFFieldWithTag(tif, dp->tdir_tag);
4542 0 : TIFFReadDirEntryOutputErr(
4543 : tif, err, module,
4544 : fip ? fip->field_name : "unknown tagname", 0);
4545 0 : goto bad;
4546 : }
4547 86869 : if (!TIFFSetField(tif, dp->tdir_tag, value))
4548 0 : goto bad;
4549 86921 : if (dp->tdir_tag == TIFFTAG_BITSPERSAMPLE)
4550 43815 : bitspersample_read = TRUE;
4551 : }
4552 86921 : break;
4553 0 : case TIFFTAG_SMINSAMPLEVALUE:
4554 : case TIFFTAG_SMAXSAMPLEVALUE:
4555 : {
4556 :
4557 0 : double *data = NULL;
4558 : enum TIFFReadDirEntryErr err;
4559 : uint32_t saved_flags;
4560 : int m;
4561 0 : if (dp->tdir_count !=
4562 0 : (uint64_t)tif->tif_dir.td_samplesperpixel)
4563 0 : err = TIFFReadDirEntryErrCount;
4564 : else
4565 0 : err = TIFFReadDirEntryDoubleArray(tif, dp, &data);
4566 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
4567 0 : goto bad;
4568 0 : if (err != TIFFReadDirEntryErrOk)
4569 : {
4570 0 : fip = TIFFFieldWithTag(tif, dp->tdir_tag);
4571 0 : TIFFReadDirEntryOutputErr(
4572 : tif, err, module,
4573 : fip ? fip->field_name : "unknown tagname", 0);
4574 0 : goto bad;
4575 : }
4576 0 : saved_flags = tif->tif_flags;
4577 0 : tif->tif_flags |= TIFF_PERSAMPLE;
4578 0 : m = TIFFSetField(tif, dp->tdir_tag, data);
4579 0 : tif->tif_flags = saved_flags;
4580 0 : _TIFFfreeExt(tif, data);
4581 0 : if (!m)
4582 0 : goto bad;
4583 : }
4584 0 : break;
4585 43827 : case TIFFTAG_STRIPOFFSETS:
4586 : case TIFFTAG_TILEOFFSETS:
4587 : {
4588 43827 : switch (dp->tdir_type)
4589 : {
4590 42683 : case TIFF_SHORT:
4591 : case TIFF_LONG:
4592 : case TIFF_LONG8:
4593 42683 : break;
4594 1144 : default:
4595 : /* Warn except if directory typically created with
4596 : * TIFFDeferStrileArrayWriting() */
4597 1144 : if (!(tif->tif_mode == O_RDWR &&
4598 1125 : dp->tdir_count == 0 && dp->tdir_type == 0 &&
4599 1125 : dp->tdir_offset.toff_long8 == 0))
4600 : {
4601 19 : fip = TIFFFieldWithTag(tif, dp->tdir_tag);
4602 2 : TIFFWarningExtR(
4603 : tif, module, "Invalid data type for tag %s",
4604 : fip ? fip->field_name : "unknown tagname");
4605 : }
4606 1127 : break;
4607 : }
4608 43810 : _TIFFmemcpy(&(tif->tif_dir.td_stripoffset_entry), dp,
4609 : sizeof(TIFFDirEntry));
4610 43807 : if (!EvaluateIFDdatasizeReading(tif, dp))
4611 1 : goto bad;
4612 : }
4613 43819 : break;
4614 43832 : case TIFFTAG_STRIPBYTECOUNTS:
4615 : case TIFFTAG_TILEBYTECOUNTS:
4616 : {
4617 43832 : switch (dp->tdir_type)
4618 : {
4619 42684 : case TIFF_SHORT:
4620 : case TIFF_LONG:
4621 : case TIFF_LONG8:
4622 42684 : break;
4623 1148 : default:
4624 : /* Warn except if directory typically created with
4625 : * TIFFDeferStrileArrayWriting() */
4626 1148 : if (!(tif->tif_mode == O_RDWR &&
4627 1125 : dp->tdir_count == 0 && dp->tdir_type == 0 &&
4628 1125 : dp->tdir_offset.toff_long8 == 0))
4629 : {
4630 23 : fip = TIFFFieldWithTag(tif, dp->tdir_tag);
4631 0 : TIFFWarningExtR(
4632 : tif, module, "Invalid data type for tag %s",
4633 : fip ? fip->field_name : "unknown tagname");
4634 : }
4635 1125 : break;
4636 : }
4637 43809 : _TIFFmemcpy(&(tif->tif_dir.td_stripbytecount_entry), dp,
4638 : sizeof(TIFFDirEntry));
4639 43794 : if (!EvaluateIFDdatasizeReading(tif, dp))
4640 0 : goto bad;
4641 : }
4642 43829 : break;
4643 341 : case TIFFTAG_COLORMAP:
4644 : case TIFFTAG_TRANSFERFUNCTION:
4645 : {
4646 : enum TIFFReadDirEntryErr err;
4647 : uint32_t countpersample;
4648 : uint32_t countrequired;
4649 : uint32_t incrementpersample;
4650 341 : uint16_t *value = NULL;
4651 : /* It would be dangerous to instantiate those tag values */
4652 : /* since if td_bitspersample has not yet been read (due to
4653 : */
4654 : /* unordered tags), it could be read afterwards with a */
4655 : /* values greater than the default one (1), which may cause
4656 : */
4657 : /* crashes in user code */
4658 341 : if (!bitspersample_read)
4659 : {
4660 0 : fip = TIFFFieldWithTag(tif, dp->tdir_tag);
4661 0 : TIFFWarningExtR(
4662 : tif, module,
4663 : "Ignoring %s since BitsPerSample tag not found",
4664 : fip ? fip->field_name : "unknown tagname");
4665 0 : continue;
4666 : }
4667 : /* ColorMap or TransferFunction for high bit */
4668 : /* depths do not make much sense and could be */
4669 : /* used as a denial of service vector */
4670 341 : if (tif->tif_dir.td_bitspersample > 24)
4671 : {
4672 0 : fip = TIFFFieldWithTag(tif, dp->tdir_tag);
4673 0 : TIFFWarningExtR(
4674 : tif, module,
4675 : "Ignoring %s because BitsPerSample=%" PRIu16 ">24",
4676 : fip ? fip->field_name : "unknown tagname",
4677 0 : tif->tif_dir.td_bitspersample);
4678 0 : continue;
4679 : }
4680 341 : countpersample = (1U << tif->tif_dir.td_bitspersample);
4681 341 : if ((dp->tdir_tag == TIFFTAG_TRANSFERFUNCTION) &&
4682 15 : (dp->tdir_count == (uint64_t)countpersample))
4683 : {
4684 0 : countrequired = countpersample;
4685 0 : incrementpersample = 0;
4686 : }
4687 : else
4688 : {
4689 341 : countrequired = 3 * countpersample;
4690 341 : incrementpersample = countpersample;
4691 : }
4692 341 : if (dp->tdir_count != (uint64_t)countrequired)
4693 0 : err = TIFFReadDirEntryErrCount;
4694 : else
4695 341 : err = TIFFReadDirEntryShortArray(tif, dp, &value);
4696 341 : if (!EvaluateIFDdatasizeReading(tif, dp))
4697 0 : goto bad;
4698 341 : if (err != TIFFReadDirEntryErrOk)
4699 : {
4700 1 : fip = TIFFFieldWithTag(tif, dp->tdir_tag);
4701 1 : TIFFReadDirEntryOutputErr(
4702 : tif, err, module,
4703 : fip ? fip->field_name : "unknown tagname", 1);
4704 : }
4705 : else
4706 : {
4707 340 : TIFFSetField(tif, dp->tdir_tag, value,
4708 340 : value + incrementpersample,
4709 340 : value + 2 * incrementpersample);
4710 340 : _TIFFfreeExt(tif, value);
4711 : }
4712 : }
4713 341 : break;
4714 : /* BEGIN REV 4.0 COMPATIBILITY */
4715 0 : case TIFFTAG_OSUBFILETYPE:
4716 : {
4717 : uint16_t valueo;
4718 : uint32_t value;
4719 0 : if (TIFFReadDirEntryShort(tif, dp, &valueo) ==
4720 : TIFFReadDirEntryErrOk)
4721 : {
4722 0 : switch (valueo)
4723 : {
4724 0 : case OFILETYPE_REDUCEDIMAGE:
4725 0 : value = FILETYPE_REDUCEDIMAGE;
4726 0 : break;
4727 0 : case OFILETYPE_PAGE:
4728 0 : value = FILETYPE_PAGE;
4729 0 : break;
4730 0 : default:
4731 0 : value = 0;
4732 0 : break;
4733 : }
4734 0 : if (value != 0)
4735 0 : TIFFSetField(tif, TIFFTAG_SUBFILETYPE, value);
4736 : }
4737 : }
4738 0 : break;
4739 : /* END REV 4.0 COMPATIBILITY */
4740 : #if 0
4741 : case TIFFTAG_EP_BATTERYLEVEL:
4742 : /* TIFFTAG_EP_BATTERYLEVEL can be RATIONAL or ASCII.
4743 : * LibTiff defines it as ASCII and converts RATIONAL to an
4744 : * ASCII string. */
4745 : switch (dp->tdir_type)
4746 : {
4747 : case TIFF_RATIONAL:
4748 : {
4749 : /* Read rational and convert to ASCII*/
4750 : enum TIFFReadDirEntryErr err;
4751 : TIFFRational_t rValue;
4752 : err = TIFFReadDirEntryCheckedRationalDirect(
4753 : tif, dp, &rValue);
4754 : if (err != TIFFReadDirEntryErrOk)
4755 : {
4756 : fip = TIFFFieldWithTag(tif, dp->tdir_tag);
4757 : TIFFReadDirEntryOutputErr(
4758 : tif, err, module,
4759 : fip ? fip->field_name : "unknown tagname",
4760 : 1);
4761 : }
4762 : else
4763 : {
4764 : char szAux[32];
4765 : snprintf(szAux, sizeof(szAux) - 1, "%d/%d",
4766 : rValue.uNum, rValue.uDenom);
4767 : TIFFSetField(tif, dp->tdir_tag, szAux);
4768 : }
4769 : }
4770 : break;
4771 : case TIFF_ASCII:
4772 : (void)TIFFFetchNormalTag(tif, dp, TRUE);
4773 : break;
4774 : default:
4775 : fip = TIFFFieldWithTag(tif, dp->tdir_tag);
4776 : TIFFWarningExtR(tif, module,
4777 : "Invalid data type for tag %s. "
4778 : "ASCII or RATIONAL expected",
4779 : fip ? fip->field_name
4780 : : "unknown tagname");
4781 : break;
4782 : }
4783 : break;
4784 : #endif
4785 176977 : default:
4786 176977 : (void)TIFFFetchNormalTag(tif, dp, TRUE);
4787 177058 : break;
4788 : } /* -- switch (dp->tdir_tag) -- */
4789 275587 : } /* -- if (!dp->tdir_ignore) */
4790 : } /* -- for-loop -- */
4791 :
4792 : /* Evaluate final IFD data size. */
4793 43876 : CalcFinalIFDdatasizeReading(tif, dircount);
4794 :
4795 : /*
4796 : * OJPEG hack:
4797 : * - If a) compression is OJPEG, and b) photometric tag is missing,
4798 : * then we consistently find that photometric should be YCbCr
4799 : * - If a) compression is OJPEG, and b) photometric tag says it's RGB,
4800 : * then we consistently find that the buggy implementation of the
4801 : * buggy compression scheme matches photometric YCbCr instead.
4802 : * - If a) compression is OJPEG, and b) bitspersample tag is missing,
4803 : * then we consistently find bitspersample should be 8.
4804 : * - If a) compression is OJPEG, b) samplesperpixel tag is missing,
4805 : * and c) photometric is RGB or YCbCr, then we consistently find
4806 : * samplesperpixel should be 3
4807 : * - If a) compression is OJPEG, b) samplesperpixel tag is missing,
4808 : * and c) photometric is MINISWHITE or MINISBLACK, then we consistently
4809 : * find samplesperpixel should be 3
4810 : */
4811 43796 : if (tif->tif_dir.td_compression == COMPRESSION_OJPEG)
4812 : {
4813 2 : if (!TIFFFieldSet(tif, FIELD_PHOTOMETRIC))
4814 : {
4815 0 : TIFFWarningExtR(
4816 : tif, module,
4817 : "Photometric tag is missing, assuming data is YCbCr");
4818 0 : if (!TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR))
4819 0 : goto bad;
4820 : }
4821 2 : else if (tif->tif_dir.td_photometric == PHOTOMETRIC_RGB)
4822 : {
4823 0 : tif->tif_dir.td_photometric = PHOTOMETRIC_YCBCR;
4824 0 : TIFFWarningExtR(tif, module,
4825 : "Photometric tag value assumed incorrect, "
4826 : "assuming data is YCbCr instead of RGB");
4827 : }
4828 2 : if (!TIFFFieldSet(tif, FIELD_BITSPERSAMPLE))
4829 : {
4830 0 : TIFFWarningExtR(
4831 : tif, module,
4832 : "BitsPerSample tag is missing, assuming 8 bits per sample");
4833 0 : if (!TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8))
4834 0 : goto bad;
4835 : }
4836 2 : if (!TIFFFieldSet(tif, FIELD_SAMPLESPERPIXEL))
4837 : {
4838 0 : if (tif->tif_dir.td_photometric == PHOTOMETRIC_RGB)
4839 : {
4840 0 : TIFFWarningExtR(tif, module,
4841 : "SamplesPerPixel tag is missing, "
4842 : "assuming correct SamplesPerPixel value is 3");
4843 0 : if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3))
4844 0 : goto bad;
4845 : }
4846 0 : if (tif->tif_dir.td_photometric == PHOTOMETRIC_YCBCR)
4847 : {
4848 0 : TIFFWarningExtR(tif, module,
4849 : "SamplesPerPixel tag is missing, "
4850 : "applying correct SamplesPerPixel value of 3");
4851 0 : if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3))
4852 0 : goto bad;
4853 : }
4854 0 : else if ((tif->tif_dir.td_photometric == PHOTOMETRIC_MINISWHITE) ||
4855 0 : (tif->tif_dir.td_photometric == PHOTOMETRIC_MINISBLACK))
4856 : {
4857 : /*
4858 : * SamplesPerPixel tag is missing, but is not required
4859 : * by spec. Assume correct SamplesPerPixel value of 1.
4860 : */
4861 0 : if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1))
4862 0 : goto bad;
4863 : }
4864 : }
4865 : }
4866 :
4867 : /*
4868 : * Setup appropriate structures (by strip or by tile)
4869 : * We do that only after the above OJPEG hack which alters SamplesPerPixel
4870 : * and thus influences the number of strips in the separate planarconfig.
4871 : */
4872 43826 : if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS))
4873 : {
4874 35904 : tif->tif_dir.td_nstrips = TIFFNumberOfStrips(tif);
4875 35869 : tif->tif_dir.td_tilewidth = tif->tif_dir.td_imagewidth;
4876 35869 : tif->tif_dir.td_tilelength = tif->tif_dir.td_rowsperstrip;
4877 35869 : tif->tif_dir.td_tiledepth = tif->tif_dir.td_imagedepth;
4878 35869 : tif->tif_flags &= ~TIFF_ISTILED;
4879 : }
4880 : else
4881 : {
4882 7922 : tif->tif_dir.td_nstrips = TIFFNumberOfTiles(tif);
4883 7922 : tif->tif_flags |= TIFF_ISTILED;
4884 : }
4885 43791 : if (!tif->tif_dir.td_nstrips)
4886 : {
4887 0 : TIFFErrorExtR(tif, module, "Cannot handle zero number of %s",
4888 0 : isTiled(tif) ? "tiles" : "strips");
4889 0 : goto bad;
4890 : }
4891 43791 : tif->tif_dir.td_stripsperimage = tif->tif_dir.td_nstrips;
4892 43791 : if (tif->tif_dir.td_planarconfig == PLANARCONFIG_SEPARATE)
4893 4376 : tif->tif_dir.td_stripsperimage /= tif->tif_dir.td_samplesperpixel;
4894 43791 : if (!TIFFFieldSet(tif, FIELD_STRIPOFFSETS))
4895 : {
4896 : #ifdef OJPEG_SUPPORT
4897 0 : if ((tif->tif_dir.td_compression == COMPRESSION_OJPEG) &&
4898 0 : (isTiled(tif) == 0) && (tif->tif_dir.td_nstrips == 1))
4899 : {
4900 : /*
4901 : * XXX: OJPEG hack.
4902 : * If a) compression is OJPEG, b) it's not a tiled TIFF,
4903 : * and c) the number of strips is 1,
4904 : * then we tolerate the absence of stripoffsets tag,
4905 : * because, presumably, all required data is in the
4906 : * JpegInterchangeFormat stream.
4907 : */
4908 0 : TIFFSetFieldBit(tif, FIELD_STRIPOFFSETS);
4909 : }
4910 : else
4911 : #endif
4912 : {
4913 0 : MissingRequired(tif, isTiled(tif) ? "TileOffsets" : "StripOffsets");
4914 0 : goto bad;
4915 : }
4916 : }
4917 :
4918 43791 : if (tif->tif_mode == O_RDWR &&
4919 14697 : tif->tif_dir.td_stripoffset_entry.tdir_tag != 0 &&
4920 14697 : tif->tif_dir.td_stripoffset_entry.tdir_count == 0 &&
4921 1125 : tif->tif_dir.td_stripoffset_entry.tdir_type == 0 &&
4922 1125 : tif->tif_dir.td_stripoffset_entry.tdir_offset.toff_long8 == 0 &&
4923 1125 : tif->tif_dir.td_stripbytecount_entry.tdir_tag != 0 &&
4924 1125 : tif->tif_dir.td_stripbytecount_entry.tdir_count == 0 &&
4925 1125 : tif->tif_dir.td_stripbytecount_entry.tdir_type == 0 &&
4926 1125 : tif->tif_dir.td_stripbytecount_entry.tdir_offset.toff_long8 == 0)
4927 : {
4928 : /* Directory typically created with TIFFDeferStrileArrayWriting() */
4929 1125 : TIFFSetupStrips(tif);
4930 : }
4931 42666 : else if (!(tif->tif_flags & TIFF_DEFERSTRILELOAD))
4932 : {
4933 14004 : if (tif->tif_dir.td_stripoffset_entry.tdir_tag != 0)
4934 : {
4935 14004 : if (!TIFFFetchStripThing(tif, &(tif->tif_dir.td_stripoffset_entry),
4936 : tif->tif_dir.td_nstrips,
4937 : &tif->tif_dir.td_stripoffset_p))
4938 : {
4939 0 : goto bad;
4940 : }
4941 : }
4942 14005 : if (tif->tif_dir.td_stripbytecount_entry.tdir_tag != 0)
4943 : {
4944 14004 : if (!TIFFFetchStripThing(
4945 : tif, &(tif->tif_dir.td_stripbytecount_entry),
4946 : tif->tif_dir.td_nstrips, &tif->tif_dir.td_stripbytecount_p))
4947 : {
4948 0 : goto bad;
4949 : }
4950 : }
4951 : }
4952 :
4953 : /*
4954 : * Make sure all non-color channels are extrasamples.
4955 : * If it's not the case, define them as such.
4956 : */
4957 43794 : color_channels = _TIFFGetMaxColorChannels(tif->tif_dir.td_photometric);
4958 43774 : if (color_channels &&
4959 43764 : tif->tif_dir.td_samplesperpixel - tif->tif_dir.td_extrasamples >
4960 : color_channels)
4961 : {
4962 : uint16_t old_extrasamples;
4963 : uint16_t *new_sampleinfo;
4964 :
4965 4 : TIFFWarningExtR(
4966 : tif, module,
4967 : "Sum of Photometric type-related "
4968 : "color channels and ExtraSamples doesn't match SamplesPerPixel. "
4969 : "Defining non-color channels as ExtraSamples.");
4970 :
4971 4 : old_extrasamples = tif->tif_dir.td_extrasamples;
4972 4 : tif->tif_dir.td_extrasamples =
4973 4 : (uint16_t)(tif->tif_dir.td_samplesperpixel - color_channels);
4974 :
4975 : // sampleinfo should contain information relative to these new extra
4976 : // samples
4977 4 : new_sampleinfo = (uint16_t *)_TIFFcallocExt(
4978 4 : tif, tif->tif_dir.td_extrasamples, sizeof(uint16_t));
4979 4 : if (!new_sampleinfo)
4980 : {
4981 0 : TIFFErrorExtR(tif, module,
4982 : "Failed to allocate memory for "
4983 : "temporary new sampleinfo array "
4984 : "(%" PRIu16 " 16 bit elements)",
4985 0 : tif->tif_dir.td_extrasamples);
4986 0 : goto bad;
4987 : }
4988 :
4989 4 : if (old_extrasamples > 0)
4990 0 : memcpy(new_sampleinfo, tif->tif_dir.td_sampleinfo,
4991 : old_extrasamples * sizeof(uint16_t));
4992 4 : _TIFFsetShortArrayExt(tif, &tif->tif_dir.td_sampleinfo, new_sampleinfo,
4993 4 : tif->tif_dir.td_extrasamples);
4994 4 : _TIFFfreeExt(tif, new_sampleinfo);
4995 : }
4996 :
4997 : /*
4998 : * Verify Palette image has a Colormap.
4999 : */
5000 43821 : if (tif->tif_dir.td_photometric == PHOTOMETRIC_PALETTE &&
5001 322 : !TIFFFieldSet(tif, FIELD_COLORMAP))
5002 : {
5003 1 : if (tif->tif_dir.td_bitspersample >= 8 &&
5004 1 : tif->tif_dir.td_samplesperpixel == 3)
5005 0 : tif->tif_dir.td_photometric = PHOTOMETRIC_RGB;
5006 1 : else if (tif->tif_dir.td_bitspersample >= 8)
5007 1 : tif->tif_dir.td_photometric = PHOTOMETRIC_MINISBLACK;
5008 : else
5009 : {
5010 0 : MissingRequired(tif, "Colormap");
5011 0 : goto bad;
5012 : }
5013 : }
5014 : /*
5015 : * OJPEG hack:
5016 : * We do no further messing with strip/tile offsets/bytecounts in OJPEG
5017 : * TIFFs
5018 : */
5019 43821 : if (tif->tif_dir.td_compression != COMPRESSION_OJPEG)
5020 : {
5021 : /*
5022 : * Attempt to deal with a missing StripByteCounts tag.
5023 : */
5024 43814 : if (!TIFFFieldSet(tif, FIELD_STRIPBYTECOUNTS))
5025 : {
5026 : /*
5027 : * Some manufacturers violate the spec by not giving
5028 : * the size of the strips. In this case, assume there
5029 : * is one uncompressed strip of data.
5030 : */
5031 5 : if ((tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG &&
5032 5 : tif->tif_dir.td_nstrips > 1) ||
5033 5 : (tif->tif_dir.td_planarconfig == PLANARCONFIG_SEPARATE &&
5034 0 : tif->tif_dir.td_nstrips !=
5035 0 : (uint32_t)tif->tif_dir.td_samplesperpixel))
5036 : {
5037 0 : MissingRequired(tif, "StripByteCounts");
5038 0 : goto bad;
5039 : }
5040 5 : TIFFWarningExtR(
5041 : tif, module,
5042 : "TIFF directory is missing required "
5043 : "\"StripByteCounts\" field, calculating from imagelength");
5044 5 : if (EstimateStripByteCounts(tif, dir, dircount) < 0)
5045 0 : goto bad;
5046 : }
5047 43809 : else if (tif->tif_dir.td_nstrips == 1 &&
5048 30372 : !(tif->tif_flags & TIFF_ISTILED) && ByteCountLooksBad(tif))
5049 : {
5050 : /*
5051 : * XXX: Plexus (and others) sometimes give a value of
5052 : * zero for a tag when they don't know what the
5053 : * correct value is! Try and handle the simple case
5054 : * of estimating the size of a one strip image.
5055 : */
5056 5 : TIFFWarningExtR(tif, module,
5057 : "Bogus \"StripByteCounts\" field, ignoring and "
5058 : "calculating from imagelength");
5059 5 : if (EstimateStripByteCounts(tif, dir, dircount) < 0)
5060 0 : goto bad;
5061 : }
5062 43790 : else if (!(tif->tif_flags & TIFF_DEFERSTRILELOAD) &&
5063 15128 : tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG &&
5064 12717 : tif->tif_dir.td_nstrips > 2 &&
5065 6527 : tif->tif_dir.td_compression == COMPRESSION_NONE &&
5066 2717 : TIFFGetStrileByteCount(tif, 0) !=
5067 2717 : TIFFGetStrileByteCount(tif, 1) &&
5068 0 : TIFFGetStrileByteCount(tif, 0) != 0 &&
5069 0 : TIFFGetStrileByteCount(tif, 1) != 0)
5070 : {
5071 : /*
5072 : * XXX: Some vendors fill StripByteCount array with
5073 : * absolutely wrong values (it can be equal to
5074 : * StripOffset array, for example). Catch this case
5075 : * here.
5076 : *
5077 : * We avoid this check if deferring strile loading
5078 : * as it would always force us to load the strip/tile
5079 : * information.
5080 : */
5081 0 : TIFFWarningExtR(tif, module,
5082 : "Wrong \"StripByteCounts\" field, ignoring and "
5083 : "calculating from imagelength");
5084 0 : if (EstimateStripByteCounts(tif, dir, dircount) < 0)
5085 0 : goto bad;
5086 : }
5087 : }
5088 43807 : if (dir)
5089 : {
5090 43837 : _TIFFfreeExt(tif, dir);
5091 43859 : dir = NULL;
5092 : }
5093 43829 : if (!TIFFFieldSet(tif, FIELD_MAXSAMPLEVALUE))
5094 : {
5095 43848 : if (tif->tif_dir.td_bitspersample >= 16)
5096 6299 : tif->tif_dir.td_maxsamplevalue = 0xFFFF;
5097 : else
5098 37549 : tif->tif_dir.td_maxsamplevalue =
5099 37549 : (uint16_t)((1L << tif->tif_dir.td_bitspersample) - 1);
5100 : }
5101 :
5102 : #ifdef STRIPBYTECOUNTSORTED_UNUSED
5103 : /*
5104 : * XXX: We can optimize checking for the strip bounds using the sorted
5105 : * bytecounts array. See also comments for TIFFAppendToStrip()
5106 : * function in tif_write.c.
5107 : */
5108 : if (!(tif->tif_flags & TIFF_DEFERSTRILELOAD) && tif->tif_dir.td_nstrips > 1)
5109 : {
5110 : uint32_t strip;
5111 :
5112 : tif->tif_dir.td_stripbytecountsorted = 1;
5113 : for (strip = 1; strip < tif->tif_dir.td_nstrips; strip++)
5114 : {
5115 : if (TIFFGetStrileOffset(tif, strip - 1) >
5116 : TIFFGetStrileOffset(tif, strip))
5117 : {
5118 : tif->tif_dir.td_stripbytecountsorted = 0;
5119 : break;
5120 : }
5121 : }
5122 : }
5123 : #endif
5124 :
5125 : /*
5126 : * An opportunity for compression mode dependent tag fixup
5127 : */
5128 43829 : (*tif->tif_fixuptags)(tif);
5129 :
5130 : /*
5131 : * Some manufacturers make life difficult by writing
5132 : * large amounts of uncompressed data as a single strip.
5133 : * This is contrary to the recommendations of the spec.
5134 : * The following makes an attempt at breaking such images
5135 : * into strips closer to the recommended 8k bytes. A
5136 : * side effect, however, is that the RowsPerStrip tag
5137 : * value may be changed.
5138 : */
5139 43830 : if ((tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG) &&
5140 39419 : (tif->tif_dir.td_nstrips == 1) &&
5141 28354 : (tif->tif_dir.td_compression == COMPRESSION_NONE) &&
5142 22378 : ((tif->tif_flags & (TIFF_STRIPCHOP | TIFF_ISTILED)) == TIFF_STRIPCHOP))
5143 : {
5144 17576 : ChopUpSingleUncompressedStrip(tif);
5145 : }
5146 :
5147 : /* There are also uncompressed striped files with strips larger than */
5148 : /* 2 GB, which make them unfriendly with a lot of code. If possible, */
5149 : /* try to expose smaller "virtual" strips. */
5150 43804 : if (tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG &&
5151 39387 : tif->tif_dir.td_compression == COMPRESSION_NONE &&
5152 53154 : (tif->tif_flags & (TIFF_STRIPCHOP | TIFF_ISTILED)) == TIFF_STRIPCHOP &&
5153 22919 : TIFFStripSize64(tif) > 0x7FFFFFFFUL)
5154 : {
5155 5 : TryChopUpUncompressedBigTiff(tif);
5156 : }
5157 :
5158 : /*
5159 : * Clear the dirty directory flag.
5160 : */
5161 43820 : tif->tif_flags &= ~TIFF_DIRTYDIRECT;
5162 43820 : tif->tif_flags &= ~TIFF_DIRTYSTRIP;
5163 :
5164 : /*
5165 : * Reinitialize i/o since we are starting on a new directory.
5166 : */
5167 43820 : tif->tif_row = (uint32_t)-1;
5168 43820 : tif->tif_curstrip = (uint32_t)-1;
5169 43820 : tif->tif_col = (uint32_t)-1;
5170 43820 : tif->tif_curtile = (uint32_t)-1;
5171 43820 : tif->tif_tilesize = (tmsize_t)-1;
5172 :
5173 43820 : tif->tif_scanlinesize = TIFFScanlineSize(tif);
5174 43833 : if (!tif->tif_scanlinesize)
5175 : {
5176 56 : TIFFErrorExtR(tif, module, "Cannot handle zero scanline size");
5177 0 : return (0);
5178 : }
5179 :
5180 43777 : if (isTiled(tif))
5181 : {
5182 7922 : tif->tif_tilesize = TIFFTileSize(tif);
5183 7922 : if (!tif->tif_tilesize)
5184 : {
5185 0 : TIFFErrorExtR(tif, module, "Cannot handle zero tile size");
5186 0 : return (0);
5187 : }
5188 : }
5189 : else
5190 : {
5191 35855 : if (!TIFFStripSize(tif))
5192 : {
5193 11 : TIFFErrorExtR(tif, module, "Cannot handle zero strip size");
5194 0 : return (0);
5195 : }
5196 : }
5197 43847 : return (1);
5198 1 : bad:
5199 1 : if (dir)
5200 1 : _TIFFfreeExt(tif, dir);
5201 1 : return (0);
5202 : } /*-- TIFFReadDirectory() --*/
5203 :
5204 43876 : static void TIFFReadDirectoryCheckOrder(TIFF *tif, TIFFDirEntry *dir,
5205 : uint16_t dircount)
5206 : {
5207 : static const char module[] = "TIFFReadDirectoryCheckOrder";
5208 : uint32_t m;
5209 : uint16_t n;
5210 : TIFFDirEntry *o;
5211 43876 : m = 0;
5212 670863 : for (n = 0, o = dir; n < dircount; n++, o++)
5213 : {
5214 626990 : if (o->tdir_tag < m)
5215 : {
5216 3 : TIFFWarningExtR(tif, module,
5217 : "Invalid TIFF directory; tags are not sorted in "
5218 : "ascending order");
5219 3 : break;
5220 : }
5221 626987 : m = o->tdir_tag + 1;
5222 : }
5223 43876 : }
5224 :
5225 87691 : static TIFFDirEntry *TIFFReadDirectoryFindEntry(TIFF *tif, TIFFDirEntry *dir,
5226 : uint16_t dircount,
5227 : uint16_t tagid)
5228 : {
5229 : TIFFDirEntry *m;
5230 : uint16_t n;
5231 : (void)tif;
5232 484671 : for (m = dir, n = 0; n < dircount; m++, n++)
5233 : {
5234 484666 : if (m->tdir_tag == tagid)
5235 87686 : return (m);
5236 : }
5237 5 : return (0);
5238 : }
5239 :
5240 948967 : static void TIFFReadDirectoryFindFieldInfo(TIFF *tif, uint16_t tagid,
5241 : uint32_t *fii)
5242 : {
5243 : int32_t ma, mb, mc;
5244 948967 : ma = -1;
5245 948967 : mc = (int32_t)tif->tif_nfields;
5246 : while (1)
5247 : {
5248 6053920 : if (ma + 1 == mc)
5249 : {
5250 5 : *fii = FAILED_FII;
5251 5 : return;
5252 : }
5253 6053910 : mb = (ma + mc) / 2;
5254 6053910 : if (tif->tif_fields[mb]->field_tag == (uint32_t)tagid)
5255 948962 : break;
5256 5104950 : if (tif->tif_fields[mb]->field_tag < (uint32_t)tagid)
5257 1948780 : ma = mb;
5258 : else
5259 3156170 : mc = mb;
5260 : }
5261 : while (1)
5262 : {
5263 949387 : if (mb == 0)
5264 10327 : break;
5265 939060 : if (tif->tif_fields[mb - 1]->field_tag != (uint32_t)tagid)
5266 938635 : break;
5267 425 : mb--;
5268 : }
5269 948962 : *fii = mb;
5270 : }
5271 :
5272 : /*
5273 : * Read custom directory from the arbitrary offset.
5274 : * The code is very similar to TIFFReadDirectory().
5275 : */
5276 0 : int TIFFReadCustomDirectory(TIFF *tif, toff_t diroff,
5277 : const TIFFFieldArray *infoarray)
5278 : {
5279 : static const char module[] = "TIFFReadCustomDirectory";
5280 : TIFFDirEntry *dir;
5281 : uint16_t dircount;
5282 : TIFFDirEntry *dp;
5283 : uint16_t di;
5284 : const TIFFField *fip;
5285 : uint32_t fii;
5286 :
5287 0 : dircount = TIFFFetchDirectory(tif, diroff, &dir, NULL);
5288 0 : if (!dircount)
5289 : {
5290 0 : TIFFErrorExtR(tif, module,
5291 : "Failed to read custom directory at offset %" PRIu64,
5292 : diroff);
5293 0 : return 0;
5294 : }
5295 0 : TIFFReadDirectoryCheckOrder(tif, dir, dircount);
5296 :
5297 : /*
5298 : * Mark duplicates of any tag to be ignored (bugzilla 1994)
5299 : * to avoid certain pathological problems.
5300 : */
5301 : {
5302 : TIFFDirEntry *ma;
5303 : uint16_t mb;
5304 0 : for (ma = dir, mb = 0; mb < dircount; ma++, mb++)
5305 : {
5306 : TIFFDirEntry *na;
5307 : uint16_t nb;
5308 0 : for (na = ma + 1, nb = mb + 1; nb < dircount; na++, nb++)
5309 : {
5310 0 : if (ma->tdir_tag == na->tdir_tag)
5311 : {
5312 0 : na->tdir_ignore = TRUE;
5313 : }
5314 : }
5315 : }
5316 : }
5317 :
5318 : /* Free any old stuff and reinit. */
5319 0 : (*tif->tif_cleanup)(tif); /* cleanup any previous compression state */
5320 0 : TIFFFreeDirectory(tif);
5321 : /* Even if custom directories do not need the default settings of a standard
5322 : * IFD, the pointer to the TIFFSetField() and TIFFGetField() (i.e.
5323 : * tif->tif_tagmethods.vsetfield and tif->tif_tagmethods.vgetfield) need to
5324 : * be initialized, which is done in TIFFDefaultDirectory().
5325 : * After that, the field array for the custom tags needs to be setup again.
5326 : */
5327 0 : TIFFDefaultDirectory(tif);
5328 0 : _TIFFSetupFields(tif, infoarray);
5329 :
5330 : /* Allocate arrays for offset values outside IFD entry for IFD data size
5331 : * checking. Note: Counter are reset within TIFFFreeDirectory(). */
5332 0 : tif->tif_dir.td_dirdatasize_offsets =
5333 0 : (TIFFEntryOffsetAndLength *)_TIFFmallocExt(
5334 0 : tif, dircount * sizeof(TIFFEntryOffsetAndLength));
5335 0 : if (tif->tif_dir.td_dirdatasize_offsets == NULL)
5336 : {
5337 0 : TIFFErrorExtR(
5338 : tif, module,
5339 : "Failed to allocate memory for counting IFD data size at reading");
5340 0 : if (dir)
5341 0 : _TIFFfreeExt(tif, dir);
5342 0 : return 0;
5343 : }
5344 :
5345 0 : for (di = 0, dp = dir; di < dircount; di++, dp++)
5346 : {
5347 0 : TIFFReadDirectoryFindFieldInfo(tif, dp->tdir_tag, &fii);
5348 0 : if (fii == FAILED_FII)
5349 : {
5350 0 : if (tif->tif_warn_about_unknown_tags)
5351 : {
5352 0 : TIFFWarningExtR(tif, module,
5353 : "Unknown field with tag %" PRIu16 " (0x%" PRIx16
5354 : ") encountered",
5355 0 : dp->tdir_tag, dp->tdir_tag);
5356 : }
5357 0 : const TIFFField *fld = _TIFFCreateAnonField(
5358 0 : tif, dp->tdir_tag, (TIFFDataType)dp->tdir_type);
5359 0 : if (fld == NULL || !_TIFFMergeFields(tif, fld, 1))
5360 : {
5361 0 : if (tif->tif_warn_about_unknown_tags)
5362 : {
5363 0 : TIFFWarningExtR(
5364 : tif, module,
5365 : "Registering anonymous field with tag %" PRIu16
5366 : " (0x%" PRIx16 ") failed",
5367 0 : dp->tdir_tag, dp->tdir_tag);
5368 : }
5369 0 : dp->tdir_ignore = TRUE;
5370 : }
5371 : else
5372 : {
5373 0 : TIFFReadDirectoryFindFieldInfo(tif, dp->tdir_tag, &fii);
5374 0 : assert(fii != FAILED_FII);
5375 : }
5376 : }
5377 0 : if (!dp->tdir_ignore)
5378 : {
5379 0 : fip = tif->tif_fields[fii];
5380 0 : if (fip->field_bit == FIELD_IGNORE)
5381 0 : dp->tdir_ignore = TRUE;
5382 : else
5383 : {
5384 : /* check data type */
5385 0 : while ((fip->field_type != TIFF_ANY) &&
5386 0 : (fip->field_type != dp->tdir_type))
5387 : {
5388 0 : fii++;
5389 0 : if ((fii == tif->tif_nfields) ||
5390 0 : (tif->tif_fields[fii]->field_tag !=
5391 0 : (uint32_t)dp->tdir_tag))
5392 : {
5393 0 : fii = 0xFFFF;
5394 0 : break;
5395 : }
5396 0 : fip = tif->tif_fields[fii];
5397 : }
5398 0 : if (fii == 0xFFFF)
5399 : {
5400 0 : TIFFWarningExtR(tif, module,
5401 : "Wrong data type %" PRIu16
5402 : " for \"%s\"; tag ignored",
5403 0 : dp->tdir_type, fip->field_name);
5404 0 : dp->tdir_ignore = TRUE;
5405 : }
5406 : else
5407 : {
5408 : /* check count if known in advance */
5409 0 : if ((fip->field_readcount != TIFF_VARIABLE) &&
5410 0 : (fip->field_readcount != TIFF_VARIABLE2))
5411 : {
5412 : uint32_t expected;
5413 0 : if (fip->field_readcount == TIFF_SPP)
5414 0 : expected =
5415 0 : (uint32_t)tif->tif_dir.td_samplesperpixel;
5416 : else
5417 0 : expected = (uint32_t)fip->field_readcount;
5418 0 : if (!CheckDirCount(tif, dp, expected))
5419 0 : dp->tdir_ignore = TRUE;
5420 : }
5421 : }
5422 : }
5423 0 : if (!dp->tdir_ignore)
5424 : {
5425 0 : switch (dp->tdir_tag)
5426 : {
5427 0 : case EXIFTAG_SUBJECTDISTANCE:
5428 0 : if (!TIFFFieldIsAnonymous(fip))
5429 : {
5430 : /* should only be called on a Exif directory */
5431 : /* when exifFields[] is active */
5432 0 : (void)TIFFFetchSubjectDistance(tif, dp);
5433 : }
5434 : else
5435 : {
5436 0 : (void)TIFFFetchNormalTag(tif, dp, TRUE);
5437 : }
5438 0 : break;
5439 0 : default:
5440 0 : (void)TIFFFetchNormalTag(tif, dp, TRUE);
5441 0 : break;
5442 : }
5443 0 : } /*-- if (!dp->tdir_ignore) */
5444 : }
5445 : }
5446 : /* Evaluate final IFD data size. */
5447 0 : CalcFinalIFDdatasizeReading(tif, dircount);
5448 :
5449 : /* To be able to return from SubIFD or custom-IFD to main-IFD */
5450 0 : tif->tif_setdirectory_force_absolute = TRUE;
5451 0 : if (dir)
5452 0 : _TIFFfreeExt(tif, dir);
5453 0 : return 1;
5454 : }
5455 :
5456 : /*
5457 : * EXIF is important special case of custom IFD, so we have a special
5458 : * function to read it.
5459 : */
5460 0 : int TIFFReadEXIFDirectory(TIFF *tif, toff_t diroff)
5461 : {
5462 0 : return TIFFReadCustomDirectory(tif, diroff, _TIFFGetExifFields());
5463 : }
5464 :
5465 : /*
5466 : *--: EXIF-GPS custom directory reading as another special case of custom IFD.
5467 : */
5468 0 : int TIFFReadGPSDirectory(TIFF *tif, toff_t diroff)
5469 : {
5470 0 : return TIFFReadCustomDirectory(tif, diroff, _TIFFGetGpsFields());
5471 : }
5472 :
5473 10 : static int EstimateStripByteCounts(TIFF *tif, TIFFDirEntry *dir,
5474 : uint16_t dircount)
5475 : {
5476 : static const char module[] = "EstimateStripByteCounts";
5477 :
5478 : TIFFDirEntry *dp;
5479 10 : TIFFDirectory *td = &tif->tif_dir;
5480 : uint32_t strip;
5481 :
5482 : /* Do not try to load stripbytecount as we will compute it */
5483 10 : if (!_TIFFFillStrilesInternal(tif, 0))
5484 0 : return -1;
5485 :
5486 10 : const uint64_t allocsize = (uint64_t)td->td_nstrips * sizeof(uint64_t);
5487 10 : uint64_t filesize = 0;
5488 10 : if (allocsize > 100 * 1024 * 1024)
5489 : {
5490 : /* Before allocating a huge amount of memory for corrupted files, check
5491 : * if size of requested memory is not greater than file size. */
5492 0 : filesize = TIFFGetFileSize(tif);
5493 0 : if (allocsize > filesize)
5494 : {
5495 0 : TIFFWarningExtR(
5496 : tif, module,
5497 : "Requested memory size for StripByteCounts of %" PRIu64
5498 : " is greater than filesize %" PRIu64 ". Memory not allocated",
5499 : allocsize, filesize);
5500 0 : return -1;
5501 : }
5502 : }
5503 :
5504 10 : if (td->td_stripbytecount_p)
5505 5 : _TIFFfreeExt(tif, td->td_stripbytecount_p);
5506 20 : td->td_stripbytecount_p = (uint64_t *)_TIFFCheckMalloc(
5507 10 : tif, td->td_nstrips, sizeof(uint64_t), "for \"StripByteCounts\" array");
5508 10 : if (td->td_stripbytecount_p == NULL)
5509 0 : return -1;
5510 :
5511 10 : if (td->td_compression != COMPRESSION_NONE)
5512 : {
5513 : uint64_t space;
5514 : uint16_t n;
5515 2 : if (!(tif->tif_flags & TIFF_BIGTIFF))
5516 2 : space = sizeof(TIFFHeaderClassic) + 2 + dircount * 12 + 4;
5517 : else
5518 0 : space = sizeof(TIFFHeaderBig) + 8 + dircount * 20 + 8;
5519 : /* calculate amount of space used by indirect values */
5520 17 : for (dp = dir, n = dircount; n > 0; n--, dp++)
5521 : {
5522 : uint32_t typewidth;
5523 : uint64_t datasize;
5524 15 : typewidth = TIFFDataWidth((TIFFDataType)dp->tdir_type);
5525 15 : if (typewidth == 0)
5526 : {
5527 0 : TIFFErrorExtR(
5528 : tif, module,
5529 : "Cannot determine size of unknown tag type %" PRIu16,
5530 0 : dp->tdir_type);
5531 0 : return -1;
5532 : }
5533 15 : if (dp->tdir_count > UINT64_MAX / typewidth)
5534 0 : return -1;
5535 15 : datasize = (uint64_t)typewidth * dp->tdir_count;
5536 15 : if (!(tif->tif_flags & TIFF_BIGTIFF))
5537 : {
5538 15 : if (datasize <= 4)
5539 11 : datasize = 0;
5540 : }
5541 : else
5542 : {
5543 0 : if (datasize <= 8)
5544 0 : datasize = 0;
5545 : }
5546 15 : if (space > UINT64_MAX - datasize)
5547 0 : return -1;
5548 15 : space += datasize;
5549 : }
5550 2 : if (filesize == 0)
5551 2 : filesize = TIFFGetFileSize(tif);
5552 2 : if (filesize < space)
5553 : /* we should perhaps return in error ? */
5554 1 : space = filesize;
5555 : else
5556 1 : space = filesize - space;
5557 2 : if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
5558 0 : space /= td->td_samplesperpixel;
5559 4 : for (strip = 0; strip < td->td_nstrips; strip++)
5560 2 : td->td_stripbytecount_p[strip] = space;
5561 : /*
5562 : * This gross hack handles the case were the offset to
5563 : * the last strip is past the place where we think the strip
5564 : * should begin. Since a strip of data must be contiguous,
5565 : * it's safe to assume that we've overestimated the amount
5566 : * of data in the strip and trim this number back accordingly.
5567 : */
5568 2 : strip--;
5569 2 : if (td->td_stripoffset_p[strip] >
5570 2 : UINT64_MAX - td->td_stripbytecount_p[strip])
5571 0 : return -1;
5572 2 : if (td->td_stripoffset_p[strip] + td->td_stripbytecount_p[strip] >
5573 : filesize)
5574 : {
5575 1 : if (td->td_stripoffset_p[strip] >= filesize)
5576 : {
5577 : /* Not sure what we should in that case... */
5578 0 : td->td_stripbytecount_p[strip] = 0;
5579 : }
5580 : else
5581 : {
5582 1 : td->td_stripbytecount_p[strip] =
5583 1 : filesize - td->td_stripoffset_p[strip];
5584 : }
5585 : }
5586 : }
5587 8 : else if (isTiled(tif))
5588 : {
5589 0 : uint64_t bytespertile = TIFFTileSize64(tif);
5590 :
5591 0 : for (strip = 0; strip < td->td_nstrips; strip++)
5592 0 : td->td_stripbytecount_p[strip] = bytespertile;
5593 : }
5594 : else
5595 : {
5596 8 : uint64_t rowbytes = TIFFScanlineSize64(tif);
5597 8 : uint32_t rowsperstrip = td->td_imagelength / td->td_stripsperimage;
5598 16 : for (strip = 0; strip < td->td_nstrips; strip++)
5599 : {
5600 8 : if (rowbytes > 0 && rowsperstrip > UINT64_MAX / rowbytes)
5601 0 : return -1;
5602 8 : td->td_stripbytecount_p[strip] = rowbytes * rowsperstrip;
5603 : }
5604 : }
5605 10 : TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS);
5606 10 : if (!TIFFFieldSet(tif, FIELD_ROWSPERSTRIP))
5607 5 : td->td_rowsperstrip = td->td_imagelength;
5608 10 : return 1;
5609 : }
5610 :
5611 0 : static void MissingRequired(TIFF *tif, const char *tagname)
5612 : {
5613 : static const char module[] = "MissingRequired";
5614 :
5615 0 : TIFFErrorExtR(tif, module,
5616 : "TIFF directory is missing required \"%s\" field", tagname);
5617 0 : }
5618 :
5619 250989 : static unsigned long hashFuncOffsetToNumber(const void *elt)
5620 : {
5621 250989 : const TIFFOffsetAndDirNumber *offsetAndDirNumber =
5622 : (const TIFFOffsetAndDirNumber *)elt;
5623 250989 : const uint32_t hash = (uint32_t)(offsetAndDirNumber->offset >> 32) ^
5624 250989 : ((uint32_t)offsetAndDirNumber->offset & 0xFFFFFFFFU);
5625 250989 : return hash;
5626 : }
5627 :
5628 43390 : static bool equalFuncOffsetToNumber(const void *elt1, const void *elt2)
5629 : {
5630 43390 : const TIFFOffsetAndDirNumber *offsetAndDirNumber1 =
5631 : (const TIFFOffsetAndDirNumber *)elt1;
5632 43390 : const TIFFOffsetAndDirNumber *offsetAndDirNumber2 =
5633 : (const TIFFOffsetAndDirNumber *)elt2;
5634 43390 : return offsetAndDirNumber1->offset == offsetAndDirNumber2->offset;
5635 : }
5636 :
5637 217005 : static unsigned long hashFuncNumberToOffset(const void *elt)
5638 : {
5639 217005 : const TIFFOffsetAndDirNumber *offsetAndDirNumber =
5640 : (const TIFFOffsetAndDirNumber *)elt;
5641 217005 : return offsetAndDirNumber->dirNumber;
5642 : }
5643 :
5644 10565 : static bool equalFuncNumberToOffset(const void *elt1, const void *elt2)
5645 : {
5646 10565 : const TIFFOffsetAndDirNumber *offsetAndDirNumber1 =
5647 : (const TIFFOffsetAndDirNumber *)elt1;
5648 10565 : const TIFFOffsetAndDirNumber *offsetAndDirNumber2 =
5649 : (const TIFFOffsetAndDirNumber *)elt2;
5650 10565 : return offsetAndDirNumber1->dirNumber == offsetAndDirNumber2->dirNumber;
5651 : }
5652 :
5653 : /*
5654 : * Check the directory number and offset against the list of already seen
5655 : * directory numbers and offsets. This is a trick to prevent IFD looping.
5656 : * The one can create TIFF file with looped directory pointers. We will
5657 : * maintain a list of already seen directories and check every IFD offset
5658 : * and its IFD number against that list. However, the offset of an IFD number
5659 : * can change - e.g. when writing updates to file.
5660 : * Returns 1 if all is ok; 0 if last directory or IFD loop is encountered,
5661 : * or an error has occurred.
5662 : */
5663 99538 : int _TIFFCheckDirNumberAndOffset(TIFF *tif, tdir_t dirn, uint64_t diroff)
5664 : {
5665 99538 : if (diroff == 0) /* no more directories */
5666 0 : return 0;
5667 :
5668 99538 : if (tif->tif_map_dir_offset_to_number == NULL)
5669 : {
5670 61947 : tif->tif_map_dir_offset_to_number = TIFFHashSetNew(
5671 : hashFuncOffsetToNumber, equalFuncOffsetToNumber, free);
5672 61982 : if (tif->tif_map_dir_offset_to_number == NULL)
5673 : {
5674 0 : TIFFErrorExtR(tif, "_TIFFCheckDirNumberAndOffset",
5675 : "Not enough memory");
5676 0 : return 1;
5677 : }
5678 : }
5679 :
5680 99573 : if (tif->tif_map_dir_number_to_offset == NULL)
5681 : {
5682 : /* No free callback for this map, as it shares the same items as
5683 : * tif->tif_map_dir_offset_to_number. */
5684 61947 : tif->tif_map_dir_number_to_offset = TIFFHashSetNew(
5685 : hashFuncNumberToOffset, equalFuncNumberToOffset, NULL);
5686 62017 : if (tif->tif_map_dir_number_to_offset == NULL)
5687 : {
5688 0 : TIFFErrorExtR(tif, "_TIFFCheckDirNumberAndOffset",
5689 : "Not enough memory");
5690 0 : return 1;
5691 : }
5692 : }
5693 :
5694 : /* Check if offset is already in the list:
5695 : * - yes: check, if offset is at the same IFD number - if not, it is an IFD
5696 : * loop
5697 : * - no: add to list or update offset at that IFD number
5698 : */
5699 : TIFFOffsetAndDirNumber entry;
5700 99643 : entry.offset = diroff;
5701 99643 : entry.dirNumber = dirn;
5702 :
5703 : TIFFOffsetAndDirNumber *foundEntry =
5704 99643 : (TIFFOffsetAndDirNumber *)TIFFHashSetLookup(
5705 : tif->tif_map_dir_offset_to_number, &entry);
5706 99474 : if (foundEntry)
5707 : {
5708 30650 : if (foundEntry->dirNumber == dirn)
5709 : {
5710 30650 : return 1;
5711 : }
5712 : else
5713 : {
5714 0 : TIFFWarningExtR(tif, "_TIFFCheckDirNumberAndOffset",
5715 : "TIFF directory %d has IFD looping to directory %u "
5716 : "at offset 0x%" PRIx64 " (%" PRIu64 ")",
5717 0 : (int)dirn - 1, foundEntry->dirNumber, diroff,
5718 : diroff);
5719 0 : return 0;
5720 : }
5721 : }
5722 :
5723 : /* Check if offset of an IFD has been changed and update offset of that IFD
5724 : * number. */
5725 68824 : foundEntry = (TIFFOffsetAndDirNumber *)TIFFHashSetLookup(
5726 : tif->tif_map_dir_number_to_offset, &entry);
5727 68830 : if (foundEntry)
5728 : {
5729 60 : if (foundEntry->offset != diroff)
5730 : {
5731 : TIFFOffsetAndDirNumber entryOld;
5732 60 : entryOld.offset = foundEntry->offset;
5733 60 : entryOld.dirNumber = dirn;
5734 : /* We must remove first from tif_map_dir_number_to_offset as the */
5735 : /* entry is owned (and thus freed) by */
5736 : /* tif_map_dir_offset_to_number */
5737 : TIFFOffsetAndDirNumber *foundEntryOld =
5738 60 : (TIFFOffsetAndDirNumber *)TIFFHashSetLookup(
5739 : tif->tif_map_dir_number_to_offset, &entryOld);
5740 60 : if (foundEntryOld)
5741 : {
5742 60 : TIFFHashSetRemove(tif->tif_map_dir_number_to_offset,
5743 : foundEntryOld);
5744 : }
5745 60 : foundEntryOld = (TIFFOffsetAndDirNumber *)TIFFHashSetLookup(
5746 : tif->tif_map_dir_offset_to_number, &entryOld);
5747 60 : if (foundEntryOld)
5748 : {
5749 60 : TIFFHashSetRemove(tif->tif_map_dir_offset_to_number,
5750 : foundEntryOld);
5751 : }
5752 :
5753 60 : TIFFOffsetAndDirNumber *entryPtr = (TIFFOffsetAndDirNumber *)malloc(
5754 : sizeof(TIFFOffsetAndDirNumber));
5755 60 : if (entryPtr == NULL)
5756 : {
5757 0 : return 0;
5758 : }
5759 :
5760 : /* Add IFD offset and dirn to IFD directory list */
5761 60 : *entryPtr = entry;
5762 :
5763 60 : if (!TIFFHashSetInsert(tif->tif_map_dir_offset_to_number, entryPtr))
5764 : {
5765 0 : TIFFErrorExtR(
5766 : tif, "_TIFFCheckDirNumberAndOffset",
5767 : "Insertion in tif_map_dir_offset_to_number failed");
5768 0 : return 0;
5769 : }
5770 60 : if (!TIFFHashSetInsert(tif->tif_map_dir_number_to_offset, entryPtr))
5771 : {
5772 0 : TIFFErrorExtR(
5773 : tif, "_TIFFCheckDirNumberAndOffset",
5774 : "Insertion in tif_map_dir_number_to_offset failed");
5775 0 : return 0;
5776 : }
5777 : }
5778 60 : return 1;
5779 : }
5780 :
5781 : /* Arbitrary (hopefully big enough) limit */
5782 68770 : if (TIFFHashSetSize(tif->tif_map_dir_offset_to_number) >=
5783 : TIFF_MAX_DIR_COUNT)
5784 : {
5785 9 : TIFFErrorExtR(tif, "_TIFFCheckDirNumberAndOffset",
5786 : "Cannot handle more than %u TIFF directories",
5787 : TIFF_MAX_DIR_COUNT);
5788 0 : return 0;
5789 : }
5790 :
5791 : TIFFOffsetAndDirNumber *entryPtr =
5792 68776 : (TIFFOffsetAndDirNumber *)malloc(sizeof(TIFFOffsetAndDirNumber));
5793 68776 : if (entryPtr == NULL)
5794 : {
5795 0 : TIFFErrorExtR(tif, "_TIFFCheckDirNumberAndOffset",
5796 : "malloc(sizeof(TIFFOffsetAndDirNumber)) failed");
5797 0 : return 0;
5798 : }
5799 :
5800 : /* Add IFD offset and dirn to IFD directory list */
5801 68776 : *entryPtr = entry;
5802 :
5803 68776 : if (!TIFFHashSetInsert(tif->tif_map_dir_offset_to_number, entryPtr))
5804 : {
5805 0 : TIFFErrorExtR(tif, "_TIFFCheckDirNumberAndOffset",
5806 : "Insertion in tif_map_dir_offset_to_number failed");
5807 0 : return 0;
5808 : }
5809 68749 : if (!TIFFHashSetInsert(tif->tif_map_dir_number_to_offset, entryPtr))
5810 : {
5811 14 : TIFFErrorExtR(tif, "_TIFFCheckDirNumberAndOffset",
5812 : "Insertion in tif_map_dir_number_to_offset failed");
5813 0 : return 0;
5814 : }
5815 :
5816 68772 : return 1;
5817 : } /* --- _TIFFCheckDirNumberAndOffset() ---*/
5818 :
5819 : /*
5820 : * Retrieve the matching IFD directory number of a given IFD offset
5821 : * from the list of directories already seen.
5822 : * Returns 1 if the offset was in the list and the directory number
5823 : * can be returned.
5824 : * Otherwise returns 0 or if an error occurred.
5825 : */
5826 9453 : int _TIFFGetDirNumberFromOffset(TIFF *tif, uint64_t diroff, tdir_t *dirn)
5827 : {
5828 9453 : if (diroff == 0) /* no more directories */
5829 0 : return 0;
5830 :
5831 : /* Check if offset is already in the list and return matching directory
5832 : * number. Otherwise update IFD list using TIFFNumberOfDirectories() and
5833 : * search again in IFD list.
5834 : */
5835 9453 : if (tif->tif_map_dir_offset_to_number == NULL)
5836 3 : return 0;
5837 : TIFFOffsetAndDirNumber entry;
5838 9450 : entry.offset = diroff;
5839 9450 : entry.dirNumber = 0; /* not used */
5840 :
5841 : TIFFOffsetAndDirNumber *foundEntry =
5842 9450 : (TIFFOffsetAndDirNumber *)TIFFHashSetLookup(
5843 : tif->tif_map_dir_offset_to_number, &entry);
5844 9450 : if (foundEntry)
5845 : {
5846 7854 : *dirn = foundEntry->dirNumber;
5847 7854 : return 1;
5848 : }
5849 :
5850 : /* This updates the directory list for all main-IFDs in the file. */
5851 1596 : TIFFNumberOfDirectories(tif);
5852 :
5853 1596 : foundEntry = (TIFFOffsetAndDirNumber *)TIFFHashSetLookup(
5854 : tif->tif_map_dir_offset_to_number, &entry);
5855 1596 : if (foundEntry)
5856 : {
5857 1556 : *dirn = foundEntry->dirNumber;
5858 1556 : return 1;
5859 : }
5860 :
5861 40 : return 0;
5862 : } /*--- _TIFFGetDirNumberFromOffset() ---*/
5863 :
5864 : /*
5865 : * Retrieve the matching IFD directory offset of a given IFD number
5866 : * from the list of directories already seen.
5867 : * Returns 1 if the offset was in the list of already seen IFDs and the
5868 : * directory offset can be returned. The directory list is not updated.
5869 : * Otherwise returns 0 or if an error occurred.
5870 : */
5871 7803 : int _TIFFGetOffsetFromDirNumber(TIFF *tif, tdir_t dirn, uint64_t *diroff)
5872 : {
5873 :
5874 7803 : if (tif->tif_map_dir_number_to_offset == NULL)
5875 0 : return 0;
5876 : TIFFOffsetAndDirNumber entry;
5877 7803 : entry.offset = 0; /* not used */
5878 7803 : entry.dirNumber = dirn;
5879 :
5880 : TIFFOffsetAndDirNumber *foundEntry =
5881 7803 : (TIFFOffsetAndDirNumber *)TIFFHashSetLookup(
5882 : tif->tif_map_dir_number_to_offset, &entry);
5883 7803 : if (foundEntry)
5884 : {
5885 7803 : *diroff = foundEntry->offset;
5886 7803 : return 1;
5887 : }
5888 :
5889 0 : return 0;
5890 : } /*--- _TIFFGetOffsetFromDirNumber() ---*/
5891 :
5892 : /*
5893 : * Remove an entry from the directory list of already seen directories
5894 : * by directory offset.
5895 : * If an entry is to be removed from the list, it is also okay if the entry
5896 : * is not in the list or the list does not exist.
5897 : */
5898 1301 : int _TIFFRemoveEntryFromDirectoryListByOffset(TIFF *tif, uint64_t diroff)
5899 : {
5900 1301 : if (tif->tif_map_dir_offset_to_number == NULL)
5901 0 : return 1;
5902 :
5903 : TIFFOffsetAndDirNumber entryOld;
5904 1301 : entryOld.offset = diroff;
5905 1301 : entryOld.dirNumber = 0;
5906 : /* We must remove first from tif_map_dir_number_to_offset as the
5907 : * entry is owned (and thus freed) by tif_map_dir_offset_to_number.
5908 : * However, we need firstly to find the directory number from offset. */
5909 :
5910 : TIFFOffsetAndDirNumber *foundEntryOldOff =
5911 1301 : (TIFFOffsetAndDirNumber *)TIFFHashSetLookup(
5912 : tif->tif_map_dir_offset_to_number, &entryOld);
5913 1301 : if (foundEntryOldOff)
5914 : {
5915 1291 : entryOld.dirNumber = foundEntryOldOff->dirNumber;
5916 1291 : if (tif->tif_map_dir_number_to_offset != NULL)
5917 : {
5918 : TIFFOffsetAndDirNumber *foundEntryOldDir =
5919 1291 : (TIFFOffsetAndDirNumber *)TIFFHashSetLookup(
5920 : tif->tif_map_dir_number_to_offset, &entryOld);
5921 1291 : if (foundEntryOldDir)
5922 : {
5923 1291 : TIFFHashSetRemove(tif->tif_map_dir_number_to_offset,
5924 : foundEntryOldDir);
5925 1291 : TIFFHashSetRemove(tif->tif_map_dir_offset_to_number,
5926 : foundEntryOldOff);
5927 1291 : return 1;
5928 : }
5929 : }
5930 : else
5931 : {
5932 0 : TIFFErrorExtR(tif, "_TIFFRemoveEntryFromDirectoryListByOffset",
5933 : "Unexpectedly tif_map_dir_number_to_offset is "
5934 : "missing but tif_map_dir_offset_to_number exists.");
5935 0 : return 0;
5936 : }
5937 : }
5938 10 : return 1;
5939 : } /*--- _TIFFRemoveEntryFromDirectoryListByOffset() ---*/
5940 :
5941 : /*
5942 : * Check the count field of a directory entry against a known value. The
5943 : * caller is expected to skip/ignore the tag if there is a mismatch.
5944 : */
5945 0 : static int CheckDirCount(TIFF *tif, TIFFDirEntry *dir, uint32_t count)
5946 : {
5947 0 : if ((uint64_t)count > dir->tdir_count)
5948 : {
5949 0 : const TIFFField *fip = TIFFFieldWithTag(tif, dir->tdir_tag);
5950 0 : TIFFWarningExtR(tif, tif->tif_name,
5951 : "incorrect count for field \"%s\" (%" PRIu64
5952 : ", expecting %" PRIu32 "); tag ignored",
5953 : fip ? fip->field_name : "unknown tagname",
5954 : dir->tdir_count, count);
5955 0 : return (0);
5956 : }
5957 0 : else if ((uint64_t)count < dir->tdir_count)
5958 : {
5959 0 : const TIFFField *fip = TIFFFieldWithTag(tif, dir->tdir_tag);
5960 0 : TIFFWarningExtR(tif, tif->tif_name,
5961 : "incorrect count for field \"%s\" (%" PRIu64
5962 : ", expecting %" PRIu32 "); tag trimmed",
5963 : fip ? fip->field_name : "unknown tagname",
5964 : dir->tdir_count, count);
5965 0 : dir->tdir_count = count;
5966 0 : return (1);
5967 : }
5968 0 : return (1);
5969 : }
5970 :
5971 : /*
5972 : * Read IFD structure from the specified offset. If the pointer to
5973 : * nextdiroff variable has been specified, read it too. Function returns a
5974 : * number of fields in the directory or 0 if failed.
5975 : */
5976 43889 : static uint16_t TIFFFetchDirectory(TIFF *tif, uint64_t diroff,
5977 : TIFFDirEntry **pdir, uint64_t *nextdiroff)
5978 : {
5979 : static const char module[] = "TIFFFetchDirectory";
5980 :
5981 : void *origdir;
5982 : uint16_t dircount16;
5983 : uint32_t dirsize;
5984 : TIFFDirEntry *dir;
5985 : uint8_t *ma;
5986 : TIFFDirEntry *mb;
5987 : uint16_t n;
5988 :
5989 43889 : assert(pdir);
5990 :
5991 43889 : tif->tif_diroff = diroff;
5992 43889 : if (nextdiroff)
5993 43848 : *nextdiroff = 0;
5994 43889 : if (!isMapped(tif))
5995 : {
5996 43825 : if (!SeekOK(tif, tif->tif_diroff))
5997 : {
5998 19 : TIFFErrorExtR(tif, module,
5999 : "%s: Seek error accessing TIFF directory",
6000 : tif->tif_name);
6001 0 : return 0;
6002 : }
6003 43838 : if (!(tif->tif_flags & TIFF_BIGTIFF))
6004 : {
6005 42984 : if (!ReadOK(tif, &dircount16, sizeof(uint16_t)))
6006 : {
6007 10 : TIFFErrorExtR(tif, module,
6008 : "%s: Can not read TIFF directory count",
6009 : tif->tif_name);
6010 10 : return 0;
6011 : }
6012 42994 : if (tif->tif_flags & TIFF_SWAB)
6013 556 : TIFFSwabShort(&dircount16);
6014 42960 : if (dircount16 > 4096)
6015 : {
6016 0 : TIFFErrorExtR(tif, module,
6017 : "Sanity check on directory count failed, this is "
6018 : "probably not a valid IFD offset");
6019 0 : return 0;
6020 : }
6021 42960 : dirsize = 12;
6022 : }
6023 : else
6024 : {
6025 : uint64_t dircount64;
6026 854 : if (!ReadOK(tif, &dircount64, sizeof(uint64_t)))
6027 : {
6028 0 : TIFFErrorExtR(tif, module,
6029 : "%s: Can not read TIFF directory count",
6030 : tif->tif_name);
6031 0 : return 0;
6032 : }
6033 854 : if (tif->tif_flags & TIFF_SWAB)
6034 19 : TIFFSwabLong8(&dircount64);
6035 854 : if (dircount64 > 4096)
6036 : {
6037 0 : TIFFErrorExtR(tif, module,
6038 : "Sanity check on directory count failed, this is "
6039 : "probably not a valid IFD offset");
6040 0 : return 0;
6041 : }
6042 854 : dircount16 = (uint16_t)dircount64;
6043 854 : dirsize = 20;
6044 : }
6045 43814 : origdir = _TIFFCheckMalloc(tif, dircount16, dirsize,
6046 : "to read TIFF directory");
6047 43857 : if (origdir == NULL)
6048 4 : return 0;
6049 43853 : if (!ReadOK(tif, origdir, (tmsize_t)(dircount16 * dirsize)))
6050 : {
6051 0 : TIFFErrorExtR(tif, module, "%.100s: Can not read TIFF directory",
6052 : tif->tif_name);
6053 0 : _TIFFfreeExt(tif, origdir);
6054 0 : return 0;
6055 : }
6056 : /*
6057 : * Read offset to next directory for sequential scans if
6058 : * needed.
6059 : */
6060 43857 : if (nextdiroff)
6061 : {
6062 43843 : if (!(tif->tif_flags & TIFF_BIGTIFF))
6063 : {
6064 : uint32_t nextdiroff32;
6065 42991 : if (!ReadOK(tif, &nextdiroff32, sizeof(uint32_t)))
6066 1 : nextdiroff32 = 0;
6067 43006 : if (tif->tif_flags & TIFF_SWAB)
6068 556 : TIFFSwabLong(&nextdiroff32);
6069 42978 : *nextdiroff = nextdiroff32;
6070 : }
6071 : else
6072 : {
6073 852 : if (!ReadOK(tif, nextdiroff, sizeof(uint64_t)))
6074 0 : *nextdiroff = 0;
6075 854 : if (tif->tif_flags & TIFF_SWAB)
6076 19 : TIFFSwabLong8(nextdiroff);
6077 : }
6078 : }
6079 : }
6080 : else
6081 : {
6082 : tmsize_t m;
6083 : tmsize_t off;
6084 64 : if (tif->tif_diroff > (uint64_t)INT64_MAX)
6085 : {
6086 0 : TIFFErrorExtR(tif, module, "Can not read TIFF directory count");
6087 0 : return (0);
6088 : }
6089 64 : off = (tmsize_t)tif->tif_diroff;
6090 :
6091 : /*
6092 : * Check for integer overflow when validating the dir_off,
6093 : * otherwise a very high offset may cause an OOB read and
6094 : * crash the client. Make two comparisons instead of
6095 : *
6096 : * off + sizeof(uint16_t) > tif->tif_size
6097 : *
6098 : * to avoid overflow.
6099 : */
6100 64 : if (!(tif->tif_flags & TIFF_BIGTIFF))
6101 : {
6102 8 : m = off + sizeof(uint16_t);
6103 8 : if ((m < off) || (m < (tmsize_t)sizeof(uint16_t)) ||
6104 8 : (m > tif->tif_size))
6105 : {
6106 0 : TIFFErrorExtR(tif, module, "Can not read TIFF directory count");
6107 0 : return 0;
6108 : }
6109 : else
6110 : {
6111 8 : _TIFFmemcpy(&dircount16, tif->tif_base + off, sizeof(uint16_t));
6112 : }
6113 8 : off += sizeof(uint16_t);
6114 8 : if (tif->tif_flags & TIFF_SWAB)
6115 0 : TIFFSwabShort(&dircount16);
6116 8 : if (dircount16 > 4096)
6117 : {
6118 0 : TIFFErrorExtR(tif, module,
6119 : "Sanity check on directory count failed, this is "
6120 : "probably not a valid IFD offset");
6121 0 : return 0;
6122 : }
6123 8 : dirsize = 12;
6124 : }
6125 : else
6126 : {
6127 : uint64_t dircount64;
6128 56 : m = off + sizeof(uint64_t);
6129 56 : if ((m < off) || (m < (tmsize_t)sizeof(uint64_t)) ||
6130 0 : (m > tif->tif_size))
6131 : {
6132 56 : TIFFErrorExtR(tif, module, "Can not read TIFF directory count");
6133 0 : return 0;
6134 : }
6135 : else
6136 : {
6137 0 : _TIFFmemcpy(&dircount64, tif->tif_base + off, sizeof(uint64_t));
6138 : }
6139 0 : off += sizeof(uint64_t);
6140 0 : if (tif->tif_flags & TIFF_SWAB)
6141 0 : TIFFSwabLong8(&dircount64);
6142 0 : if (dircount64 > 4096)
6143 : {
6144 0 : TIFFErrorExtR(tif, module,
6145 : "Sanity check on directory count failed, this is "
6146 : "probably not a valid IFD offset");
6147 0 : return 0;
6148 : }
6149 0 : dircount16 = (uint16_t)dircount64;
6150 0 : dirsize = 20;
6151 : }
6152 8 : if (dircount16 == 0)
6153 : {
6154 0 : TIFFErrorExtR(tif, module,
6155 : "Sanity check on directory count failed, zero tag "
6156 : "directories not supported");
6157 0 : return 0;
6158 : }
6159 : /* Before allocating a huge amount of memory for corrupted files, check
6160 : * if size of requested memory is not greater than file size. */
6161 8 : uint64_t filesize = TIFFGetFileSize(tif);
6162 8 : uint64_t allocsize = (uint64_t)dircount16 * dirsize;
6163 8 : if (allocsize > filesize)
6164 : {
6165 0 : TIFFWarningExtR(
6166 : tif, module,
6167 : "Requested memory size for TIFF directory of %" PRIu64
6168 : " is greater than filesize %" PRIu64
6169 : ". Memory not allocated, TIFF directory not read",
6170 : allocsize, filesize);
6171 0 : return 0;
6172 : }
6173 8 : origdir = _TIFFCheckMalloc(tif, dircount16, dirsize,
6174 : "to read TIFF directory");
6175 8 : if (origdir == NULL)
6176 0 : return 0;
6177 8 : m = off + dircount16 * dirsize;
6178 8 : if ((m < off) || (m < (tmsize_t)(dircount16 * dirsize)) ||
6179 8 : (m > tif->tif_size))
6180 : {
6181 0 : TIFFErrorExtR(tif, module, "Can not read TIFF directory");
6182 0 : _TIFFfreeExt(tif, origdir);
6183 0 : return 0;
6184 : }
6185 : else
6186 : {
6187 8 : _TIFFmemcpy(origdir, tif->tif_base + off, dircount16 * dirsize);
6188 : }
6189 8 : if (nextdiroff)
6190 : {
6191 8 : off += dircount16 * dirsize;
6192 8 : if (!(tif->tif_flags & TIFF_BIGTIFF))
6193 : {
6194 : uint32_t nextdiroff32;
6195 8 : m = off + sizeof(uint32_t);
6196 8 : if ((m < off) || (m < (tmsize_t)sizeof(uint32_t)) ||
6197 8 : (m > tif->tif_size))
6198 0 : nextdiroff32 = 0;
6199 : else
6200 8 : _TIFFmemcpy(&nextdiroff32, tif->tif_base + off,
6201 : sizeof(uint32_t));
6202 8 : if (tif->tif_flags & TIFF_SWAB)
6203 0 : TIFFSwabLong(&nextdiroff32);
6204 8 : *nextdiroff = nextdiroff32;
6205 : }
6206 : else
6207 : {
6208 0 : m = off + sizeof(uint64_t);
6209 0 : if ((m < off) || (m < (tmsize_t)sizeof(uint64_t)) ||
6210 0 : (m > tif->tif_size))
6211 0 : *nextdiroff = 0;
6212 : else
6213 0 : _TIFFmemcpy(nextdiroff, tif->tif_base + off,
6214 : sizeof(uint64_t));
6215 0 : if (tif->tif_flags & TIFF_SWAB)
6216 0 : TIFFSwabLong8(nextdiroff);
6217 : }
6218 : }
6219 : }
6220 : /* No check against filesize needed here because "dir" should have same size
6221 : * than "origdir" checked above. */
6222 43854 : dir = (TIFFDirEntry *)_TIFFCheckMalloc(
6223 : tif, dircount16, sizeof(TIFFDirEntry), "to read TIFF directory");
6224 43877 : if (dir == 0)
6225 : {
6226 13 : _TIFFfreeExt(tif, origdir);
6227 0 : return 0;
6228 : }
6229 43864 : ma = (uint8_t *)origdir;
6230 43864 : mb = dir;
6231 671091 : for (n = 0; n < dircount16; n++)
6232 : {
6233 627273 : mb->tdir_ignore = FALSE;
6234 627273 : if (tif->tif_flags & TIFF_SWAB)
6235 7666 : TIFFSwabShort((uint16_t *)ma);
6236 627273 : mb->tdir_tag = *(uint16_t *)ma;
6237 627273 : ma += sizeof(uint16_t);
6238 627273 : if (tif->tif_flags & TIFF_SWAB)
6239 7666 : TIFFSwabShort((uint16_t *)ma);
6240 627258 : mb->tdir_type = *(uint16_t *)ma;
6241 627258 : ma += sizeof(uint16_t);
6242 627258 : if (!(tif->tif_flags & TIFF_BIGTIFF))
6243 : {
6244 614885 : if (tif->tif_flags & TIFF_SWAB)
6245 7457 : TIFFSwabLong((uint32_t *)ma);
6246 614945 : mb->tdir_count = (uint64_t)(*(uint32_t *)ma);
6247 614945 : ma += sizeof(uint32_t);
6248 614945 : mb->tdir_offset.toff_long8 = 0;
6249 614945 : *(uint32_t *)(&mb->tdir_offset) = *(uint32_t *)ma;
6250 614945 : ma += sizeof(uint32_t);
6251 : }
6252 : else
6253 : {
6254 12373 : if (tif->tif_flags & TIFF_SWAB)
6255 209 : TIFFSwabLong8((uint64_t *)ma);
6256 12373 : mb->tdir_count = TIFFReadUInt64(ma);
6257 12373 : ma += sizeof(uint64_t);
6258 12373 : mb->tdir_offset.toff_long8 = TIFFReadUInt64(ma);
6259 12282 : ma += sizeof(uint64_t);
6260 : }
6261 627227 : mb++;
6262 : }
6263 43818 : _TIFFfreeExt(tif, origdir);
6264 43825 : *pdir = dir;
6265 43825 : return dircount16;
6266 : }
6267 :
6268 : /*
6269 : * Fetch a tag that is not handled by special case code.
6270 : */
6271 409038 : static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
6272 : {
6273 : static const char module[] = "TIFFFetchNormalTag";
6274 : enum TIFFReadDirEntryErr err;
6275 : uint32_t fii;
6276 409038 : const TIFFField *fip = NULL;
6277 409038 : TIFFReadDirectoryFindFieldInfo(tif, dp->tdir_tag, &fii);
6278 409073 : if (fii == FAILED_FII)
6279 : {
6280 168 : TIFFErrorExtR(tif, "TIFFFetchNormalTag",
6281 168 : "No definition found for tag %" PRIu16, dp->tdir_tag);
6282 0 : return 0;
6283 : }
6284 408905 : fip = tif->tif_fields[fii];
6285 408905 : assert(fip != NULL); /* should not happen */
6286 408905 : assert(fip->set_field_type !=
6287 : TIFF_SETGET_OTHER); /* if so, we shouldn't arrive here but deal with
6288 : this in specialized code */
6289 408905 : assert(fip->set_field_type !=
6290 : TIFF_SETGET_INT); /* if so, we shouldn't arrive here as this is only
6291 : the case for pseudo-tags */
6292 408905 : err = TIFFReadDirEntryErrOk;
6293 408905 : switch (fip->set_field_type)
6294 : {
6295 5 : case TIFF_SETGET_UNDEFINED:
6296 5 : TIFFErrorExtR(
6297 : tif, "TIFFFetchNormalTag",
6298 : "Defined set_field_type of custom tag %u (%s) is "
6299 : "TIFF_SETGET_UNDEFINED and thus tag is not read from file",
6300 : fip->field_tag, fip->field_name);
6301 5 : break;
6302 32419 : case TIFF_SETGET_ASCII:
6303 : {
6304 : uint8_t *data;
6305 32419 : assert(fip->field_passcount == 0);
6306 32419 : err = TIFFReadDirEntryByteArray(tif, dp, &data);
6307 32397 : if (err == TIFFReadDirEntryErrOk)
6308 : {
6309 32368 : size_t mb = 0;
6310 : int n;
6311 32368 : if (data != NULL)
6312 : {
6313 32364 : if (dp->tdir_count > 0 && data[dp->tdir_count - 1] == 0)
6314 : {
6315 : /* optimization: if data is known to be 0 terminated, we
6316 : * can use strlen() */
6317 32358 : mb = strlen((const char *)data);
6318 : }
6319 : else
6320 : {
6321 : /* general case. equivalent to non-portable */
6322 : /* mb = strnlen((const char*)data,
6323 : * (uint32_t)dp->tdir_count); */
6324 6 : uint8_t *ma = data;
6325 33 : while (mb < (uint32_t)dp->tdir_count)
6326 : {
6327 27 : if (*ma == 0)
6328 0 : break;
6329 27 : ma++;
6330 27 : mb++;
6331 : }
6332 : }
6333 : }
6334 32368 : if (!EvaluateIFDdatasizeReading(tif, dp))
6335 : {
6336 11 : if (data != NULL)
6337 0 : _TIFFfreeExt(tif, data);
6338 0 : return (0);
6339 : }
6340 32398 : if (mb + 1 < (uint32_t)dp->tdir_count)
6341 0 : TIFFWarningExtR(
6342 : tif, module,
6343 : "ASCII value for tag \"%s\" contains null byte in "
6344 : "value; value incorrectly truncated during reading due "
6345 : "to implementation limitations",
6346 : fip->field_name);
6347 32398 : else if (mb + 1 > (uint32_t)dp->tdir_count)
6348 : {
6349 1 : TIFFWarningExtR(tif, module,
6350 : "ASCII value for tag \"%s\" does not end "
6351 : "in null byte. Forcing it to be null",
6352 : fip->field_name);
6353 : /* TIFFReadDirEntryArrayWithLimit() ensures this can't be
6354 : * larger than MAX_SIZE_TAG_DATA */
6355 1 : assert((uint32_t)dp->tdir_count + 1 == dp->tdir_count + 1);
6356 : uint8_t *o =
6357 1 : _TIFFmallocExt(tif, (uint32_t)dp->tdir_count + 1);
6358 1 : if (o == NULL)
6359 : {
6360 0 : if (data != NULL)
6361 0 : _TIFFfreeExt(tif, data);
6362 0 : return (0);
6363 : }
6364 1 : if (dp->tdir_count > 0)
6365 : {
6366 1 : _TIFFmemcpy(o, data, (uint32_t)dp->tdir_count);
6367 : }
6368 1 : o[(uint32_t)dp->tdir_count] = 0;
6369 1 : if (data != 0)
6370 1 : _TIFFfreeExt(tif, data);
6371 1 : data = o;
6372 : }
6373 32398 : n = TIFFSetField(tif, dp->tdir_tag, data);
6374 32425 : if (data != 0)
6375 32408 : _TIFFfreeExt(tif, data);
6376 32372 : if (!n)
6377 0 : return (0);
6378 : }
6379 : }
6380 32401 : break;
6381 0 : case TIFF_SETGET_UINT8:
6382 : {
6383 0 : uint8_t data = 0;
6384 0 : assert(fip->field_readcount == 1);
6385 0 : assert(fip->field_passcount == 0);
6386 0 : err = TIFFReadDirEntryByte(tif, dp, &data);
6387 0 : if (err == TIFFReadDirEntryErrOk)
6388 : {
6389 0 : if (!TIFFSetField(tif, dp->tdir_tag, data))
6390 0 : return (0);
6391 : }
6392 : }
6393 0 : break;
6394 0 : case TIFF_SETGET_SINT8:
6395 : {
6396 0 : int8_t data = 0;
6397 0 : assert(fip->field_readcount == 1);
6398 0 : assert(fip->field_passcount == 0);
6399 0 : err = TIFFReadDirEntrySbyte(tif, dp, &data);
6400 0 : if (err == TIFFReadDirEntryErrOk)
6401 : {
6402 0 : if (!TIFFSetField(tif, dp->tdir_tag, data))
6403 0 : return (0);
6404 : }
6405 : }
6406 0 : break;
6407 135907 : case TIFF_SETGET_UINT16:
6408 : {
6409 : uint16_t data;
6410 135907 : assert(fip->field_readcount == 1);
6411 135907 : assert(fip->field_passcount == 0);
6412 135907 : err = TIFFReadDirEntryShort(tif, dp, &data);
6413 135918 : if (err == TIFFReadDirEntryErrOk)
6414 : {
6415 135939 : if (!TIFFSetField(tif, dp->tdir_tag, data))
6416 0 : return (0);
6417 : }
6418 : }
6419 135946 : break;
6420 0 : case TIFF_SETGET_SINT16:
6421 : {
6422 : int16_t data;
6423 0 : assert(fip->field_readcount == 1);
6424 0 : assert(fip->field_passcount == 0);
6425 0 : err = TIFFReadDirEntrySshort(tif, dp, &data);
6426 0 : if (err == TIFFReadDirEntryErrOk)
6427 : {
6428 0 : if (!TIFFSetField(tif, dp->tdir_tag, data))
6429 0 : return (0);
6430 : }
6431 : }
6432 0 : break;
6433 144663 : case TIFF_SETGET_UINT32:
6434 : {
6435 : uint32_t data;
6436 144663 : assert(fip->field_readcount == 1);
6437 144663 : assert(fip->field_passcount == 0);
6438 144663 : err = TIFFReadDirEntryLong(tif, dp, &data);
6439 144612 : if (err == TIFFReadDirEntryErrOk)
6440 : {
6441 144620 : if (!TIFFSetField(tif, dp->tdir_tag, data))
6442 0 : return (0);
6443 : }
6444 : }
6445 144600 : break;
6446 0 : case TIFF_SETGET_SINT32:
6447 : {
6448 : int32_t data;
6449 0 : assert(fip->field_readcount == 1);
6450 0 : assert(fip->field_passcount == 0);
6451 0 : err = TIFFReadDirEntrySlong(tif, dp, &data);
6452 0 : if (err == TIFFReadDirEntryErrOk)
6453 : {
6454 0 : if (!TIFFSetField(tif, dp->tdir_tag, data))
6455 0 : return (0);
6456 : }
6457 : }
6458 0 : break;
6459 0 : case TIFF_SETGET_UINT64:
6460 : {
6461 : uint64_t data;
6462 0 : assert(fip->field_readcount == 1);
6463 0 : assert(fip->field_passcount == 0);
6464 0 : err = TIFFReadDirEntryLong8(tif, dp, &data);
6465 0 : if (err == TIFFReadDirEntryErrOk)
6466 : {
6467 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
6468 0 : return 0;
6469 0 : if (!TIFFSetField(tif, dp->tdir_tag, data))
6470 0 : return (0);
6471 : }
6472 : }
6473 0 : break;
6474 0 : case TIFF_SETGET_SINT64:
6475 : {
6476 : int64_t data;
6477 0 : assert(fip->field_readcount == 1);
6478 0 : assert(fip->field_passcount == 0);
6479 0 : err = TIFFReadDirEntrySlong8(tif, dp, &data);
6480 0 : if (err == TIFFReadDirEntryErrOk)
6481 : {
6482 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
6483 0 : return 0;
6484 0 : if (!TIFFSetField(tif, dp->tdir_tag, data))
6485 0 : return (0);
6486 : }
6487 : }
6488 0 : break;
6489 246 : case TIFF_SETGET_FLOAT:
6490 : {
6491 : float data;
6492 246 : assert(fip->field_readcount == 1);
6493 246 : assert(fip->field_passcount == 0);
6494 246 : err = TIFFReadDirEntryFloat(tif, dp, &data);
6495 246 : if (err == TIFFReadDirEntryErrOk)
6496 : {
6497 246 : if (!EvaluateIFDdatasizeReading(tif, dp))
6498 0 : return 0;
6499 246 : if (!TIFFSetField(tif, dp->tdir_tag, data))
6500 0 : return (0);
6501 : }
6502 : }
6503 246 : break;
6504 0 : case TIFF_SETGET_DOUBLE:
6505 : {
6506 : double data;
6507 0 : assert(fip->field_readcount == 1);
6508 0 : assert(fip->field_passcount == 0);
6509 0 : err = TIFFReadDirEntryDouble(tif, dp, &data);
6510 0 : if (err == TIFFReadDirEntryErrOk)
6511 : {
6512 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
6513 0 : return 0;
6514 0 : if (!TIFFSetField(tif, dp->tdir_tag, data))
6515 0 : return (0);
6516 : }
6517 : }
6518 0 : break;
6519 8 : case TIFF_SETGET_IFD8:
6520 : {
6521 : uint64_t data;
6522 8 : assert(fip->field_readcount == 1);
6523 8 : assert(fip->field_passcount == 0);
6524 8 : err = TIFFReadDirEntryIfd8(tif, dp, &data);
6525 8 : if (err == TIFFReadDirEntryErrOk)
6526 : {
6527 8 : if (!EvaluateIFDdatasizeReading(tif, dp))
6528 0 : return 0;
6529 8 : if (!TIFFSetField(tif, dp->tdir_tag, data))
6530 0 : return (0);
6531 : }
6532 : }
6533 8 : break;
6534 1386 : case TIFF_SETGET_UINT16_PAIR:
6535 : {
6536 : uint16_t *data;
6537 1386 : assert(fip->field_readcount == 2);
6538 1386 : assert(fip->field_passcount == 0);
6539 1386 : if (dp->tdir_count != 2)
6540 : {
6541 0 : TIFFWarningExtR(tif, module,
6542 : "incorrect count for field \"%s\", expected 2, "
6543 : "got %" PRIu64,
6544 : fip->field_name, dp->tdir_count);
6545 0 : return (0);
6546 : }
6547 1386 : err = TIFFReadDirEntryShortArray(tif, dp, &data);
6548 1386 : if (err == TIFFReadDirEntryErrOk)
6549 : {
6550 : int m;
6551 1386 : assert(data); /* avoid CLang static Analyzer false positive */
6552 1386 : m = TIFFSetField(tif, dp->tdir_tag, data[0], data[1]);
6553 1386 : _TIFFfreeExt(tif, data);
6554 1386 : if (!m)
6555 0 : return (0);
6556 : }
6557 : }
6558 1386 : break;
6559 0 : case TIFF_SETGET_C0_UINT8:
6560 : {
6561 : uint8_t *data;
6562 0 : assert(fip->field_readcount >= 1);
6563 0 : assert(fip->field_passcount == 0);
6564 0 : if (dp->tdir_count != (uint64_t)fip->field_readcount)
6565 : {
6566 0 : TIFFWarningExtR(tif, module,
6567 : "incorrect count for field \"%s\", expected "
6568 : "%d, got %" PRIu64,
6569 0 : fip->field_name, (int)fip->field_readcount,
6570 : dp->tdir_count);
6571 0 : return (0);
6572 : }
6573 : else
6574 : {
6575 0 : err = TIFFReadDirEntryByteArray(tif, dp, &data);
6576 0 : if (err == TIFFReadDirEntryErrOk)
6577 : {
6578 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
6579 : {
6580 0 : if (data != 0)
6581 0 : _TIFFfreeExt(tif, data);
6582 0 : return 0;
6583 : }
6584 : int m;
6585 0 : m = TIFFSetField(tif, dp->tdir_tag, data);
6586 0 : if (data != 0)
6587 0 : _TIFFfreeExt(tif, data);
6588 0 : if (!m)
6589 0 : return (0);
6590 : }
6591 : }
6592 : }
6593 0 : break;
6594 0 : case TIFF_SETGET_C0_SINT8:
6595 : {
6596 : int8_t *data;
6597 0 : assert(fip->field_readcount >= 1);
6598 0 : assert(fip->field_passcount == 0);
6599 0 : if (dp->tdir_count != (uint64_t)fip->field_readcount)
6600 : {
6601 0 : TIFFWarningExtR(tif, module,
6602 : "incorrect count for field \"%s\", expected "
6603 : "%d, got %" PRIu64,
6604 0 : fip->field_name, (int)fip->field_readcount,
6605 : dp->tdir_count);
6606 0 : return (0);
6607 : }
6608 : else
6609 : {
6610 0 : err = TIFFReadDirEntrySbyteArray(tif, dp, &data);
6611 0 : if (err == TIFFReadDirEntryErrOk)
6612 : {
6613 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
6614 : {
6615 0 : if (data != 0)
6616 0 : _TIFFfreeExt(tif, data);
6617 0 : return 0;
6618 : }
6619 : int m;
6620 0 : m = TIFFSetField(tif, dp->tdir_tag, data);
6621 0 : if (data != 0)
6622 0 : _TIFFfreeExt(tif, data);
6623 0 : if (!m)
6624 0 : return (0);
6625 : }
6626 : }
6627 : }
6628 0 : break;
6629 0 : case TIFF_SETGET_C0_UINT16:
6630 : {
6631 : uint16_t *data;
6632 0 : assert(fip->field_readcount >= 1);
6633 0 : assert(fip->field_passcount == 0);
6634 0 : if (dp->tdir_count != (uint64_t)fip->field_readcount)
6635 : {
6636 0 : TIFFWarningExtR(tif, module,
6637 : "incorrect count for field \"%s\", expected "
6638 : "%d, got %" PRIu64,
6639 0 : fip->field_name, (int)fip->field_readcount,
6640 : dp->tdir_count);
6641 0 : return (0);
6642 : }
6643 : else
6644 : {
6645 0 : err = TIFFReadDirEntryShortArray(tif, dp, &data);
6646 0 : if (err == TIFFReadDirEntryErrOk)
6647 : {
6648 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
6649 : {
6650 0 : if (data != 0)
6651 0 : _TIFFfreeExt(tif, data);
6652 0 : return 0;
6653 : }
6654 : int m;
6655 0 : m = TIFFSetField(tif, dp->tdir_tag, data);
6656 0 : if (data != 0)
6657 0 : _TIFFfreeExt(tif, data);
6658 0 : if (!m)
6659 0 : return (0);
6660 : }
6661 : }
6662 : }
6663 0 : break;
6664 0 : case TIFF_SETGET_C0_SINT16:
6665 : {
6666 : int16_t *data;
6667 0 : assert(fip->field_readcount >= 1);
6668 0 : assert(fip->field_passcount == 0);
6669 0 : if (dp->tdir_count != (uint64_t)fip->field_readcount)
6670 : {
6671 0 : TIFFWarningExtR(tif, module,
6672 : "incorrect count for field \"%s\", expected "
6673 : "%d, got %" PRIu64,
6674 0 : fip->field_name, (int)fip->field_readcount,
6675 : dp->tdir_count);
6676 0 : return (0);
6677 : }
6678 : else
6679 : {
6680 0 : err = TIFFReadDirEntrySshortArray(tif, dp, &data);
6681 0 : if (err == TIFFReadDirEntryErrOk)
6682 : {
6683 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
6684 : {
6685 0 : if (data != 0)
6686 0 : _TIFFfreeExt(tif, data);
6687 0 : return 0;
6688 : }
6689 : int m;
6690 0 : m = TIFFSetField(tif, dp->tdir_tag, data);
6691 0 : if (data != 0)
6692 0 : _TIFFfreeExt(tif, data);
6693 0 : if (!m)
6694 0 : return (0);
6695 : }
6696 : }
6697 : }
6698 0 : break;
6699 0 : case TIFF_SETGET_C0_UINT32:
6700 : {
6701 : uint32_t *data;
6702 0 : assert(fip->field_readcount >= 1);
6703 0 : assert(fip->field_passcount == 0);
6704 0 : if (dp->tdir_count != (uint64_t)fip->field_readcount)
6705 : {
6706 0 : TIFFWarningExtR(tif, module,
6707 : "incorrect count for field \"%s\", expected "
6708 : "%d, got %" PRIu64,
6709 0 : fip->field_name, (int)fip->field_readcount,
6710 : dp->tdir_count);
6711 0 : return (0);
6712 : }
6713 : else
6714 : {
6715 0 : err = TIFFReadDirEntryLongArray(tif, dp, &data);
6716 0 : if (err == TIFFReadDirEntryErrOk)
6717 : {
6718 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
6719 : {
6720 0 : if (data != 0)
6721 0 : _TIFFfreeExt(tif, data);
6722 0 : return 0;
6723 : }
6724 : int m;
6725 0 : m = TIFFSetField(tif, dp->tdir_tag, data);
6726 0 : if (data != 0)
6727 0 : _TIFFfreeExt(tif, data);
6728 0 : if (!m)
6729 0 : return (0);
6730 : }
6731 : }
6732 : }
6733 0 : break;
6734 0 : case TIFF_SETGET_C0_SINT32:
6735 : {
6736 : int32_t *data;
6737 0 : assert(fip->field_readcount >= 1);
6738 0 : assert(fip->field_passcount == 0);
6739 0 : if (dp->tdir_count != (uint64_t)fip->field_readcount)
6740 : {
6741 0 : TIFFWarningExtR(tif, module,
6742 : "incorrect count for field \"%s\", expected "
6743 : "%d, got %" PRIu64,
6744 0 : fip->field_name, (int)fip->field_readcount,
6745 : dp->tdir_count);
6746 0 : return (0);
6747 : }
6748 : else
6749 : {
6750 0 : err = TIFFReadDirEntrySlongArray(tif, dp, &data);
6751 0 : if (err == TIFFReadDirEntryErrOk)
6752 : {
6753 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
6754 : {
6755 0 : if (data != 0)
6756 0 : _TIFFfreeExt(tif, data);
6757 0 : return 0;
6758 : }
6759 : int m;
6760 0 : m = TIFFSetField(tif, dp->tdir_tag, data);
6761 0 : if (data != 0)
6762 0 : _TIFFfreeExt(tif, data);
6763 0 : if (!m)
6764 0 : return (0);
6765 : }
6766 : }
6767 : }
6768 0 : break;
6769 0 : case TIFF_SETGET_C0_UINT64:
6770 : {
6771 : uint64_t *data;
6772 0 : assert(fip->field_readcount >= 1);
6773 0 : assert(fip->field_passcount == 0);
6774 0 : if (dp->tdir_count != (uint64_t)fip->field_readcount)
6775 : {
6776 0 : TIFFWarningExtR(tif, module,
6777 : "incorrect count for field \"%s\", expected "
6778 : "%d, got %" PRIu64,
6779 0 : fip->field_name, (int)fip->field_readcount,
6780 : dp->tdir_count);
6781 0 : return (0);
6782 : }
6783 : else
6784 : {
6785 0 : err = TIFFReadDirEntryLong8Array(tif, dp, &data);
6786 0 : if (err == TIFFReadDirEntryErrOk)
6787 : {
6788 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
6789 : {
6790 0 : if (data != 0)
6791 0 : _TIFFfreeExt(tif, data);
6792 0 : return 0;
6793 : }
6794 : int m;
6795 0 : m = TIFFSetField(tif, dp->tdir_tag, data);
6796 0 : if (data != 0)
6797 0 : _TIFFfreeExt(tif, data);
6798 0 : if (!m)
6799 0 : return (0);
6800 : }
6801 : }
6802 : }
6803 0 : break;
6804 0 : case TIFF_SETGET_C0_SINT64:
6805 : {
6806 : int64_t *data;
6807 0 : assert(fip->field_readcount >= 1);
6808 0 : assert(fip->field_passcount == 0);
6809 0 : if (dp->tdir_count != (uint64_t)fip->field_readcount)
6810 : {
6811 0 : TIFFWarningExtR(tif, module,
6812 : "incorrect count for field \"%s\", expected "
6813 : "%d, got %" PRIu64,
6814 0 : fip->field_name, (int)fip->field_readcount,
6815 : dp->tdir_count);
6816 0 : return (0);
6817 : }
6818 : else
6819 : {
6820 0 : err = TIFFReadDirEntrySlong8Array(tif, dp, &data);
6821 0 : if (err == TIFFReadDirEntryErrOk)
6822 : {
6823 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
6824 : {
6825 0 : if (data != 0)
6826 0 : _TIFFfreeExt(tif, data);
6827 0 : return 0;
6828 : }
6829 : int m;
6830 0 : m = TIFFSetField(tif, dp->tdir_tag, data);
6831 0 : if (data != 0)
6832 0 : _TIFFfreeExt(tif, data);
6833 0 : if (!m)
6834 0 : return (0);
6835 : }
6836 : }
6837 : }
6838 0 : break;
6839 1071 : case TIFF_SETGET_C0_FLOAT:
6840 : {
6841 : float *data;
6842 1071 : assert(fip->field_readcount >= 1);
6843 1071 : assert(fip->field_passcount == 0);
6844 1071 : if (dp->tdir_count != (uint64_t)fip->field_readcount)
6845 : {
6846 0 : TIFFWarningExtR(tif, module,
6847 : "incorrect count for field \"%s\", expected "
6848 : "%d, got %" PRIu64,
6849 0 : fip->field_name, (int)fip->field_readcount,
6850 : dp->tdir_count);
6851 0 : return (0);
6852 : }
6853 : else
6854 : {
6855 1071 : err = TIFFReadDirEntryFloatArray(tif, dp, &data);
6856 1071 : if (err == TIFFReadDirEntryErrOk)
6857 : {
6858 1071 : if (!EvaluateIFDdatasizeReading(tif, dp))
6859 : {
6860 0 : if (data != 0)
6861 0 : _TIFFfreeExt(tif, data);
6862 0 : return 0;
6863 : }
6864 : int m;
6865 1071 : m = TIFFSetField(tif, dp->tdir_tag, data);
6866 1071 : if (data != 0)
6867 1071 : _TIFFfreeExt(tif, data);
6868 1071 : if (!m)
6869 0 : return (0);
6870 : }
6871 : }
6872 : }
6873 1071 : break;
6874 : /*--: Rational2Double: Extend for Double Arrays and Rational-Arrays read
6875 : * into Double-Arrays. */
6876 0 : case TIFF_SETGET_C0_DOUBLE:
6877 : {
6878 : double *data;
6879 0 : assert(fip->field_readcount >= 1);
6880 0 : assert(fip->field_passcount == 0);
6881 0 : if (dp->tdir_count != (uint64_t)fip->field_readcount)
6882 : {
6883 0 : TIFFWarningExtR(tif, module,
6884 : "incorrect count for field \"%s\", expected "
6885 : "%d, got %" PRIu64,
6886 0 : fip->field_name, (int)fip->field_readcount,
6887 : dp->tdir_count);
6888 0 : return (0);
6889 : }
6890 : else
6891 : {
6892 0 : err = TIFFReadDirEntryDoubleArray(tif, dp, &data);
6893 0 : if (err == TIFFReadDirEntryErrOk)
6894 : {
6895 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
6896 : {
6897 0 : if (data != 0)
6898 0 : _TIFFfreeExt(tif, data);
6899 0 : return 0;
6900 : }
6901 : int m;
6902 0 : m = TIFFSetField(tif, dp->tdir_tag, data);
6903 0 : if (data != 0)
6904 0 : _TIFFfreeExt(tif, data);
6905 0 : if (!m)
6906 0 : return (0);
6907 : }
6908 : }
6909 : }
6910 0 : break;
6911 0 : case TIFF_SETGET_C16_ASCII:
6912 : {
6913 : uint8_t *data;
6914 0 : assert(fip->field_readcount == TIFF_VARIABLE);
6915 0 : assert(fip->field_passcount == 1);
6916 0 : if (dp->tdir_count > 0xFFFF)
6917 0 : err = TIFFReadDirEntryErrCount;
6918 : else
6919 : {
6920 0 : err = TIFFReadDirEntryByteArray(tif, dp, &data);
6921 0 : if (err == TIFFReadDirEntryErrOk)
6922 : {
6923 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
6924 : {
6925 0 : if (data != 0)
6926 0 : _TIFFfreeExt(tif, data);
6927 0 : return 0;
6928 : }
6929 : int m;
6930 0 : if (data != 0 && dp->tdir_count > 0 &&
6931 0 : data[dp->tdir_count - 1] != '\0')
6932 : {
6933 0 : TIFFWarningExtR(tif, module,
6934 : "ASCII value for ASCII array tag "
6935 : "\"%s\" does not end in null "
6936 : "byte. Forcing it to be null",
6937 : fip->field_name);
6938 : /* Enlarge buffer and add terminating null. */
6939 : uint8_t *o =
6940 0 : _TIFFmallocExt(tif, (uint32_t)dp->tdir_count + 1);
6941 0 : if (o == NULL)
6942 : {
6943 0 : if (data != NULL)
6944 0 : _TIFFfreeExt(tif, data);
6945 0 : return (0);
6946 : }
6947 0 : if (dp->tdir_count > 0)
6948 : {
6949 0 : _TIFFmemcpy(o, data, (uint32_t)dp->tdir_count);
6950 : }
6951 0 : o[(uint32_t)dp->tdir_count] = 0;
6952 0 : dp->tdir_count++; /* Increment for added null. */
6953 0 : if (data != 0)
6954 0 : _TIFFfreeExt(tif, data);
6955 0 : data = o;
6956 : }
6957 0 : m = TIFFSetField(tif, dp->tdir_tag,
6958 0 : (uint16_t)(dp->tdir_count), data);
6959 0 : if (data != 0)
6960 0 : _TIFFfreeExt(tif, data);
6961 0 : if (!m)
6962 0 : return (0);
6963 : }
6964 : }
6965 : }
6966 0 : break;
6967 0 : case TIFF_SETGET_C16_UINT8:
6968 : {
6969 : uint8_t *data;
6970 0 : assert(fip->field_readcount == TIFF_VARIABLE);
6971 0 : assert(fip->field_passcount == 1);
6972 0 : if (dp->tdir_count > 0xFFFF)
6973 0 : err = TIFFReadDirEntryErrCount;
6974 : else
6975 : {
6976 0 : err = TIFFReadDirEntryByteArray(tif, dp, &data);
6977 0 : if (err == TIFFReadDirEntryErrOk)
6978 : {
6979 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
6980 : {
6981 0 : if (data != 0)
6982 0 : _TIFFfreeExt(tif, data);
6983 0 : return 0;
6984 : }
6985 : int m;
6986 0 : m = TIFFSetField(tif, dp->tdir_tag,
6987 0 : (uint16_t)(dp->tdir_count), data);
6988 0 : if (data != 0)
6989 0 : _TIFFfreeExt(tif, data);
6990 0 : if (!m)
6991 0 : return (0);
6992 : }
6993 : }
6994 : }
6995 0 : break;
6996 0 : case TIFF_SETGET_C16_SINT8:
6997 : {
6998 : int8_t *data;
6999 0 : assert(fip->field_readcount == TIFF_VARIABLE);
7000 0 : assert(fip->field_passcount == 1);
7001 0 : if (dp->tdir_count > 0xFFFF)
7002 0 : err = TIFFReadDirEntryErrCount;
7003 : else
7004 : {
7005 0 : err = TIFFReadDirEntrySbyteArray(tif, dp, &data);
7006 0 : if (err == TIFFReadDirEntryErrOk)
7007 : {
7008 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
7009 : {
7010 0 : if (data != 0)
7011 0 : _TIFFfreeExt(tif, data);
7012 0 : return 0;
7013 : }
7014 : int m;
7015 0 : m = TIFFSetField(tif, dp->tdir_tag,
7016 0 : (uint16_t)(dp->tdir_count), data);
7017 0 : if (data != 0)
7018 0 : _TIFFfreeExt(tif, data);
7019 0 : if (!m)
7020 0 : return (0);
7021 : }
7022 : }
7023 : }
7024 0 : break;
7025 29238 : case TIFF_SETGET_C16_UINT16:
7026 : {
7027 : uint16_t *data;
7028 29238 : assert(fip->field_readcount == TIFF_VARIABLE);
7029 29238 : assert(fip->field_passcount == 1);
7030 29238 : if (dp->tdir_count > 0xFFFF)
7031 0 : err = TIFFReadDirEntryErrCount;
7032 : else
7033 : {
7034 29238 : err = TIFFReadDirEntryShortArray(tif, dp, &data);
7035 29226 : if (err == TIFFReadDirEntryErrOk)
7036 : {
7037 29219 : if (!EvaluateIFDdatasizeReading(tif, dp))
7038 : {
7039 0 : if (data != 0)
7040 0 : _TIFFfreeExt(tif, data);
7041 0 : return 0;
7042 : }
7043 : int m;
7044 29242 : m = TIFFSetField(tif, dp->tdir_tag,
7045 29242 : (uint16_t)(dp->tdir_count), data);
7046 29266 : if (data != 0)
7047 29262 : _TIFFfreeExt(tif, data);
7048 29244 : if (!m)
7049 0 : return (0);
7050 : }
7051 : }
7052 : }
7053 29251 : break;
7054 0 : case TIFF_SETGET_C16_SINT16:
7055 : {
7056 : int16_t *data;
7057 0 : assert(fip->field_readcount == TIFF_VARIABLE);
7058 0 : assert(fip->field_passcount == 1);
7059 0 : if (dp->tdir_count > 0xFFFF)
7060 0 : err = TIFFReadDirEntryErrCount;
7061 : else
7062 : {
7063 0 : err = TIFFReadDirEntrySshortArray(tif, dp, &data);
7064 0 : if (err == TIFFReadDirEntryErrOk)
7065 : {
7066 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
7067 : {
7068 0 : if (data != 0)
7069 0 : _TIFFfreeExt(tif, data);
7070 0 : return 0;
7071 : }
7072 : int m;
7073 0 : m = TIFFSetField(tif, dp->tdir_tag,
7074 0 : (uint16_t)(dp->tdir_count), data);
7075 0 : if (data != 0)
7076 0 : _TIFFfreeExt(tif, data);
7077 0 : if (!m)
7078 0 : return (0);
7079 : }
7080 : }
7081 : }
7082 0 : break;
7083 0 : case TIFF_SETGET_C16_UINT32:
7084 : {
7085 : uint32_t *data;
7086 0 : assert(fip->field_readcount == TIFF_VARIABLE);
7087 0 : assert(fip->field_passcount == 1);
7088 0 : if (dp->tdir_count > 0xFFFF)
7089 0 : err = TIFFReadDirEntryErrCount;
7090 : else
7091 : {
7092 0 : err = TIFFReadDirEntryLongArray(tif, dp, &data);
7093 0 : if (err == TIFFReadDirEntryErrOk)
7094 : {
7095 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
7096 : {
7097 0 : if (data != 0)
7098 0 : _TIFFfreeExt(tif, data);
7099 0 : return 0;
7100 : }
7101 : int m;
7102 0 : m = TIFFSetField(tif, dp->tdir_tag,
7103 0 : (uint16_t)(dp->tdir_count), data);
7104 0 : if (data != 0)
7105 0 : _TIFFfreeExt(tif, data);
7106 0 : if (!m)
7107 0 : return (0);
7108 : }
7109 : }
7110 : }
7111 0 : break;
7112 0 : case TIFF_SETGET_C16_SINT32:
7113 : {
7114 : int32_t *data;
7115 0 : assert(fip->field_readcount == TIFF_VARIABLE);
7116 0 : assert(fip->field_passcount == 1);
7117 0 : if (dp->tdir_count > 0xFFFF)
7118 0 : err = TIFFReadDirEntryErrCount;
7119 : else
7120 : {
7121 0 : err = TIFFReadDirEntrySlongArray(tif, dp, &data);
7122 0 : if (err == TIFFReadDirEntryErrOk)
7123 : {
7124 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
7125 : {
7126 0 : if (data != 0)
7127 0 : _TIFFfreeExt(tif, data);
7128 0 : return 0;
7129 : }
7130 : int m;
7131 0 : m = TIFFSetField(tif, dp->tdir_tag,
7132 0 : (uint16_t)(dp->tdir_count), data);
7133 0 : if (data != 0)
7134 0 : _TIFFfreeExt(tif, data);
7135 0 : if (!m)
7136 0 : return (0);
7137 : }
7138 : }
7139 : }
7140 0 : break;
7141 0 : case TIFF_SETGET_C16_UINT64:
7142 : {
7143 : uint64_t *data;
7144 0 : assert(fip->field_readcount == TIFF_VARIABLE);
7145 0 : assert(fip->field_passcount == 1);
7146 0 : if (dp->tdir_count > 0xFFFF)
7147 0 : err = TIFFReadDirEntryErrCount;
7148 : else
7149 : {
7150 0 : err = TIFFReadDirEntryLong8Array(tif, dp, &data);
7151 0 : if (err == TIFFReadDirEntryErrOk)
7152 : {
7153 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
7154 : {
7155 0 : if (data != 0)
7156 0 : _TIFFfreeExt(tif, data);
7157 0 : return 0;
7158 : }
7159 : int m;
7160 0 : m = TIFFSetField(tif, dp->tdir_tag,
7161 0 : (uint16_t)(dp->tdir_count), data);
7162 0 : if (data != 0)
7163 0 : _TIFFfreeExt(tif, data);
7164 0 : if (!m)
7165 0 : return (0);
7166 : }
7167 : }
7168 : }
7169 0 : break;
7170 0 : case TIFF_SETGET_C16_SINT64:
7171 : {
7172 : int64_t *data;
7173 0 : assert(fip->field_readcount == TIFF_VARIABLE);
7174 0 : assert(fip->field_passcount == 1);
7175 0 : if (dp->tdir_count > 0xFFFF)
7176 0 : err = TIFFReadDirEntryErrCount;
7177 : else
7178 : {
7179 0 : err = TIFFReadDirEntrySlong8Array(tif, dp, &data);
7180 0 : if (err == TIFFReadDirEntryErrOk)
7181 : {
7182 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
7183 : {
7184 0 : if (data != 0)
7185 0 : _TIFFfreeExt(tif, data);
7186 0 : return 0;
7187 : }
7188 : int m;
7189 0 : m = TIFFSetField(tif, dp->tdir_tag,
7190 0 : (uint16_t)(dp->tdir_count), data);
7191 0 : if (data != 0)
7192 0 : _TIFFfreeExt(tif, data);
7193 0 : if (!m)
7194 0 : return (0);
7195 : }
7196 : }
7197 : }
7198 0 : break;
7199 0 : case TIFF_SETGET_C16_FLOAT:
7200 : {
7201 : float *data;
7202 0 : assert(fip->field_readcount == TIFF_VARIABLE);
7203 0 : assert(fip->field_passcount == 1);
7204 0 : if (dp->tdir_count > 0xFFFF)
7205 0 : err = TIFFReadDirEntryErrCount;
7206 : else
7207 : {
7208 0 : err = TIFFReadDirEntryFloatArray(tif, dp, &data);
7209 0 : if (err == TIFFReadDirEntryErrOk)
7210 : {
7211 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
7212 : {
7213 0 : if (data != 0)
7214 0 : _TIFFfreeExt(tif, data);
7215 0 : return 0;
7216 : }
7217 : int m;
7218 0 : m = TIFFSetField(tif, dp->tdir_tag,
7219 0 : (uint16_t)(dp->tdir_count), data);
7220 0 : if (data != 0)
7221 0 : _TIFFfreeExt(tif, data);
7222 0 : if (!m)
7223 0 : return (0);
7224 : }
7225 : }
7226 : }
7227 0 : break;
7228 60956 : case TIFF_SETGET_C16_DOUBLE:
7229 : {
7230 : double *data;
7231 60956 : assert(fip->field_readcount == TIFF_VARIABLE);
7232 60956 : assert(fip->field_passcount == 1);
7233 60956 : if (dp->tdir_count > 0xFFFF)
7234 0 : err = TIFFReadDirEntryErrCount;
7235 : else
7236 : {
7237 60956 : err = TIFFReadDirEntryDoubleArray(tif, dp, &data);
7238 60883 : if (err == TIFFReadDirEntryErrOk)
7239 : {
7240 60880 : if (!EvaluateIFDdatasizeReading(tif, dp))
7241 : {
7242 0 : if (data != 0)
7243 0 : _TIFFfreeExt(tif, data);
7244 0 : return 0;
7245 : }
7246 : int m;
7247 60900 : m = TIFFSetField(tif, dp->tdir_tag,
7248 60900 : (uint16_t)(dp->tdir_count), data);
7249 60930 : if (data != 0)
7250 60915 : _TIFFfreeExt(tif, data);
7251 60925 : if (!m)
7252 0 : return (0);
7253 : }
7254 : }
7255 : }
7256 60928 : break;
7257 60 : case TIFF_SETGET_C16_IFD8:
7258 : {
7259 : uint64_t *data;
7260 60 : assert(fip->field_readcount == TIFF_VARIABLE);
7261 60 : assert(fip->field_passcount == 1);
7262 60 : if (dp->tdir_count > 0xFFFF)
7263 0 : err = TIFFReadDirEntryErrCount;
7264 : else
7265 : {
7266 60 : err = TIFFReadDirEntryIfd8Array(tif, dp, &data);
7267 60 : if (err == TIFFReadDirEntryErrOk)
7268 : {
7269 60 : if (!EvaluateIFDdatasizeReading(tif, dp))
7270 : {
7271 0 : if (data != 0)
7272 0 : _TIFFfreeExt(tif, data);
7273 0 : return 0;
7274 : }
7275 : int m;
7276 60 : m = TIFFSetField(tif, dp->tdir_tag,
7277 60 : (uint16_t)(dp->tdir_count), data);
7278 60 : if (data != 0)
7279 60 : _TIFFfreeExt(tif, data);
7280 60 : if (!m)
7281 0 : return (0);
7282 : }
7283 : }
7284 : }
7285 60 : break;
7286 0 : case TIFF_SETGET_C32_ASCII:
7287 : {
7288 : uint8_t *data;
7289 0 : assert(fip->field_readcount == TIFF_VARIABLE2);
7290 0 : assert(fip->field_passcount == 1);
7291 0 : err = TIFFReadDirEntryByteArray(tif, dp, &data);
7292 0 : if (err == TIFFReadDirEntryErrOk)
7293 : {
7294 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
7295 : {
7296 0 : if (data != 0)
7297 0 : _TIFFfreeExt(tif, data);
7298 0 : return 0;
7299 : }
7300 : int m;
7301 0 : if (data != 0 && dp->tdir_count > 0 &&
7302 0 : data[dp->tdir_count - 1] != '\0')
7303 : {
7304 0 : TIFFWarningExtR(
7305 : tif, module,
7306 : "ASCII value for ASCII array tag \"%s\" does not end "
7307 : "in null byte. Forcing it to be null",
7308 : fip->field_name);
7309 : /* Enlarge buffer and add terminating null. */
7310 : uint8_t *o =
7311 0 : _TIFFmallocExt(tif, (uint32_t)dp->tdir_count + 1);
7312 0 : if (o == NULL)
7313 : {
7314 0 : if (data != NULL)
7315 0 : _TIFFfreeExt(tif, data);
7316 0 : return (0);
7317 : }
7318 0 : if (dp->tdir_count > 0)
7319 : {
7320 0 : _TIFFmemcpy(o, data, (uint32_t)dp->tdir_count);
7321 : }
7322 0 : o[(uint32_t)dp->tdir_count] = 0;
7323 0 : dp->tdir_count++; /* Increment for added null. */
7324 0 : if (data != 0)
7325 0 : _TIFFfreeExt(tif, data);
7326 0 : data = o;
7327 : }
7328 0 : m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
7329 : data);
7330 0 : if (data != 0)
7331 0 : _TIFFfreeExt(tif, data);
7332 0 : if (!m)
7333 0 : return (0);
7334 : }
7335 : }
7336 0 : break;
7337 2100 : case TIFF_SETGET_C32_UINT8:
7338 : {
7339 : uint8_t *data;
7340 2100 : uint32_t count = 0;
7341 2100 : assert(fip->field_readcount == TIFF_VARIABLE2);
7342 2100 : assert(fip->field_passcount == 1);
7343 2100 : if (fip->field_tag == TIFFTAG_RICHTIFFIPTC &&
7344 0 : dp->tdir_type == TIFF_LONG)
7345 0 : {
7346 : /* Adobe's software (wrongly) writes RichTIFFIPTC tag with
7347 : * data type LONG instead of UNDEFINED. Work around this
7348 : * frequently found issue */
7349 : void *origdata;
7350 0 : err = TIFFReadDirEntryArray(tif, dp, &count, 4, &origdata);
7351 0 : if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
7352 : {
7353 0 : data = NULL;
7354 : }
7355 : else
7356 : {
7357 0 : if (tif->tif_flags & TIFF_SWAB)
7358 0 : TIFFSwabArrayOfLong((uint32_t *)origdata, count);
7359 0 : data = (uint8_t *)origdata;
7360 0 : count = (uint32_t)(count * 4);
7361 : }
7362 : }
7363 : else
7364 : {
7365 2100 : err = TIFFReadDirEntryByteArray(tif, dp, &data);
7366 2100 : count = (uint32_t)(dp->tdir_count);
7367 : }
7368 2100 : if (err == TIFFReadDirEntryErrOk)
7369 : {
7370 2100 : if (!EvaluateIFDdatasizeReading(tif, dp))
7371 : {
7372 0 : if (data != 0)
7373 0 : _TIFFfreeExt(tif, data);
7374 0 : return 0;
7375 : }
7376 : int m;
7377 2100 : m = TIFFSetField(tif, dp->tdir_tag, count, data);
7378 2100 : if (data != 0)
7379 2100 : _TIFFfreeExt(tif, data);
7380 2100 : if (!m)
7381 0 : return (0);
7382 : }
7383 : }
7384 2100 : break;
7385 0 : case TIFF_SETGET_C32_SINT8:
7386 : {
7387 0 : int8_t *data = NULL;
7388 0 : assert(fip->field_readcount == TIFF_VARIABLE2);
7389 0 : assert(fip->field_passcount == 1);
7390 0 : err = TIFFReadDirEntrySbyteArray(tif, dp, &data);
7391 0 : if (err == TIFFReadDirEntryErrOk)
7392 : {
7393 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
7394 : {
7395 0 : if (data != 0)
7396 0 : _TIFFfreeExt(tif, data);
7397 0 : return 0;
7398 : }
7399 : int m;
7400 0 : m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
7401 : data);
7402 0 : if (data != 0)
7403 0 : _TIFFfreeExt(tif, data);
7404 0 : if (!m)
7405 0 : return (0);
7406 : }
7407 : }
7408 0 : break;
7409 0 : case TIFF_SETGET_C32_UINT16:
7410 : {
7411 : uint16_t *data;
7412 0 : assert(fip->field_readcount == TIFF_VARIABLE2);
7413 0 : assert(fip->field_passcount == 1);
7414 0 : err = TIFFReadDirEntryShortArray(tif, dp, &data);
7415 0 : if (err == TIFFReadDirEntryErrOk)
7416 : {
7417 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
7418 : {
7419 0 : if (data != 0)
7420 0 : _TIFFfreeExt(tif, data);
7421 0 : return 0;
7422 : }
7423 : int m;
7424 0 : m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
7425 : data);
7426 0 : if (data != 0)
7427 0 : _TIFFfreeExt(tif, data);
7428 0 : if (!m)
7429 0 : return (0);
7430 : }
7431 : }
7432 0 : break;
7433 0 : case TIFF_SETGET_C32_SINT16:
7434 : {
7435 0 : int16_t *data = NULL;
7436 0 : assert(fip->field_readcount == TIFF_VARIABLE2);
7437 0 : assert(fip->field_passcount == 1);
7438 0 : err = TIFFReadDirEntrySshortArray(tif, dp, &data);
7439 0 : if (err == TIFFReadDirEntryErrOk)
7440 : {
7441 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
7442 : {
7443 0 : if (data != 0)
7444 0 : _TIFFfreeExt(tif, data);
7445 0 : return 0;
7446 : }
7447 : int m;
7448 0 : m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
7449 : data);
7450 0 : if (data != 0)
7451 0 : _TIFFfreeExt(tif, data);
7452 0 : if (!m)
7453 0 : return (0);
7454 : }
7455 : }
7456 0 : break;
7457 789 : case TIFF_SETGET_C32_UINT32:
7458 : {
7459 : uint32_t *data;
7460 789 : assert(fip->field_readcount == TIFF_VARIABLE2);
7461 789 : assert(fip->field_passcount == 1);
7462 789 : err = TIFFReadDirEntryLongArray(tif, dp, &data);
7463 789 : if (err == TIFFReadDirEntryErrOk)
7464 : {
7465 789 : if (!EvaluateIFDdatasizeReading(tif, dp))
7466 : {
7467 0 : if (data != 0)
7468 0 : _TIFFfreeExt(tif, data);
7469 0 : return 0;
7470 : }
7471 : int m;
7472 789 : m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
7473 : data);
7474 789 : if (data != 0)
7475 789 : _TIFFfreeExt(tif, data);
7476 789 : if (!m)
7477 0 : return (0);
7478 : }
7479 : }
7480 789 : break;
7481 0 : case TIFF_SETGET_C32_SINT32:
7482 : {
7483 0 : int32_t *data = NULL;
7484 0 : assert(fip->field_readcount == TIFF_VARIABLE2);
7485 0 : assert(fip->field_passcount == 1);
7486 0 : err = TIFFReadDirEntrySlongArray(tif, dp, &data);
7487 0 : if (err == TIFFReadDirEntryErrOk)
7488 : {
7489 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
7490 : {
7491 0 : if (data != 0)
7492 0 : _TIFFfreeExt(tif, data);
7493 0 : return 0;
7494 : }
7495 : int m;
7496 0 : m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
7497 : data);
7498 0 : if (data != 0)
7499 0 : _TIFFfreeExt(tif, data);
7500 0 : if (!m)
7501 0 : return (0);
7502 : }
7503 : }
7504 0 : break;
7505 6 : case TIFF_SETGET_C32_UINT64:
7506 : {
7507 : uint64_t *data;
7508 6 : assert(fip->field_readcount == TIFF_VARIABLE2);
7509 6 : assert(fip->field_passcount == 1);
7510 6 : err = TIFFReadDirEntryLong8Array(tif, dp, &data);
7511 6 : if (err == TIFFReadDirEntryErrOk)
7512 : {
7513 6 : if (!EvaluateIFDdatasizeReading(tif, dp))
7514 : {
7515 0 : if (data != 0)
7516 0 : _TIFFfreeExt(tif, data);
7517 0 : return 0;
7518 : }
7519 : int m;
7520 6 : m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
7521 : data);
7522 6 : if (data != 0)
7523 6 : _TIFFfreeExt(tif, data);
7524 6 : if (!m)
7525 0 : return (0);
7526 : }
7527 : }
7528 6 : break;
7529 0 : case TIFF_SETGET_C32_SINT64:
7530 : {
7531 0 : int64_t *data = NULL;
7532 0 : assert(fip->field_readcount == TIFF_VARIABLE2);
7533 0 : assert(fip->field_passcount == 1);
7534 0 : err = TIFFReadDirEntrySlong8Array(tif, dp, &data);
7535 0 : if (err == TIFFReadDirEntryErrOk)
7536 : {
7537 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
7538 : {
7539 0 : if (data != 0)
7540 0 : _TIFFfreeExt(tif, data);
7541 0 : return 0;
7542 : }
7543 : int m;
7544 0 : m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
7545 : data);
7546 0 : if (data != 0)
7547 0 : _TIFFfreeExt(tif, data);
7548 0 : if (!m)
7549 0 : return (0);
7550 : }
7551 : }
7552 0 : break;
7553 0 : case TIFF_SETGET_C32_FLOAT:
7554 : {
7555 : float *data;
7556 0 : assert(fip->field_readcount == TIFF_VARIABLE2);
7557 0 : assert(fip->field_passcount == 1);
7558 0 : err = TIFFReadDirEntryFloatArray(tif, dp, &data);
7559 0 : if (err == TIFFReadDirEntryErrOk)
7560 : {
7561 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
7562 : {
7563 0 : if (data != 0)
7564 0 : _TIFFfreeExt(tif, data);
7565 0 : return 0;
7566 : }
7567 : int m;
7568 0 : m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
7569 : data);
7570 0 : if (data != 0)
7571 0 : _TIFFfreeExt(tif, data);
7572 0 : if (!m)
7573 0 : return (0);
7574 : }
7575 : }
7576 0 : break;
7577 0 : case TIFF_SETGET_C32_DOUBLE:
7578 : {
7579 : double *data;
7580 0 : assert(fip->field_readcount == TIFF_VARIABLE2);
7581 0 : assert(fip->field_passcount == 1);
7582 0 : err = TIFFReadDirEntryDoubleArray(tif, dp, &data);
7583 0 : if (err == TIFFReadDirEntryErrOk)
7584 : {
7585 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
7586 : {
7587 0 : if (data != 0)
7588 0 : _TIFFfreeExt(tif, data);
7589 0 : return 0;
7590 : }
7591 : int m;
7592 0 : m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
7593 : data);
7594 0 : if (data != 0)
7595 0 : _TIFFfreeExt(tif, data);
7596 0 : if (!m)
7597 0 : return (0);
7598 : }
7599 : }
7600 0 : break;
7601 0 : case TIFF_SETGET_C32_IFD8:
7602 : {
7603 : uint64_t *data;
7604 0 : assert(fip->field_readcount == TIFF_VARIABLE2);
7605 0 : assert(fip->field_passcount == 1);
7606 0 : err = TIFFReadDirEntryIfd8Array(tif, dp, &data);
7607 0 : if (err == TIFFReadDirEntryErrOk)
7608 : {
7609 0 : if (!EvaluateIFDdatasizeReading(tif, dp))
7610 : {
7611 0 : if (data != 0)
7612 0 : _TIFFfreeExt(tif, data);
7613 0 : return 0;
7614 : }
7615 : int m;
7616 0 : m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
7617 : data);
7618 0 : if (data != 0)
7619 0 : _TIFFfreeExt(tif, data);
7620 0 : if (!m)
7621 0 : return (0);
7622 : }
7623 : }
7624 0 : break;
7625 51 : default:
7626 51 : assert(0); /* we should never get here */
7627 : break;
7628 : }
7629 408797 : if (err != TIFFReadDirEntryErrOk)
7630 : {
7631 9 : TIFFReadDirEntryOutputErr(tif, err, module, fip->field_name, recover);
7632 9 : return (0);
7633 : }
7634 408788 : return (1);
7635 : }
7636 :
7637 : /*
7638 : * Fetch a set of offsets or lengths.
7639 : * While this routine says "strips", in fact it's also used for tiles.
7640 : */
7641 68143 : static int TIFFFetchStripThing(TIFF *tif, TIFFDirEntry *dir, uint32_t nstrips,
7642 : uint64_t **lpp)
7643 : {
7644 : static const char module[] = "TIFFFetchStripThing";
7645 : enum TIFFReadDirEntryErr err;
7646 : uint64_t *data;
7647 68143 : err = TIFFReadDirEntryLong8ArrayWithLimit(tif, dir, &data, nstrips);
7648 68165 : if (err != TIFFReadDirEntryErrOk)
7649 : {
7650 0 : const TIFFField *fip = TIFFFieldWithTag(tif, dir->tdir_tag);
7651 0 : TIFFReadDirEntryOutputErr(tif, err, module,
7652 : fip ? fip->field_name : "unknown tagname", 0);
7653 0 : return (0);
7654 : }
7655 68165 : if (dir->tdir_count < (uint64_t)nstrips)
7656 : {
7657 : uint64_t *resizeddata;
7658 2 : const TIFFField *fip = TIFFFieldWithTag(tif, dir->tdir_tag);
7659 2 : const char *pszMax = getenv("LIBTIFF_STRILE_ARRAY_MAX_RESIZE_COUNT");
7660 2 : uint32_t max_nstrips = 1000000;
7661 2 : if (pszMax)
7662 0 : max_nstrips = (uint32_t)atoi(pszMax);
7663 2 : TIFFReadDirEntryOutputErr(tif, TIFFReadDirEntryErrCount, module,
7664 : fip ? fip->field_name : "unknown tagname",
7665 : (nstrips <= max_nstrips));
7666 :
7667 2 : if (nstrips > max_nstrips)
7668 : {
7669 0 : _TIFFfreeExt(tif, data);
7670 0 : return (0);
7671 : }
7672 :
7673 2 : const uint64_t allocsize = (uint64_t)nstrips * sizeof(uint64_t);
7674 2 : if (allocsize > 100 * 1024 * 1024)
7675 : {
7676 : /* Before allocating a huge amount of memory for corrupted files,
7677 : * check if size of requested memory is not greater than file size.
7678 : */
7679 0 : const uint64_t filesize = TIFFGetFileSize(tif);
7680 0 : if (allocsize > filesize)
7681 : {
7682 0 : TIFFWarningExtR(
7683 : tif, module,
7684 : "Requested memory size for StripArray of %" PRIu64
7685 : " is greater than filesize %" PRIu64
7686 : ". Memory not allocated",
7687 : allocsize, filesize);
7688 0 : _TIFFfreeExt(tif, data);
7689 0 : return (0);
7690 : }
7691 : }
7692 2 : resizeddata = (uint64_t *)_TIFFCheckMalloc(
7693 : tif, nstrips, sizeof(uint64_t), "for strip array");
7694 2 : if (resizeddata == 0)
7695 : {
7696 0 : _TIFFfreeExt(tif, data);
7697 0 : return (0);
7698 : }
7699 2 : if (dir->tdir_count)
7700 2 : _TIFFmemcpy(resizeddata, data,
7701 2 : (uint32_t)dir->tdir_count * sizeof(uint64_t));
7702 2 : _TIFFmemset(resizeddata + (uint32_t)dir->tdir_count, 0,
7703 2 : (nstrips - (uint32_t)dir->tdir_count) * sizeof(uint64_t));
7704 2 : _TIFFfreeExt(tif, data);
7705 0 : data = resizeddata;
7706 : }
7707 68158 : *lpp = data;
7708 68158 : return (1);
7709 : }
7710 :
7711 : /*
7712 : * Fetch and set the SubjectDistance EXIF tag.
7713 : */
7714 0 : static int TIFFFetchSubjectDistance(TIFF *tif, TIFFDirEntry *dir)
7715 : {
7716 : static const char module[] = "TIFFFetchSubjectDistance";
7717 : enum TIFFReadDirEntryErr err;
7718 : UInt64Aligned_t m;
7719 0 : m.l = 0;
7720 : assert(sizeof(double) == 8);
7721 : assert(sizeof(uint64_t) == 8);
7722 : assert(sizeof(uint32_t) == 4);
7723 0 : if (dir->tdir_count != 1)
7724 0 : err = TIFFReadDirEntryErrCount;
7725 0 : else if (dir->tdir_type != TIFF_RATIONAL)
7726 0 : err = TIFFReadDirEntryErrType;
7727 : else
7728 : {
7729 0 : if (!(tif->tif_flags & TIFF_BIGTIFF))
7730 : {
7731 : uint32_t offset;
7732 0 : offset = *(uint32_t *)(&dir->tdir_offset);
7733 0 : if (tif->tif_flags & TIFF_SWAB)
7734 0 : TIFFSwabLong(&offset);
7735 0 : err = TIFFReadDirEntryData(tif, offset, 8, m.i);
7736 : }
7737 : else
7738 : {
7739 0 : m.l = dir->tdir_offset.toff_long8;
7740 0 : err = TIFFReadDirEntryErrOk;
7741 : }
7742 : }
7743 0 : if (err == TIFFReadDirEntryErrOk)
7744 : {
7745 : double n;
7746 0 : if (tif->tif_flags & TIFF_SWAB)
7747 0 : TIFFSwabArrayOfLong(m.i, 2);
7748 0 : if (m.i[0] == 0)
7749 0 : n = 0.0;
7750 0 : else if (m.i[0] == 0xFFFFFFFF || m.i[1] == 0)
7751 : /*
7752 : * XXX: Numerator 0xFFFFFFFF means that we have infinite
7753 : * distance. Indicate that with a negative floating point
7754 : * SubjectDistance value.
7755 : */
7756 0 : n = -1.0;
7757 : else
7758 0 : n = (double)m.i[0] / (double)m.i[1];
7759 0 : return (TIFFSetField(tif, dir->tdir_tag, n));
7760 : }
7761 : else
7762 : {
7763 0 : TIFFReadDirEntryOutputErr(tif, err, module, "SubjectDistance", TRUE);
7764 0 : return (0);
7765 : }
7766 : }
7767 :
7768 159 : static void allocChoppedUpStripArrays(TIFF *tif, uint32_t nstrips,
7769 : uint64_t stripbytes,
7770 : uint32_t rowsperstrip)
7771 : {
7772 159 : TIFFDirectory *td = &tif->tif_dir;
7773 : uint64_t bytecount;
7774 : uint64_t offset;
7775 : uint64_t last_offset;
7776 : uint64_t last_bytecount;
7777 : uint32_t i;
7778 : uint64_t *newcounts;
7779 : uint64_t *newoffsets;
7780 :
7781 159 : offset = TIFFGetStrileOffset(tif, 0);
7782 159 : last_offset = TIFFGetStrileOffset(tif, td->td_nstrips - 1);
7783 159 : last_bytecount = TIFFGetStrileByteCount(tif, td->td_nstrips - 1);
7784 159 : if (last_offset > UINT64_MAX - last_bytecount ||
7785 159 : last_offset + last_bytecount < offset)
7786 : {
7787 0 : return;
7788 : }
7789 159 : bytecount = last_offset + last_bytecount - offset;
7790 :
7791 : /* Before allocating a huge amount of memory for corrupted files, check if
7792 : * size of StripByteCount and StripOffset tags is not greater than
7793 : * file size.
7794 : */
7795 159 : const uint64_t allocsize = (uint64_t)nstrips * sizeof(uint64_t) * 2;
7796 159 : if (allocsize > 100 * 1024 * 1024)
7797 : {
7798 0 : const uint64_t filesize = TIFFGetFileSize(tif);
7799 0 : if (allocsize > filesize)
7800 : {
7801 0 : TIFFWarningExtR(tif, "allocChoppedUpStripArrays",
7802 : "Requested memory size for StripByteCount and "
7803 : "StripOffsets %" PRIu64
7804 : " is greater than filesize %" PRIu64
7805 : ". Memory not allocated",
7806 : allocsize, filesize);
7807 0 : return;
7808 : }
7809 : }
7810 :
7811 : newcounts =
7812 159 : (uint64_t *)_TIFFCheckMalloc(tif, nstrips, sizeof(uint64_t),
7813 : "for chopped \"StripByteCounts\" array");
7814 159 : newoffsets = (uint64_t *)_TIFFCheckMalloc(
7815 : tif, nstrips, sizeof(uint64_t), "for chopped \"StripOffsets\" array");
7816 159 : if (newcounts == NULL || newoffsets == NULL)
7817 : {
7818 : /*
7819 : * Unable to allocate new strip information, give up and use
7820 : * the original one strip information.
7821 : */
7822 0 : if (newcounts != NULL)
7823 0 : _TIFFfreeExt(tif, newcounts);
7824 0 : if (newoffsets != NULL)
7825 0 : _TIFFfreeExt(tif, newoffsets);
7826 0 : return;
7827 : }
7828 :
7829 : /*
7830 : * Fill the strip information arrays with new bytecounts and offsets
7831 : * that reflect the broken-up format.
7832 : */
7833 106924 : for (i = 0; i < nstrips; i++)
7834 : {
7835 106765 : if (stripbytes > bytecount)
7836 53 : stripbytes = bytecount;
7837 106765 : newcounts[i] = stripbytes;
7838 106765 : newoffsets[i] = stripbytes ? offset : 0;
7839 106765 : offset += stripbytes;
7840 106765 : bytecount -= stripbytes;
7841 : }
7842 :
7843 : /*
7844 : * Replace old single strip info with multi-strip info.
7845 : */
7846 159 : td->td_stripsperimage = td->td_nstrips = nstrips;
7847 159 : TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
7848 :
7849 159 : _TIFFfreeExt(tif, td->td_stripbytecount_p);
7850 159 : _TIFFfreeExt(tif, td->td_stripoffset_p);
7851 159 : td->td_stripbytecount_p = newcounts;
7852 159 : td->td_stripoffset_p = newoffsets;
7853 : #ifdef STRIPBYTECOUNTSORTED_UNUSED
7854 : td->td_stripbytecountsorted = 1;
7855 : #endif
7856 159 : tif->tif_flags |= TIFF_CHOPPEDUPARRAYS;
7857 : }
7858 :
7859 : /*
7860 : * Replace a single strip (tile) of uncompressed data by multiple strips
7861 : * (tiles), each approximately STRIP_SIZE_DEFAULT bytes. This is useful for
7862 : * dealing with large images or for dealing with machines with a limited
7863 : * amount memory.
7864 : */
7865 17655 : static void ChopUpSingleUncompressedStrip(TIFF *tif)
7866 : {
7867 17655 : register TIFFDirectory *td = &tif->tif_dir;
7868 : uint64_t bytecount;
7869 : uint64_t offset;
7870 : uint32_t rowblock;
7871 : uint64_t rowblockbytes;
7872 : uint64_t stripbytes;
7873 : uint32_t nstrips;
7874 : uint32_t rowsperstrip;
7875 :
7876 17655 : bytecount = TIFFGetStrileByteCount(tif, 0);
7877 : /* On a newly created file, just re-opened to be filled, we */
7878 : /* don't want strip chop to trigger as it is going to cause issues */
7879 : /* later ( StripOffsets and StripByteCounts improperly filled) . */
7880 17616 : if (bytecount == 0 && tif->tif_mode != O_RDONLY)
7881 446 : return;
7882 17170 : offset = TIFFGetStrileByteCount(tif, 0);
7883 17180 : assert(td->td_planarconfig == PLANARCONFIG_CONTIG);
7884 17150 : if ((td->td_photometric == PHOTOMETRIC_YCBCR) && (!isUpSampled(tif)))
7885 1 : rowblock = td->td_ycbcrsubsampling[1];
7886 : else
7887 17149 : rowblock = 1;
7888 17150 : rowblockbytes = TIFFVTileSize64(tif, rowblock);
7889 : /*
7890 : * Make the rows hold at least one scanline, but fill specified amount
7891 : * of data if possible.
7892 : */
7893 17126 : if (rowblockbytes > STRIP_SIZE_DEFAULT)
7894 : {
7895 20 : stripbytes = rowblockbytes;
7896 20 : rowsperstrip = rowblock;
7897 : }
7898 17106 : else if (rowblockbytes > 0)
7899 : {
7900 : uint32_t rowblocksperstrip;
7901 17084 : rowblocksperstrip = (uint32_t)(STRIP_SIZE_DEFAULT / rowblockbytes);
7902 17084 : rowsperstrip = rowblocksperstrip * rowblock;
7903 17084 : stripbytes = rowblocksperstrip * rowblockbytes;
7904 : }
7905 : else
7906 22 : return;
7907 :
7908 : /*
7909 : * never increase the number of rows per strip
7910 : */
7911 17104 : if (rowsperstrip >= td->td_rowsperstrip || rowsperstrip == 0)
7912 16946 : return;
7913 158 : nstrips = TIFFhowmany_32(td->td_imagelength, rowsperstrip);
7914 158 : if (nstrips == 0)
7915 0 : return;
7916 :
7917 : /* If we are going to allocate a lot of memory, make sure that the */
7918 : /* file is as big as needed */
7919 159 : if (tif->tif_mode == O_RDONLY && nstrips > 1000000 &&
7920 1 : (offset >= TIFFGetFileSize(tif) ||
7921 0 : stripbytes > (TIFFGetFileSize(tif) - offset) / (nstrips - 1)))
7922 : {
7923 1 : return;
7924 : }
7925 :
7926 157 : allocChoppedUpStripArrays(tif, nstrips, stripbytes, rowsperstrip);
7927 : }
7928 :
7929 : /*
7930 : * Replace a file with contiguous strips > 2 GB of uncompressed data by
7931 : * multiple smaller strips. This is useful for
7932 : * dealing with large images or for dealing with machines with a limited
7933 : * amount memory.
7934 : */
7935 5 : static void TryChopUpUncompressedBigTiff(TIFF *tif)
7936 : {
7937 5 : TIFFDirectory *td = &tif->tif_dir;
7938 : uint32_t rowblock;
7939 : uint64_t rowblockbytes;
7940 : uint32_t i;
7941 : uint64_t stripsize;
7942 : uint32_t rowblocksperstrip;
7943 : uint32_t rowsperstrip;
7944 : uint64_t stripbytes;
7945 : uint32_t nstrips;
7946 :
7947 5 : stripsize = TIFFStripSize64(tif);
7948 :
7949 5 : assert(tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG);
7950 5 : assert(tif->tif_dir.td_compression == COMPRESSION_NONE);
7951 5 : assert((tif->tif_flags & (TIFF_STRIPCHOP | TIFF_ISTILED)) ==
7952 : TIFF_STRIPCHOP);
7953 5 : assert(stripsize > 0x7FFFFFFFUL);
7954 :
7955 : /* On a newly created file, just re-opened to be filled, we */
7956 : /* don't want strip chop to trigger as it is going to cause issues */
7957 : /* later ( StripOffsets and StripByteCounts improperly filled) . */
7958 5 : if (TIFFGetStrileByteCount(tif, 0) == 0 && tif->tif_mode != O_RDONLY)
7959 0 : return;
7960 :
7961 5 : if ((td->td_photometric == PHOTOMETRIC_YCBCR) && (!isUpSampled(tif)))
7962 0 : rowblock = td->td_ycbcrsubsampling[1];
7963 : else
7964 5 : rowblock = 1;
7965 5 : rowblockbytes = TIFFVStripSize64(tif, rowblock);
7966 5 : if (rowblockbytes == 0 || rowblockbytes > 0x7FFFFFFFUL)
7967 : {
7968 : /* In case of file with gigantic width */
7969 3 : return;
7970 : }
7971 :
7972 : /* Check that the strips are contiguous and of the expected size */
7973 5 : for (i = 0; i < td->td_nstrips; i++)
7974 : {
7975 3 : if (i == td->td_nstrips - 1)
7976 : {
7977 4 : if (TIFFGetStrileByteCount(tif, i) <
7978 2 : TIFFVStripSize64(tif,
7979 2 : td->td_imagelength - i * td->td_rowsperstrip))
7980 : {
7981 0 : return;
7982 : }
7983 : }
7984 : else
7985 : {
7986 1 : if (TIFFGetStrileByteCount(tif, i) != stripsize)
7987 : {
7988 0 : return;
7989 : }
7990 1 : if (i > 0 && TIFFGetStrileOffset(tif, i) !=
7991 0 : TIFFGetStrileOffset(tif, i - 1) +
7992 0 : TIFFGetStrileByteCount(tif, i - 1))
7993 : {
7994 0 : return;
7995 : }
7996 : }
7997 : }
7998 :
7999 : /* Aim for 512 MB strips (that will still be manageable by 32 bit builds */
8000 2 : rowblocksperstrip = (uint32_t)(512 * 1024 * 1024 / rowblockbytes);
8001 2 : if (rowblocksperstrip == 0)
8002 0 : rowblocksperstrip = 1;
8003 2 : rowsperstrip = rowblocksperstrip * rowblock;
8004 2 : stripbytes = rowblocksperstrip * rowblockbytes;
8005 2 : assert(stripbytes <= 0x7FFFFFFFUL);
8006 :
8007 2 : if (rowsperstrip == 0)
8008 0 : return;
8009 2 : nstrips = TIFFhowmany_32(td->td_imagelength, rowsperstrip);
8010 2 : if (nstrips == 0)
8011 0 : return;
8012 :
8013 : /* If we are going to allocate a lot of memory, make sure that the */
8014 : /* file is as big as needed */
8015 2 : if (tif->tif_mode == O_RDONLY && nstrips > 1000000)
8016 : {
8017 0 : uint64_t last_offset = TIFFGetStrileOffset(tif, td->td_nstrips - 1);
8018 0 : uint64_t filesize = TIFFGetFileSize(tif);
8019 : uint64_t last_bytecount =
8020 0 : TIFFGetStrileByteCount(tif, td->td_nstrips - 1);
8021 0 : if (last_offset > filesize || last_bytecount > filesize - last_offset)
8022 : {
8023 0 : return;
8024 : }
8025 : }
8026 :
8027 2 : allocChoppedUpStripArrays(tif, nstrips, stripbytes, rowsperstrip);
8028 : }
8029 :
8030 : TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
8031 6264260 : static uint64_t _TIFFUnsanitizedAddUInt64AndInt(uint64_t a, int b)
8032 : {
8033 6264260 : return a + b;
8034 : }
8035 :
8036 : /* Read the value of [Strip|Tile]Offset or [Strip|Tile]ByteCount around
8037 : * strip/tile of number strile. Also fetch the neighbouring values using a
8038 : * 4096 byte page size.
8039 : */
8040 5953 : static int _TIFFPartialReadStripArray(TIFF *tif, TIFFDirEntry *dirent,
8041 : int strile, uint64_t *panVals)
8042 : {
8043 : static const char module[] = "_TIFFPartialReadStripArray";
8044 : #define IO_CACHE_PAGE_SIZE 4096
8045 :
8046 : size_t sizeofval;
8047 5953 : const int bSwab = (tif->tif_flags & TIFF_SWAB) != 0;
8048 : int sizeofvalint;
8049 : uint64_t nBaseOffset;
8050 : uint64_t nOffset;
8051 : uint64_t nOffsetStartPage;
8052 : uint64_t nOffsetEndPage;
8053 : tmsize_t nToRead;
8054 : tmsize_t nRead;
8055 : uint64_t nLastStripOffset;
8056 : int iStartBefore;
8057 : int i;
8058 5953 : const uint32_t arraySize = tif->tif_dir.td_stripoffsetbyteallocsize;
8059 : unsigned char buffer[2 * IO_CACHE_PAGE_SIZE];
8060 :
8061 5953 : assert(dirent->tdir_count > 4);
8062 :
8063 5953 : if (dirent->tdir_type == TIFF_SHORT)
8064 : {
8065 1813 : sizeofval = sizeof(uint16_t);
8066 : }
8067 4140 : else if (dirent->tdir_type == TIFF_LONG)
8068 : {
8069 4108 : sizeofval = sizeof(uint32_t);
8070 : }
8071 32 : else if (dirent->tdir_type == TIFF_LONG8)
8072 : {
8073 32 : sizeofval = sizeof(uint64_t);
8074 : }
8075 0 : else if (dirent->tdir_type == TIFF_SLONG8)
8076 : {
8077 : /* Non conformant but used by some images as in */
8078 : /* https://github.com/OSGeo/gdal/issues/2165 */
8079 0 : sizeofval = sizeof(int64_t);
8080 : }
8081 : else
8082 : {
8083 0 : TIFFErrorExtR(tif, module,
8084 : "Invalid type for [Strip|Tile][Offset/ByteCount] tag");
8085 0 : panVals[strile] = 0;
8086 0 : return 0;
8087 : }
8088 5953 : sizeofvalint = (int)(sizeofval);
8089 :
8090 5953 : if (tif->tif_flags & TIFF_BIGTIFF)
8091 : {
8092 58 : uint64_t offset = dirent->tdir_offset.toff_long8;
8093 58 : if (bSwab)
8094 0 : TIFFSwabLong8(&offset);
8095 58 : nBaseOffset = offset;
8096 : }
8097 : else
8098 : {
8099 5895 : uint32_t offset = dirent->tdir_offset.toff_long;
8100 5895 : if (bSwab)
8101 62 : TIFFSwabLong(&offset);
8102 5895 : nBaseOffset = offset;
8103 : }
8104 : /* To avoid later unsigned integer overflows */
8105 5953 : if (nBaseOffset > (uint64_t)INT64_MAX)
8106 : {
8107 0 : TIFFErrorExtR(tif, module, "Cannot read offset/size for strile %d",
8108 : strile);
8109 0 : panVals[strile] = 0;
8110 0 : return 0;
8111 : }
8112 5953 : nOffset = nBaseOffset + sizeofval * strile;
8113 5953 : nOffsetStartPage = (nOffset / IO_CACHE_PAGE_SIZE) * IO_CACHE_PAGE_SIZE;
8114 5953 : nOffsetEndPage = nOffsetStartPage + IO_CACHE_PAGE_SIZE;
8115 :
8116 5953 : if (nOffset + sizeofval > nOffsetEndPage)
8117 1963 : nOffsetEndPage += IO_CACHE_PAGE_SIZE;
8118 : #undef IO_CACHE_PAGE_SIZE
8119 :
8120 5953 : nLastStripOffset = nBaseOffset + arraySize * sizeofval;
8121 5953 : if (nLastStripOffset < nOffsetEndPage)
8122 2939 : nOffsetEndPage = nLastStripOffset;
8123 5953 : if (nOffsetStartPage >= nOffsetEndPage)
8124 : {
8125 0 : TIFFErrorExtR(tif, module, "Cannot read offset/size for strile %d",
8126 : strile);
8127 0 : panVals[strile] = 0;
8128 0 : return 0;
8129 : }
8130 5953 : if (!SeekOK(tif, nOffsetStartPage))
8131 : {
8132 0 : panVals[strile] = 0;
8133 0 : return 0;
8134 : }
8135 :
8136 5953 : nToRead = (tmsize_t)(nOffsetEndPage - nOffsetStartPage);
8137 5953 : nRead = TIFFReadFile(tif, buffer, nToRead);
8138 5953 : if (nRead < nToRead)
8139 : {
8140 1 : TIFFErrorExtR(tif, module,
8141 : "Cannot read offset/size for strile around ~%d", strile);
8142 1 : return 0;
8143 : }
8144 5952 : iStartBefore = -(int)((nOffset - nOffsetStartPage) / sizeofval);
8145 5952 : if (strile + iStartBefore < 0)
8146 2955 : iStartBefore = -strile;
8147 5952 : for (i = iStartBefore;
8148 12531500 : (uint32_t)(strile + i) < arraySize &&
8149 6264260 : _TIFFUnsanitizedAddUInt64AndInt(nOffset, (i + 1) * sizeofvalint) <=
8150 : nOffsetEndPage;
8151 6261240 : ++i)
8152 : {
8153 6261240 : if (dirent->tdir_type == TIFF_SHORT)
8154 : {
8155 : uint16_t val;
8156 2103890 : memcpy(&val,
8157 2103890 : buffer + (nOffset - nOffsetStartPage) + i * sizeofvalint,
8158 : sizeof(val));
8159 2103890 : if (bSwab)
8160 1493 : TIFFSwabShort(&val);
8161 2103890 : panVals[strile + i] = val;
8162 : }
8163 4157350 : else if (dirent->tdir_type == TIFF_LONG)
8164 : {
8165 : uint32_t val;
8166 4155920 : memcpy(&val,
8167 4155920 : buffer + (nOffset - nOffsetStartPage) + i * sizeofvalint,
8168 : sizeof(val));
8169 4155920 : if (bSwab)
8170 1801 : TIFFSwabLong(&val);
8171 4155920 : panVals[strile + i] = val;
8172 : }
8173 1431 : else if (dirent->tdir_type == TIFF_LONG8)
8174 : {
8175 : uint64_t val;
8176 1431 : memcpy(&val,
8177 1431 : buffer + (nOffset - nOffsetStartPage) + i * sizeofvalint,
8178 : sizeof(val));
8179 1431 : if (bSwab)
8180 0 : TIFFSwabLong8(&val);
8181 1431 : panVals[strile + i] = val;
8182 : }
8183 : else /* if( dirent->tdir_type == TIFF_SLONG8 ) */
8184 : {
8185 : /* Non conformant data type */
8186 : int64_t val;
8187 0 : memcpy(&val,
8188 0 : buffer + (nOffset - nOffsetStartPage) + i * sizeofvalint,
8189 : sizeof(val));
8190 0 : if (bSwab)
8191 0 : TIFFSwabLong8((uint64_t *)&val);
8192 0 : panVals[strile + i] = (uint64_t)val;
8193 : }
8194 : }
8195 5952 : return 1;
8196 : }
8197 :
8198 6340630 : static int _TIFFFetchStrileValue(TIFF *tif, uint32_t strile,
8199 : TIFFDirEntry *dirent, uint64_t **parray)
8200 : {
8201 : static const char module[] = "_TIFFFetchStrileValue";
8202 6340630 : TIFFDirectory *td = &tif->tif_dir;
8203 6340630 : if (strile >= dirent->tdir_count)
8204 : {
8205 0 : return 0;
8206 : }
8207 6340630 : if (strile >= td->td_stripoffsetbyteallocsize)
8208 : {
8209 1484 : uint32_t nStripArrayAllocBefore = td->td_stripoffsetbyteallocsize;
8210 : uint32_t nStripArrayAllocNew;
8211 : uint64_t nArraySize64;
8212 : size_t nArraySize;
8213 : uint64_t *offsetArray;
8214 : uint64_t *bytecountArray;
8215 :
8216 1484 : if (strile > 1000000)
8217 : {
8218 3 : uint64_t filesize = TIFFGetFileSize(tif);
8219 : /* Avoid excessive memory allocation attempt */
8220 : /* For such a big blockid we need at least a TIFF_LONG per strile */
8221 : /* for the offset array. */
8222 3 : if (strile > filesize / sizeof(uint32_t))
8223 : {
8224 2 : TIFFErrorExtR(tif, module, "File too short");
8225 2 : return 0;
8226 : }
8227 : }
8228 :
8229 1482 : if (td->td_stripoffsetbyteallocsize == 0 &&
8230 1481 : td->td_nstrips < 1024 * 1024)
8231 : {
8232 1480 : nStripArrayAllocNew = td->td_nstrips;
8233 : }
8234 : else
8235 : {
8236 : #define TIFF_MAX(a, b) (((a) > (b)) ? (a) : (b))
8237 : #define TIFF_MIN(a, b) (((a) < (b)) ? (a) : (b))
8238 2 : nStripArrayAllocNew = TIFF_MAX(strile + 1, 1024U * 512U);
8239 2 : if (nStripArrayAllocNew < 0xFFFFFFFFU / 2)
8240 2 : nStripArrayAllocNew *= 2;
8241 2 : nStripArrayAllocNew = TIFF_MIN(nStripArrayAllocNew, td->td_nstrips);
8242 : }
8243 1482 : assert(strile < nStripArrayAllocNew);
8244 1482 : nArraySize64 = (uint64_t)sizeof(uint64_t) * nStripArrayAllocNew;
8245 1482 : nArraySize = (size_t)(nArraySize64);
8246 : #if SIZEOF_SIZE_T == 4
8247 : if (nArraySize != nArraySize64)
8248 : {
8249 : TIFFErrorExtR(tif, module,
8250 : "Cannot allocate strip offset and bytecount arrays");
8251 : return 0;
8252 : }
8253 : #endif
8254 1482 : offsetArray = (uint64_t *)(_TIFFreallocExt(tif, td->td_stripoffset_p,
8255 : nArraySize));
8256 1482 : bytecountArray = (uint64_t *)(_TIFFreallocExt(
8257 1482 : tif, td->td_stripbytecount_p, nArraySize));
8258 1482 : if (offsetArray)
8259 1482 : td->td_stripoffset_p = offsetArray;
8260 1482 : if (bytecountArray)
8261 1482 : td->td_stripbytecount_p = bytecountArray;
8262 1482 : if (offsetArray && bytecountArray)
8263 : {
8264 1482 : td->td_stripoffsetbyteallocsize = nStripArrayAllocNew;
8265 : /* Initialize new entries to ~0 / -1 */
8266 : /* coverity[overrun-buffer-arg] */
8267 1482 : memset(td->td_stripoffset_p + nStripArrayAllocBefore, 0xFF,
8268 1482 : (td->td_stripoffsetbyteallocsize - nStripArrayAllocBefore) *
8269 : sizeof(uint64_t));
8270 : /* coverity[overrun-buffer-arg] */
8271 1482 : memset(td->td_stripbytecount_p + nStripArrayAllocBefore, 0xFF,
8272 1482 : (td->td_stripoffsetbyteallocsize - nStripArrayAllocBefore) *
8273 : sizeof(uint64_t));
8274 : }
8275 : else
8276 : {
8277 0 : TIFFErrorExtR(tif, module,
8278 : "Cannot allocate strip offset and bytecount arrays");
8279 0 : _TIFFfreeExt(tif, td->td_stripoffset_p);
8280 0 : td->td_stripoffset_p = NULL;
8281 0 : _TIFFfreeExt(tif, td->td_stripbytecount_p);
8282 0 : td->td_stripbytecount_p = NULL;
8283 0 : td->td_stripoffsetbyteallocsize = 0;
8284 : }
8285 : }
8286 6340620 : if (*parray == NULL || strile >= td->td_stripoffsetbyteallocsize)
8287 0 : return 0;
8288 :
8289 6340620 : if (~((*parray)[strile]) == 0)
8290 : {
8291 5953 : if (!_TIFFPartialReadStripArray(tif, dirent, strile, *parray))
8292 : {
8293 1 : (*parray)[strile] = 0;
8294 1 : return 0;
8295 : }
8296 : }
8297 :
8298 6340620 : return 1;
8299 : }
8300 :
8301 6807640 : static uint64_t _TIFFGetStrileOffsetOrByteCountValue(TIFF *tif, uint32_t strile,
8302 : TIFFDirEntry *dirent,
8303 : uint64_t **parray,
8304 : int *pbErr)
8305 : {
8306 6807640 : TIFFDirectory *td = &tif->tif_dir;
8307 6807640 : if (pbErr)
8308 4285010 : *pbErr = 0;
8309 6807640 : if ((tif->tif_flags & TIFF_DEFERSTRILELOAD) &&
8310 6644750 : !(tif->tif_flags & TIFF_CHOPPEDUPARRAYS))
8311 : {
8312 6638260 : if (!(tif->tif_flags & TIFF_LAZYSTRILELOAD) ||
8313 : /* If the values may fit in the toff_long/toff_long8 member */
8314 : /* then use _TIFFFillStriles to simplify _TIFFFetchStrileValue */
8315 6356200 : dirent->tdir_count <= 4)
8316 : {
8317 297655 : if (!_TIFFFillStriles(tif))
8318 : {
8319 0 : if (pbErr)
8320 0 : *pbErr = 1;
8321 : /* Do not return, as we want this function to always */
8322 : /* return the same value if called several times with */
8323 : /* the same arguments */
8324 : }
8325 : }
8326 : else
8327 : {
8328 6340610 : if (!_TIFFFetchStrileValue(tif, strile, dirent, parray))
8329 : {
8330 3 : if (pbErr)
8331 3 : *pbErr = 1;
8332 3 : return 0;
8333 : }
8334 : }
8335 : }
8336 6807620 : if (*parray == NULL || strile >= td->td_nstrips)
8337 : {
8338 0 : if (pbErr)
8339 0 : *pbErr = 1;
8340 0 : return 0;
8341 : }
8342 6807670 : return (*parray)[strile];
8343 : }
8344 :
8345 : /* Return the value of the TileOffsets/StripOffsets array for the specified
8346 : * tile/strile */
8347 2138820 : uint64_t TIFFGetStrileOffset(TIFF *tif, uint32_t strile)
8348 : {
8349 2138820 : return TIFFGetStrileOffsetWithErr(tif, strile, NULL);
8350 : }
8351 :
8352 : /* Return the value of the TileOffsets/StripOffsets array for the specified
8353 : * tile/strile */
8354 4256200 : uint64_t TIFFGetStrileOffsetWithErr(TIFF *tif, uint32_t strile, int *pbErr)
8355 : {
8356 4256200 : TIFFDirectory *td = &tif->tif_dir;
8357 4256200 : return _TIFFGetStrileOffsetOrByteCountValue(tif, strile,
8358 : &(td->td_stripoffset_entry),
8359 : &(td->td_stripoffset_p), pbErr);
8360 : }
8361 :
8362 : /* Return the value of the TileByteCounts/StripByteCounts array for the
8363 : * specified tile/strile */
8364 384053 : uint64_t TIFFGetStrileByteCount(TIFF *tif, uint32_t strile)
8365 : {
8366 384053 : return TIFFGetStrileByteCountWithErr(tif, strile, NULL);
8367 : }
8368 :
8369 : /* Return the value of the TileByteCounts/StripByteCounts array for the
8370 : * specified tile/strile */
8371 2551540 : uint64_t TIFFGetStrileByteCountWithErr(TIFF *tif, uint32_t strile, int *pbErr)
8372 : {
8373 2551540 : TIFFDirectory *td = &tif->tif_dir;
8374 2551540 : return _TIFFGetStrileOffsetOrByteCountValue(
8375 : tif, strile, &(td->td_stripbytecount_entry), &(td->td_stripbytecount_p),
8376 : pbErr);
8377 : }
8378 :
8379 637113 : int _TIFFFillStriles(TIFF *tif) { return _TIFFFillStrilesInternal(tif, 1); }
8380 :
8381 637130 : static int _TIFFFillStrilesInternal(TIFF *tif, int loadStripByteCount)
8382 : {
8383 637130 : register TIFFDirectory *td = &tif->tif_dir;
8384 637130 : int return_value = 1;
8385 :
8386 : /* Do not do anything if TIFF_DEFERSTRILELOAD is not set */
8387 637130 : if (!(tif->tif_flags & TIFF_DEFERSTRILELOAD) ||
8388 319363 : (tif->tif_flags & TIFF_CHOPPEDUPARRAYS) != 0)
8389 317813 : return 1;
8390 :
8391 319317 : if (tif->tif_flags & TIFF_LAZYSTRILELOAD)
8392 : {
8393 : /* In case of lazy loading, reload completely the arrays */
8394 15604 : _TIFFfreeExt(tif, td->td_stripoffset_p);
8395 15634 : _TIFFfreeExt(tif, td->td_stripbytecount_p);
8396 15655 : td->td_stripoffset_p = NULL;
8397 15655 : td->td_stripbytecount_p = NULL;
8398 15655 : td->td_stripoffsetbyteallocsize = 0;
8399 15655 : tif->tif_flags &= ~TIFF_LAZYSTRILELOAD;
8400 : }
8401 :
8402 : /* If stripoffset array is already loaded, exit with success */
8403 319368 : if (td->td_stripoffset_p != NULL)
8404 299189 : return 1;
8405 :
8406 : /* If tdir_count was canceled, then we already got there, but in error */
8407 20179 : if (td->td_stripoffset_entry.tdir_count == 0)
8408 116 : return 0;
8409 :
8410 20063 : if (!TIFFFetchStripThing(tif, &(td->td_stripoffset_entry), td->td_nstrips,
8411 : &td->td_stripoffset_p))
8412 : {
8413 0 : return_value = 0;
8414 : }
8415 :
8416 40162 : if (loadStripByteCount &&
8417 19995 : !TIFFFetchStripThing(tif, &(td->td_stripbytecount_entry),
8418 : td->td_nstrips, &td->td_stripbytecount_p))
8419 : {
8420 0 : return_value = 0;
8421 : }
8422 :
8423 20167 : _TIFFmemset(&(td->td_stripoffset_entry), 0, sizeof(TIFFDirEntry));
8424 20092 : _TIFFmemset(&(td->td_stripbytecount_entry), 0, sizeof(TIFFDirEntry));
8425 :
8426 : #ifdef STRIPBYTECOUNTSORTED_UNUSED
8427 : if (tif->tif_dir.td_nstrips > 1 && return_value == 1)
8428 : {
8429 : uint32_t strip;
8430 :
8431 : tif->tif_dir.td_stripbytecountsorted = 1;
8432 : for (strip = 1; strip < tif->tif_dir.td_nstrips; strip++)
8433 : {
8434 : if (tif->tif_dir.td_stripoffset_p[strip - 1] >
8435 : tif->tif_dir.td_stripoffset_p[strip])
8436 : {
8437 : tif->tif_dir.td_stripbytecountsorted = 0;
8438 : break;
8439 : }
8440 : }
8441 : }
8442 : #endif
8443 :
8444 20077 : return return_value;
8445 : }
|