ReactOS 0.4.16-dev-2613-g9533ad7
tif_open.c
Go to the documentation of this file.
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
29#ifdef TIFF_DO_NOT_USE_NON_EXT_ALLOC_FUNCTIONS
30#undef TIFF_DO_NOT_USE_NON_EXT_ALLOC_FUNCTIONS
31#endif
32
33#include "tiffiop.h"
34#include <assert.h>
35#include <limits.h>
36
37/*
38 * Dummy functions to fill the omitted client procedures.
39 */
41{
42 (void)fd;
43 (void)pbase;
44 (void)psize;
45 return (0);
46}
47
49{
50 (void)fd;
51 (void)base;
52 (void)size;
53}
54
55int _TIFFgetMode(TIFFOpenOptions *opts, thandle_t clientdata, const char *mode,
56 const char *module)
57{
58 int m = -1;
59
60 switch (mode[0])
61 {
62 case 'r':
63 m = O_RDONLY;
64 if (mode[1] == '+')
65 m = O_RDWR;
66 break;
67 case 'w':
68 case 'a':
69 m = O_RDWR | O_CREAT;
70 if (mode[0] == 'w')
71 m |= O_TRUNC;
72 break;
73 default:
74 _TIFFErrorEarly(opts, clientdata, module, "\"%s\": Bad mode", mode);
75 break;
76 }
77 return (m);
78}
79
81{
82 TIFFOpenOptions *opts =
84 return opts;
85}
86
88
95 tmsize_t max_single_mem_alloc)
96{
97 opts->max_single_mem_alloc = max_single_mem_alloc;
98}
99
107 tmsize_t max_cumulated_mem_alloc)
108{
109 opts->max_cumulated_mem_alloc = max_cumulated_mem_alloc;
110}
111
116 int warn_about_unknown_tags)
117{
118 opts->warn_about_unknown_tags = warn_about_unknown_tags;
119}
120
123 void *errorhandler_user_data)
124{
125 opts->errorhandler = handler;
126 opts->errorhandler_user_data = errorhandler_user_data;
127}
128
131 void *warnhandler_user_data)
132{
133 opts->warnhandler = handler;
134 opts->warnhandler_user_data = warnhandler_user_data;
135}
136
138 const char *pszFunction,
139 tmsize_t s)
140{
141 TIFFErrorExtR(tif, pszFunction,
142 "Memory allocation of %" PRIu64
143 " bytes is beyond the %" PRIu64
144 " byte limit defined in open options",
146}
147
149 const char *pszFunction,
150 tmsize_t s)
151{
152 TIFFErrorExtR(tif, pszFunction,
153 "Cumulated memory allocation of %" PRIu64 " + %" PRIu64
154 " bytes is beyond the %" PRIu64
155 " cumulated byte limit defined in open options",
158}
159
160/* When allocating memory, we write at the beginning of the buffer it size.
161 * This allows us to keep track of the total memory allocated when we
162 * malloc/calloc/realloc and free. In theory we need just SIZEOF_SIZE_T bytes
163 * for that, but on x86_64, allocations of more than 16 bytes are aligned on
164 * 16 bytes. Hence using 2 * SIZEOF_SIZE_T.
165 * It is critical that _TIFFmallocExt/_TIFFcallocExt/_TIFFreallocExt are
166 * paired with _TIFFfreeExt.
167 * CMakeLists.txt defines TIFF_DO_NOT_USE_NON_EXT_ALLOC_FUNCTIONS, which in
168 * turn disables the definition of the non Ext version in tiffio.h
169 */
170#define LEADING_AREA_TO_STORE_ALLOC_SIZE (2 * SIZEOF_SIZE_T)
171
174{
175 if (tif != NULL && tif->tif_max_single_mem_alloc > 0 &&
177 {
178 _TIFFEmitErrorAboveMaxSingleMemAlloc(tif, "_TIFFmallocExt", s);
179 return NULL;
180 }
181 if (tif != NULL && tif->tif_max_cumulated_mem_alloc > 0)
182 {
183 if (s > tif->tif_max_cumulated_mem_alloc -
186 {
187 _TIFFEmitErrorAboveMaxCumulatedMemAlloc(tif, "_TIFFmallocExt", s);
188 return NULL;
189 }
191 if (!ptr)
192 return NULL;
194 memcpy(ptr, &s, sizeof(s));
195 return (char *)ptr + LEADING_AREA_TO_STORE_ALLOC_SIZE;
196 }
197 return _TIFFmalloc(s);
198}
199
201void *_TIFFcallocExt(TIFF *tif, tmsize_t nmemb, tmsize_t siz)
202{
203 if (nmemb <= 0 || siz <= 0 || nmemb > TIFF_TMSIZE_T_MAX / siz)
204 return NULL;
205 if (tif != NULL && tif->tif_max_single_mem_alloc > 0)
206 {
207 if (nmemb * siz > tif->tif_max_single_mem_alloc)
208 {
209 _TIFFEmitErrorAboveMaxSingleMemAlloc(tif, "_TIFFcallocExt",
210 nmemb * siz);
211 return NULL;
212 }
213 }
214 if (tif != NULL && tif->tif_max_cumulated_mem_alloc > 0)
215 {
216 const tmsize_t s = nmemb * siz;
217 if (s > tif->tif_max_cumulated_mem_alloc -
220 {
221 _TIFFEmitErrorAboveMaxCumulatedMemAlloc(tif, "_TIFFcallocExt", s);
222 return NULL;
223 }
225 if (!ptr)
226 return NULL;
228 memcpy(ptr, &s, sizeof(s));
229 return (char *)ptr + LEADING_AREA_TO_STORE_ALLOC_SIZE;
230 }
231 return _TIFFcalloc(nmemb, siz);
232}
233
235void *_TIFFreallocExt(TIFF *tif, void *p, tmsize_t s)
236{
237 if (tif != NULL && tif->tif_max_single_mem_alloc > 0 &&
239 {
240 _TIFFEmitErrorAboveMaxSingleMemAlloc(tif, "_TIFFreallocExt", s);
241 return NULL;
242 }
243 if (tif != NULL && tif->tif_max_cumulated_mem_alloc > 0)
244 {
245 void *oldPtr = p;
246 tmsize_t oldSize = 0;
247 if (p)
248 {
249 oldPtr = (char *)p - LEADING_AREA_TO_STORE_ALLOC_SIZE;
250 memcpy(&oldSize, oldPtr, sizeof(oldSize));
251 assert(oldSize <= tif->tif_cur_cumulated_mem_alloc);
252 }
253 if (s > oldSize &&
255 (tif->tif_cur_cumulated_mem_alloc - oldSize) ||
257 {
258 _TIFFEmitErrorAboveMaxCumulatedMemAlloc(tif, "_TIFFreallocExt",
259 s - oldSize);
260 return NULL;
261 }
262 void *newPtr =
264 if (newPtr == NULL)
265 return NULL;
266 tif->tif_cur_cumulated_mem_alloc -= oldSize;
268 memcpy(newPtr, &s, sizeof(s));
269 return (char *)newPtr + LEADING_AREA_TO_STORE_ALLOC_SIZE;
270 }
271 return _TIFFrealloc(p, s);
272}
273
275void _TIFFfreeExt(TIFF *tif, void *p)
276{
277 if (p != NULL && tif != NULL && tif->tif_max_cumulated_mem_alloc > 0)
278 {
279 void *oldPtr = (char *)p - LEADING_AREA_TO_STORE_ALLOC_SIZE;
280 tmsize_t oldSize;
281 memcpy(&oldSize, oldPtr, sizeof(oldSize));
282 assert(oldSize <= tif->tif_cur_cumulated_mem_alloc);
283 tif->tif_cur_cumulated_mem_alloc -= oldSize;
284 p = oldPtr;
285 }
286 _TIFFfree(p);
287}
288
289TIFF *TIFFClientOpen(const char *name, const char *mode, thandle_t clientdata,
291 TIFFSeekProc seekproc, TIFFCloseProc closeproc,
292 TIFFSizeProc sizeproc, TIFFMapFileProc mapproc,
293 TIFFUnmapFileProc unmapproc)
294{
295 return TIFFClientOpenExt(name, mode, clientdata, readproc, writeproc,
296 seekproc, closeproc, sizeproc, mapproc, unmapproc,
297 NULL);
298}
299
300TIFF *TIFFClientOpenExt(const char *name, const char *mode,
302 TIFFReadWriteProc writeproc, TIFFSeekProc seekproc,
303 TIFFCloseProc closeproc, TIFFSizeProc sizeproc,
304 TIFFMapFileProc mapproc, TIFFUnmapFileProc unmapproc,
305 TIFFOpenOptions *opts)
306{
307 static const char module[] = "TIFFClientOpenExt";
308 TIFF *tif;
309 int m;
310 const char *cp;
311
312 /* The following are configuration checks. They should be redundant, but
313 * should not compile to any actual code in an optimised release build
314 * anyway. If any of them fail, (makefile-based or other) configuration is
315 * not correct */
316 assert(sizeof(uint8_t) == 1);
317 assert(sizeof(int8_t) == 1);
318 assert(sizeof(uint16_t) == 2);
319 assert(sizeof(int16_t) == 2);
320 assert(sizeof(uint32_t) == 4);
321 assert(sizeof(int32_t) == 4);
322 assert(sizeof(uint64_t) == 8);
323 assert(sizeof(int64_t) == 8);
324 {
325 union
326 {
327 uint8_t a8[2];
328 uint16_t a16;
329 } n;
330 n.a8[0] = 1;
331 n.a8[1] = 0;
332 (void)n;
333#ifdef WORDS_BIGENDIAN
334 assert(n.a16 == 256);
335#else
336 assert(n.a16 == 1);
337#endif
338 }
339
340 m = _TIFFgetMode(opts, clientdata, mode, module);
341 if (m == -1)
342 goto bad2;
343 tmsize_t size_to_alloc = (tmsize_t)(sizeof(TIFF) + strlen(name) + 1);
344 if (opts && opts->max_single_mem_alloc > 0 &&
345 size_to_alloc > opts->max_single_mem_alloc)
346 {
347 _TIFFErrorEarly(opts, clientdata, module,
348 "%s: Memory allocation of %" PRIu64
349 " bytes is beyond the %" PRIu64
350 " byte limit defined in open options",
351 name, (uint64_t)size_to_alloc,
353 goto bad2;
354 }
355 if (opts && opts->max_cumulated_mem_alloc > 0 &&
356 size_to_alloc > opts->max_cumulated_mem_alloc)
357 {
358 _TIFFErrorEarly(opts, clientdata, module,
359 "%s: Memory allocation of %" PRIu64
360 " bytes is beyond the %" PRIu64
361 " cumulated byte limit defined in open options",
362 name, (uint64_t)size_to_alloc,
364 goto bad2;
365 }
366 tif = (TIFF *)_TIFFmallocExt(NULL, size_to_alloc);
367 if (tif == NULL)
368 {
369 _TIFFErrorEarly(opts, clientdata, module,
370 "%s: Out of memory (TIFF structure)", name);
371 goto bad2;
372 }
373 _TIFFmemset(tif, 0, sizeof(*tif));
374 tif->tif_name = (char *)tif + sizeof(TIFF);
375 strcpy(tif->tif_name, name);
376 tif->tif_mode = m & ~(O_CREAT | O_TRUNC);
377 tif->tif_curdir = TIFF_NON_EXISTENT_DIR_NUMBER; /* non-existent directory */
379 tif->tif_curoff = 0;
380 tif->tif_curstrip = (uint32_t)-1; /* invalid strip */
381 tif->tif_row = (uint32_t)-1; /* read/write pre-increment */
382 tif->tif_clientdata = clientdata;
383 tif->tif_readproc = readproc;
384 tif->tif_writeproc = writeproc;
385 tif->tif_seekproc = seekproc;
386 tif->tif_closeproc = closeproc;
387 tif->tif_sizeproc = sizeproc;
388 tif->tif_mapproc = mapproc ? mapproc : _tiffDummyMapProc;
389 tif->tif_unmapproc = unmapproc ? unmapproc : _tiffDummyUnmapProc;
390 if (opts)
391 {
392 tif->tif_errorhandler = opts->errorhandler;
394 tif->tif_warnhandler = opts->warnhandler;
399 }
400
401 if (!readproc || !writeproc || !seekproc || !closeproc || !sizeproc)
402 {
404 "One of the client procedures is NULL pointer.");
405 _TIFFfreeExt(NULL, tif);
406 goto bad2;
407 }
408
409 _TIFFSetDefaultCompressionState(tif); /* setup default state */
410 /*
411 * Default is to return data MSB2LSB and enable the
412 * use of memory-mapped files and strip chopping when
413 * a file is opened read-only.
414 */
416 if (m == O_RDONLY)
417 tif->tif_flags |= TIFF_MAPPED;
418
419#ifdef STRIPCHOP_DEFAULT
420 if (m == O_RDONLY || m == O_RDWR)
422#endif
423
424 /*
425 * Process library-specific flags in the open mode string.
426 * The following flags may be used to control intrinsic library
427 * behavior that may or may not be desirable (usually for
428 * compatibility with some application that claims to support
429 * TIFF but only supports some brain dead idea of what the
430 * vendor thinks TIFF is):
431 *
432 * 'l' use little-endian byte order for creating a file
433 * 'b' use big-endian byte order for creating a file
434 * 'L' read/write information using LSB2MSB bit order
435 * 'B' read/write information using MSB2LSB bit order
436 * 'H' read/write information using host bit order
437 * 'M' enable use of memory-mapped files when supported
438 * 'm' disable use of memory-mapped files
439 * 'C' enable strip chopping support when reading
440 * 'c' disable strip chopping support
441 * 'h' read TIFF header only, do not load the first IFD
442 * '4' ClassicTIFF for creating a file (default)
443 * '8' BigTIFF for creating a file
444 * 'D' enable use of deferred strip/tile offset/bytecount array loading.
445 * 'O' on-demand loading of values instead of whole array loading (implies
446 * D)
447 *
448 * The use of the 'l' and 'b' flags is strongly discouraged.
449 * These flags are provided solely because numerous vendors,
450 * typically on the PC, do not correctly support TIFF; they
451 * only support the Intel little-endian byte order. This
452 * support is not configured by default because it supports
453 * the violation of the TIFF spec that says that readers *MUST*
454 * support both byte orders. It is strongly recommended that
455 * you not use this feature except to deal with busted apps
456 * that write invalid TIFF. And even in those cases you should
457 * bang on the vendors to fix their software.
458 *
459 * The 'L', 'B', and 'H' flags are intended for applications
460 * that can optimize operations on data by using a particular
461 * bit order. By default the library returns data in MSB2LSB
462 * bit order for compatibility with older versions of this
463 * library. Returning data in the bit order of the native CPU
464 * makes the most sense but also requires applications to check
465 * the value of the FillOrder tag; something they probably do
466 * not do right now.
467 *
468 * The 'M' and 'm' flags are provided because some virtual memory
469 * systems exhibit poor behavior when large images are mapped.
470 * These options permit clients to control the use of memory-mapped
471 * files on a per-file basis.
472 *
473 * The 'C' and 'c' flags are provided because the library support
474 * for chopping up large strips into multiple smaller strips is not
475 * application-transparent and as such can cause problems. The 'c'
476 * option permits applications that only want to look at the tags,
477 * for example, to get the unadulterated TIFF tag information.
478 */
479 for (cp = mode; *cp; cp++)
480 switch (*cp)
481 {
482 case 'b':
483#ifndef WORDS_BIGENDIAN
484 if (m & O_CREAT)
485 tif->tif_flags |= TIFF_SWAB;
486#endif
487 break;
488 case 'l':
489#ifdef WORDS_BIGENDIAN
490 if ((m & O_CREAT))
491 tif->tif_flags |= TIFF_SWAB;
492#endif
493 break;
494 case 'B':
495 tif->tif_flags =
496 (tif->tif_flags & ~TIFF_FILLORDER) | FILLORDER_MSB2LSB;
497 break;
498 case 'L':
499 tif->tif_flags =
500 (tif->tif_flags & ~TIFF_FILLORDER) | FILLORDER_LSB2MSB;
501 break;
502 case 'H':
504 "H(ost) mode is deprecated. Since "
505 "libtiff 4.5.1, it is an alias of 'B' / "
506 "FILLORDER_MSB2LSB.");
507 tif->tif_flags =
508 (tif->tif_flags & ~TIFF_FILLORDER) | FILLORDER_MSB2LSB;
509 break;
510 case 'M':
511 if (m == O_RDONLY)
512 tif->tif_flags |= TIFF_MAPPED;
513 break;
514 case 'm':
515 if (m == O_RDONLY)
516 tif->tif_flags &= ~TIFF_MAPPED;
517 break;
518 case 'C':
519 if (m == O_RDONLY)
521 break;
522 case 'c':
523 if (m == O_RDONLY)
524 tif->tif_flags &= ~TIFF_STRIPCHOP;
525 break;
526 case 'h':
528 break;
529 case '8':
530 if (m & O_CREAT)
531 tif->tif_flags |= TIFF_BIGTIFF;
532 break;
533 case 'D':
535 break;
536 case 'O':
537 if (m == O_RDONLY)
538 tif->tif_flags |=
540 break;
541 }
542
543#ifdef DEFER_STRILE_LOAD
544 /* Compatibility with old DEFER_STRILE_LOAD compilation flag */
545 /* Probably unneeded, since to the best of my knowledge (E. Rouault) */
546 /* GDAL was the only user of this, and will now use the new 'D' flag */
548#endif
549
550 /*
551 * Read in TIFF header.
552 */
553 if ((m & O_TRUNC) ||
554 !ReadOK(tif, &tif->tif_header, sizeof(TIFFHeaderClassic)))
555 {
556 if (tif->tif_mode == O_RDONLY)
557 {
558 TIFFErrorExtR(tif, name, "Cannot read TIFF header");
559 goto bad;
560 }
561 /*
562 * Setup header and write.
563 */
564#ifdef WORDS_BIGENDIAN
567#else
570#endif
571 TIFFHeaderUnion tif_header_swapped;
572 if (!(tif->tif_flags & TIFF_BIGTIFF))
573 {
576 tif->tif_header_size = sizeof(TIFFHeaderClassic);
577 /* Swapped copy for writing */
578 _TIFFmemcpy(&tif_header_swapped, &tif->tif_header,
579 sizeof(TIFFHeaderUnion));
580 if (tif->tif_flags & TIFF_SWAB)
581 TIFFSwabShort(&tif_header_swapped.common.tiff_version);
582 }
583 else
584 {
587 tif->tif_header.big.tiff_unused = 0;
588 tif->tif_header.big.tiff_diroff = 0;
589 tif->tif_header_size = sizeof(TIFFHeaderBig);
590 /* Swapped copy for writing */
591 _TIFFmemcpy(&tif_header_swapped, &tif->tif_header,
592 sizeof(TIFFHeaderUnion));
593 if (tif->tif_flags & TIFF_SWAB)
594 {
595 TIFFSwabShort(&tif_header_swapped.common.tiff_version);
596 TIFFSwabShort(&tif_header_swapped.big.tiff_offsetsize);
597 }
598 }
599 /*
600 * The doc for "fopen" for some STD_C_LIBs says that if you
601 * open a file for modify ("+"), then you must fseek (or
602 * fflush?) between any freads and fwrites. This is not
603 * necessary on most systems, but has been shown to be needed
604 * on Solaris.
605 */
606 TIFFSeekFile(tif, 0, SEEK_SET);
607 if (!WriteOK(tif, &tif_header_swapped,
608 (tmsize_t)(tif->tif_header_size)))
609 {
610 TIFFErrorExtR(tif, name, "Error writing TIFF header");
611 goto bad;
612 }
613 /*
614 * Setup default directory.
615 */
616 if (!TIFFDefaultDirectory(tif))
617 goto bad;
618 tif->tif_diroff = 0;
619 tif->tif_lastdiroff = 0;
621 /* tif_curdircount = 0 means 'empty file opened for writing, but no IFD
622 * written yet' */
623 tif->tif_curdircount = 0;
624 return (tif);
625 }
626
627 /*
628 * Setup the byte order handling according to the opened file for reading.
629 */
632#if MDI_SUPPORT
633 &&
636#else
638#endif
639 )
640 {
641 TIFFErrorExtR(tif, name,
642 "Not a TIFF or MDI file, bad magic number %" PRIu16
643 " (0x%" PRIx16 ")",
644#else
645 )
646 {
647 TIFFErrorExtR(tif, name,
648 "Not a TIFF file, bad magic number %" PRIu16
649 " (0x%" PRIx16 ")",
650#endif
653 goto bad;
654 }
656 {
657#ifndef WORDS_BIGENDIAN
658 tif->tif_flags |= TIFF_SWAB;
659#endif
660 }
661 else
662 {
663#ifdef WORDS_BIGENDIAN
664 tif->tif_flags |= TIFF_SWAB;
665#endif
666 }
667 if (tif->tif_flags & TIFF_SWAB)
671 {
672 TIFFErrorExtR(tif, name,
673 "Not a TIFF file, bad version number %" PRIu16
674 " (0x%" PRIx16 ")",
677 goto bad;
678 }
680 {
681 if (tif->tif_flags & TIFF_SWAB)
683 tif->tif_header_size = sizeof(TIFFHeaderClassic);
684 }
685 else
686 {
687 if (!ReadOK(tif,
688 ((uint8_t *)(&tif->tif_header) + sizeof(TIFFHeaderClassic)),
689 (sizeof(TIFFHeaderBig) - sizeof(TIFFHeaderClassic))))
690 {
691 TIFFErrorExtR(tif, name, "Cannot read TIFF header");
692 goto bad;
693 }
694 if (tif->tif_flags & TIFF_SWAB)
695 {
698 }
699 if (tif->tif_header.big.tiff_offsetsize != 8)
700 {
701 TIFFErrorExtR(tif, name,
702 "Not a TIFF file, bad BigTIFF offsetsize %" PRIu16
703 " (0x%" PRIx16 ")",
706 goto bad;
707 }
708 if (tif->tif_header.big.tiff_unused != 0)
709 {
710 TIFFErrorExtR(tif, name,
711 "Not a TIFF file, bad BigTIFF unused %" PRIu16
712 " (0x%" PRIx16 ")",
715 goto bad;
716 }
717 tif->tif_header_size = sizeof(TIFFHeaderBig);
718 tif->tif_flags |= TIFF_BIGTIFF;
719 }
720 tif->tif_flags |= TIFF_MYBUFFER;
721 tif->tif_rawcp = tif->tif_rawdata = 0;
722 tif->tif_rawdatasize = 0;
723 tif->tif_rawdataoff = 0;
724 tif->tif_rawdataloaded = 0;
725
726 switch (mode[0])
727 {
728 case 'r':
729 if (!(tif->tif_flags & TIFF_BIGTIFF))
731 else
733 /*
734 * Try to use a memory-mapped file if the client
735 * has not explicitly suppressed usage with the
736 * 'm' flag in the open mode (see above).
737 */
738 if (tif->tif_flags & TIFF_MAPPED)
739 {
740 toff_t n;
741 if (TIFFMapFileContents(tif, (void **)(&tif->tif_base), &n))
742 {
743 tif->tif_size = (tmsize_t)n;
744 assert((toff_t)tif->tif_size == n);
745 }
746 else
747 tif->tif_flags &= ~TIFF_MAPPED;
748 }
749 /*
750 * Sometimes we do not want to read the first directory (for
751 * example, it may be broken) and want to proceed to other
752 * directories. I this case we use the TIFF_HEADERONLY flag to open
753 * file and return immediately after reading TIFF header.
754 * However, the pointer to TIFFSetField() and TIFFGetField()
755 * (i.e. tif->tif_tagmethods.vsetfield and
756 * tif->tif_tagmethods.vgetfield) need to be initialized, which is
757 * done in TIFFDefaultDirectory().
758 */
759 if (tif->tif_flags & TIFF_HEADERONLY)
760 {
761 if (!TIFFDefaultDirectory(tif))
762 goto bad;
763 return (tif);
764 }
765
766 /*
767 * Setup initial directory.
768 */
769 if (TIFFReadDirectory(tif))
770 {
771 return (tif);
772 }
773 break;
774 case 'a':
775 /*
776 * New directories are automatically append
777 * to the end of the directory chain when they
778 * are written out (see TIFFWriteDirectory).
779 */
780 if (!TIFFDefaultDirectory(tif))
781 goto bad;
782 return (tif);
783 }
784bad:
785 tif->tif_mode = O_RDONLY; /* XXX avoid flush */
786 TIFFCleanup(tif);
787bad2:
788 return ((TIFF *)0);
789}
790
791/*
792 * Query functions to access private data.
793 */
794
795/*
796 * Return open file's name.
797 */
798const char *TIFFFileName(TIFF *tif) { return (tif->tif_name); }
799
800/*
801 * Set the file name.
802 */
803const char *TIFFSetFileName(TIFF *tif, const char *name)
804{
805 const char *old_name = tif->tif_name;
806 tif->tif_name = (char *)name;
807 return (old_name);
808}
809
810/*
811 * Return open file's I/O descriptor.
812 */
813int TIFFFileno(TIFF *tif) { return (tif->tif_fd); }
814
815/*
816 * Set open file's I/O descriptor, and return previous value.
817 */
818int TIFFSetFileno(TIFF *tif, int fd)
819{
820 int old_fd = tif->tif_fd;
821 tif->tif_fd = fd;
822 return old_fd;
823}
824
825/*
826 * Return open file's clientdata.
827 */
829
830/*
831 * Set open file's clientdata, and return previous value.
832 */
834{
836 tif->tif_clientdata = newvalue;
837 return m;
838}
839
840/*
841 * Return read/write mode.
842 */
843int TIFFGetMode(TIFF *tif) { return (tif->tif_mode); }
844
845/*
846 * Return read/write mode.
847 */
848int TIFFSetMode(TIFF *tif, int mode)
849{
850 int old_mode = tif->tif_mode;
851 tif->tif_mode = mode;
852 return (old_mode);
853}
854
855/*
856 * Return nonzero if file is organized in
857 * tiles; zero if organized as strips.
858 */
859int TIFFIsTiled(TIFF *tif) { return (isTiled(tif)); }
860
861/*
862 * Return current row being read/written.
863 */
864uint32_t TIFFCurrentRow(TIFF *tif) { return (tif->tif_row); }
865
866/*
867 * Return index of the current directory.
868 */
870
871/*
872 * Return current strip.
873 */
875
876/*
877 * Return current tile.
878 */
879uint32_t TIFFCurrentTile(TIFF *tif) { return (tif->tif_curtile); }
880
881/*
882 * Return nonzero if the file has byte-swapped data.
883 */
884int TIFFIsByteSwapped(TIFF *tif) { return ((tif->tif_flags & TIFF_SWAB) != 0); }
885
886/*
887 * Return nonzero if the data is returned up-sampled.
888 */
889int TIFFIsUpSampled(TIFF *tif) { return (isUpSampled(tif)); }
890
891/*
892 * Return nonzero if the data is returned in MSB-to-LSB bit order.
893 */
894int TIFFIsMSB2LSB(TIFF *tif) { return (isFillOrder(tif, FILLORDER_MSB2LSB)); }
895
896/*
897 * Return nonzero if given file was written in big-endian order.
898 */
900{
902}
903
904/*
905 * Return nonzero if given file is BigTIFF style.
906 */
907int TIFFIsBigTIFF(TIFF *tif) { return ((tif->tif_flags & TIFF_BIGTIFF) != 0); }
908
909/*
910 * Return pointer to file read method.
911 */
913
914/*
915 * Return pointer to file write method.
916 */
918
919/*
920 * Return pointer to file seek method.
921 */
923
924/*
925 * Return pointer to file close method.
926 */
928
929/*
930 * Return pointer to file size requesting method.
931 */
933
934/*
935 * Return pointer to memory mapping method.
936 */
938
939/*
940 * Return pointer to memory unmapping method.
941 */
943{
944 return (tif->tif_unmapproc);
945}
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
INT32 int32_t
Definition: types.h:71
UINT32 uint32_t
Definition: types.h:75
INT16 int16_t
Definition: types.h:70
UINT64 uint64_t
Definition: types.h:77
INT64 int64_t
Definition: types.h:72
UINT(* handler)(MSIPACKAGE *)
Definition: action.c:7512
#define assert(_expr)
Definition: assert.h:32
#define O_CREAT
Definition: fcntl.h:43
#define O_RDONLY
Definition: fcntl.h:34
#define O_RDWR
Definition: fcntl.h:36
#define O_TRUNC
Definition: fcntl.h:44
#define PRIx16
Definition: inttypes.h:100
#define PRIu16
Definition: inttypes.h:83
#define PRIu64
Definition: inttypes.h:28
unsigned short uint16_t
Definition: stdint.h:35
unsigned char uint8_t
Definition: stdint.h:33
signed char int8_t
Definition: stdint.h:32
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1592
GLdouble s
Definition: gl.h:2039
GLdouble n
Definition: glext.h:7729
GLsizeiptr size
Definition: glext.h:5919
GLenum mode
Definition: glext.h:6217
GLfloat GLfloat p
Definition: glext.h:8902
const GLfloat * m
Definition: glext.h:10848
#define SEEK_SET
Definition: jmemansi.c:26
if(dx< 0)
Definition: linetemp.h:194
POINT cp
Definition: magnifier.c:59
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static BOOL readproc(HANDLE proc, LPVOID address, PVOID target, DWORD size)
Definition: env.c:217
static PVOID ptr
Definition: dispmode.c:27
#define uint32_t
Definition: nsiface.idl:61
_Must_inspect_result_ _Out_ LPSIZE psize
Definition: ntgdi.h:1569
strcpy
Definition: string.h:131
static int fd
Definition: io.c:51
uint64_t tiff_diroff
Definition: tiff.h:122
uint16_t tiff_unused
Definition: tiff.h:121
uint16_t tiff_offsetsize
Definition: tiff.h:120
uint32_t tiff_diroff
Definition: tiff.h:114
uint16_t tiff_magic
Definition: tiff.h:107
uint16_t tiff_version
Definition: tiff.h:108
void * errorhandler_user_data
Definition: tiffiop.h:264
tmsize_t max_cumulated_mem_alloc
Definition: tiffiop.h:268
TIFFErrorHandlerExtR errorhandler
Definition: tiffiop.h:263
int warn_about_unknown_tags
Definition: tiffiop.h:269
TIFFErrorHandlerExtR warnhandler
Definition: tiffiop.h:265
void * warnhandler_user_data
Definition: tiffiop.h:266
tmsize_t max_single_mem_alloc
Definition: tiffiop.h:267
Definition: name.c:39
Definition: tiffiop.h:113
uint32_t tif_curtile
Definition: tiffiop.h:194
TIFFReadWriteProc tif_readproc
Definition: tiffiop.h:233
int tif_warn_about_unknown_tags
Definition: tiffiop.h:258
TIFFReadWriteProc tif_writeproc
Definition: tiffiop.h:234
tdir_t tif_curdircount
Definition: tiffiop.h:183
tmsize_t tif_max_single_mem_alloc
Definition: tiffiop.h:255
TIFFUnmapFileProc tif_unmapproc
Definition: tiffiop.h:230
TIFFSeekProc tif_seekproc
Definition: tiffiop.h:235
int tif_setdirectory_force_absolute
Definition: tiffiop.h:155
TIFFErrorHandlerExtR tif_errorhandler
Definition: tiffiop.h:251
tmsize_t tif_rawdataloaded
Definition: tiffiop.h:223
uint64_t tif_curoff
Definition: tiffiop.h:185
uint64_t tif_nextdiroff
Definition: tiffiop.h:151
void * tif_errorhandler_user_data
Definition: tiffiop.h:252
TIFFCloseProc tif_closeproc
Definition: tiffiop.h:236
thandle_t tif_clientdata
Definition: tiffiop.h:232
uint64_t tif_diroff
Definition: tiffiop.h:150
char * tif_name
Definition: tiffiop.h:114
TIFFErrorHandlerExtR tif_warnhandler
Definition: tiffiop.h:253
tmsize_t tif_size
Definition: tiffiop.h:228
uint16_t tif_header_size
Definition: tiffiop.h:161
tdir_t tif_curdir
Definition: tiffiop.h:179
tmsize_t tif_cur_cumulated_mem_alloc
Definition: tiffiop.h:257
int tif_fd
Definition: tiffiop.h:115
void * tif_warnhandler_user_data
Definition: tiffiop.h:254
uint8_t * tif_rawcp
Definition: tiffiop.h:224
TIFFMapFileProc tif_mapproc
Definition: tiffiop.h:229
uint8_t * tif_rawdata
Definition: tiffiop.h:220
TIFFHeaderUnion tif_header
Definition: tiffiop.h:160
tmsize_t tif_rawdatasize
Definition: tiffiop.h:221
tmsize_t tif_max_cumulated_mem_alloc
Definition: tiffiop.h:256
tmsize_t tif_rawdataoff
Definition: tiffiop.h:222
uint32_t tif_flags
Definition: tiffiop.h:117
uint32_t tif_row
Definition: tiffiop.h:162
uint64_t tif_lastdiroff
Definition: tiffiop.h:152
uint32_t tif_curstrip
Definition: tiffiop.h:184
int tif_mode
Definition: tiffiop.h:116
TIFFSizeProc tif_sizeproc
Definition: tiffiop.h:237
uint8_t * tif_base
Definition: tiffiop.h:227
void TIFFCleanup(TIFF *tif)
Definition: tif_close.c:44
void _TIFFSetDefaultCompressionState(TIFF *tif)
Definition: tif_compress.c:142
int TIFFDefaultDirectory(TIFF *tif)
Definition: tif_dir.c:1752
int TIFFReadDirectory(TIFF *tif)
Definition: tif_dirread.c:4236
void _TIFFErrorEarly(TIFFOpenOptions *opts, thandle_t clientdata, const char *module, const char *fmt,...)
Definition: tif_error.c:80
void TIFFErrorExtR(TIFF *tif, const char *module, const char *fmt,...)
Definition: tif_error.c:107
void TIFFOpenOptionsSetWarningHandlerExtR(TIFFOpenOptions *opts, TIFFErrorHandlerExtR handler, void *warnhandler_user_data)
Definition: tif_open.c:129
void _TIFFfreeExt(TIFF *tif, void *p)
Definition: tif_open.c:275
int TIFFGetMode(TIFF *tif)
Definition: tif_open.c:843
int TIFFFileno(TIFF *tif)
Definition: tif_open.c:813
TIFF * TIFFClientOpenExt(const char *name, const char *mode, thandle_t clientdata, TIFFReadWriteProc readproc, TIFFReadWriteProc writeproc, TIFFSeekProc seekproc, TIFFCloseProc closeproc, TIFFSizeProc sizeproc, TIFFMapFileProc mapproc, TIFFUnmapFileProc unmapproc, TIFFOpenOptions *opts)
Definition: tif_open.c:300
TIFF * TIFFClientOpen(const char *name, const char *mode, thandle_t clientdata, TIFFReadWriteProc readproc, TIFFReadWriteProc writeproc, TIFFSeekProc seekproc, TIFFCloseProc closeproc, TIFFSizeProc sizeproc, TIFFMapFileProc mapproc, TIFFUnmapFileProc unmapproc)
Definition: tif_open.c:289
TIFFReadWriteProc TIFFGetReadProc(TIFF *tif)
Definition: tif_open.c:912
void TIFFOpenOptionsSetErrorHandlerExtR(TIFFOpenOptions *opts, TIFFErrorHandlerExtR handler, void *errorhandler_user_data)
Definition: tif_open.c:121
int TIFFSetFileno(TIFF *tif, int fd)
Definition: tif_open.c:818
TIFFCloseProc TIFFGetCloseProc(TIFF *tif)
Definition: tif_open.c:927
static void _TIFFEmitErrorAboveMaxCumulatedMemAlloc(TIFF *tif, const char *pszFunction, tmsize_t s)
Definition: tif_open.c:148
const char * TIFFFileName(TIFF *tif)
Definition: tif_open.c:798
TIFFSizeProc TIFFGetSizeProc(TIFF *tif)
Definition: tif_open.c:932
TIFFOpenOptions * TIFFOpenOptionsAlloc()
Definition: tif_open.c:80
int TIFFSetMode(TIFF *tif, int mode)
Definition: tif_open.c:848
tdir_t TIFFCurrentDirectory(TIFF *tif)
Definition: tif_open.c:869
int _tiffDummyMapProc(thandle_t fd, void **pbase, toff_t *psize)
Definition: tif_open.c:40
int TIFFIsMSB2LSB(TIFF *tif)
Definition: tif_open.c:894
int TIFFIsByteSwapped(TIFF *tif)
Definition: tif_open.c:884
uint32_t TIFFCurrentTile(TIFF *tif)
Definition: tif_open.c:879
void * _TIFFreallocExt(TIFF *tif, void *p, tmsize_t s)
Definition: tif_open.c:235
TIFFMapFileProc TIFFGetMapFileProc(TIFF *tif)
Definition: tif_open.c:937
void TIFFOpenOptionsSetMaxCumulatedMemAlloc(TIFFOpenOptions *opts, tmsize_t max_cumulated_mem_alloc)
Definition: tif_open.c:106
int TIFFIsTiled(TIFF *tif)
Definition: tif_open.c:859
const char * TIFFSetFileName(TIFF *tif, const char *name)
Definition: tif_open.c:803
void TIFFOpenOptionsSetWarnAboutUnknownTags(TIFFOpenOptions *opts, int warn_about_unknown_tags)
Definition: tif_open.c:115
int _TIFFgetMode(TIFFOpenOptions *opts, thandle_t clientdata, const char *mode, const char *module)
Definition: tif_open.c:55
uint32_t TIFFCurrentRow(TIFF *tif)
Definition: tif_open.c:864
TIFFSeekProc TIFFGetSeekProc(TIFF *tif)
Definition: tif_open.c:922
void * _TIFFmallocExt(TIFF *tif, tmsize_t s)
Definition: tif_open.c:173
int TIFFIsBigTIFF(TIFF *tif)
Definition: tif_open.c:907
thandle_t TIFFSetClientdata(TIFF *tif, thandle_t newvalue)
Definition: tif_open.c:833
TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF *tif)
Definition: tif_open.c:942
void * _TIFFcallocExt(TIFF *tif, tmsize_t nmemb, tmsize_t siz)
Definition: tif_open.c:201
int TIFFIsBigEndian(TIFF *tif)
Definition: tif_open.c:899
int TIFFIsUpSampled(TIFF *tif)
Definition: tif_open.c:889
static void _TIFFEmitErrorAboveMaxSingleMemAlloc(TIFF *tif, const char *pszFunction, tmsize_t s)
Definition: tif_open.c:137
TIFFReadWriteProc TIFFGetWriteProc(TIFF *tif)
Definition: tif_open.c:917
void TIFFOpenOptionsSetMaxSingleMemAlloc(TIFFOpenOptions *opts, tmsize_t max_single_mem_alloc)
Definition: tif_open.c:94
void _tiffDummyUnmapProc(thandle_t fd, void *base, toff_t size)
Definition: tif_open.c:48
thandle_t TIFFClientdata(TIFF *tif)
Definition: tif_open.c:828
uint32_t TIFFCurrentStrip(TIFF *tif)
Definition: tif_open.c:874
#define LEADING_AREA_TO_STORE_ALLOC_SIZE
Definition: tif_open.c:170
void TIFFOpenOptionsFree(TIFFOpenOptions *opts)
Definition: tif_open.c:87
void TIFFSwabLong8(uint64_t *lp)
Definition: tif_swab.c:60
void TIFFSwabShort(uint16_t *wp)
Definition: tif_swab.c:33
void TIFFSwabLong(uint32_t *lp)
Definition: tif_swab.c:45
void _TIFFfree(void *p)
Definition: tif_unix.c:349
void * _TIFFcalloc(tmsize_t nmemb, tmsize_t siz)
Definition: tif_unix.c:341
void _TIFFmemset(void *p, int v, tmsize_t c)
Definition: tif_unix.c:353
void * _TIFFmalloc(tmsize_t s)
Definition: tif_unix.c:333
void _TIFFmemcpy(void *d, const void *s, tmsize_t c)
Definition: tif_unix.c:355
void * _TIFFrealloc(void *p, tmsize_t s)
Definition: tif_unix.c:351
void TIFFWarningExtR(TIFF *tif, const char *module, const char *fmt,...)
Definition: tif_warning.c:80
#define FILLORDER_LSB2MSB
Definition: tiff.h:242
#define TIFF_LITTLEENDIAN
Definition: tiff.h:52
#define MDI_LITTLEENDIAN
Definition: tiff.h:53
#define FILLORDER_MSB2LSB
Definition: tiff.h:241
#define MDI_BIGENDIAN
Definition: tiff.h:54
#define TIFF_VERSION_BIG
Definition: tiff.h:49
#define TIFF_VERSION_CLASSIC
Definition: tiff.h:48
#define TIFF_BIGENDIAN
Definition: tiff.h:51
#define HOST_BIGENDIAN
Definition: tiffconf.h:70
#define STRIPCHOP_DEFAULT
Definition: tiffconf.h:114
#define MDI_SUPPORT
Definition: tiffconf.h:129
int(* TIFFMapFileProc)(thandle_t, void **base, toff_t *size)
Definition: tiffio.h:310
TIFF_SSIZE_T tmsize_t
Definition: tiffio.h:67
int(* TIFFErrorHandlerExtR)(TIFF *, void *user_data, const char *, const char *, va_list)
Definition: tiffio.h:304
void(* TIFFUnmapFileProc)(thandle_t, void *base, toff_t size)
Definition: tiffio.h:311
#define TIFF_TMSIZE_T_MAX
Definition: tiffio.h:68
toff_t(* TIFFSizeProc)(thandle_t)
Definition: tiffio.h:309
uint64_t toff_t
Definition: tiffio.h:70
uint32_t tdir_t
Definition: tiffio.h:71
tmsize_t(* TIFFReadWriteProc)(thandle_t, void *, tmsize_t)
Definition: tiffio.h:306
toff_t(* TIFFSeekProc)(thandle_t, toff_t, int)
Definition: tiffio.h:307
int(* TIFFCloseProc)(thandle_t)
Definition: tiffio.h:308
#define TIFF_NON_EXISTENT_DIR_NUMBER
Definition: tiffiop.h:64
#define isTiled(tif)
Definition: tiffiop.h:274
#define TIFF_LAZYSTRILELOAD
Definition: tiffiop.h:146
#define WriteOK(tif, buf, size)
Definition: tiffiop.h:301
#define isUpSampled(tif)
Definition: tiffiop.h:277
#define TIFF_MYBUFFER
Definition: tiffiop.h:126
#define ReadOK(tif, buf, size)
Definition: tiffiop.h:295
#define TIFF_HEADERONLY
Definition: tiffiop.h:133
#define TIFFMapFileContents(tif, paddr, psize)
Definition: tiffiop.h:286
#define TIFF_STRIPCHOP
Definition: tiffiop.h:132
#define TIFF_DEFERSTRILELOAD
Definition: tiffiop.h:144
#define isFillOrder(tif, o)
Definition: tiffiop.h:276
#define TIFFSeekFile(tif, off, whence)
Definition: tiffiop.h:282
#define TIFF_MAPPED
Definition: tiffiop.h:128
#define TIFF_BIGTIFF
Definition: tiffiop.h:138
#define TIFF_SWAB
Definition: tiffiop.h:124
TIFFHeaderCommon common
Definition: tiffiop.h:107
TIFFHeaderClassic classic
Definition: tiffiop.h:108
TIFFHeaderBig big
Definition: tiffiop.h:109