Coverage Report

Created: 2026-04-10 07:04

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