1*3ac0a46fSAndroid Build Coastguard Worker /*
2*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 1988-1997 Sam Leffler
3*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 1991-1997 Silicon Graphics, Inc.
4*3ac0a46fSAndroid Build Coastguard Worker *
5*3ac0a46fSAndroid Build Coastguard Worker * Permission to use, copy, modify, distribute, and sell this software and
6*3ac0a46fSAndroid Build Coastguard Worker * its documentation for any purpose is hereby granted without fee, provided
7*3ac0a46fSAndroid Build Coastguard Worker * that (i) the above copyright notices and this permission notice appear in
8*3ac0a46fSAndroid Build Coastguard Worker * all copies of the software and related documentation, and (ii) the names of
9*3ac0a46fSAndroid Build Coastguard Worker * Sam Leffler and Silicon Graphics may not be used in any advertising or
10*3ac0a46fSAndroid Build Coastguard Worker * publicity relating to the software without the specific, prior written
11*3ac0a46fSAndroid Build Coastguard Worker * permission of Sam Leffler and Silicon Graphics.
12*3ac0a46fSAndroid Build Coastguard Worker *
13*3ac0a46fSAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
14*3ac0a46fSAndroid Build Coastguard Worker * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
15*3ac0a46fSAndroid Build Coastguard Worker * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
16*3ac0a46fSAndroid Build Coastguard Worker *
17*3ac0a46fSAndroid Build Coastguard Worker * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
18*3ac0a46fSAndroid Build Coastguard Worker * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
19*3ac0a46fSAndroid Build Coastguard Worker * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20*3ac0a46fSAndroid Build Coastguard Worker * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
21*3ac0a46fSAndroid Build Coastguard Worker * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
22*3ac0a46fSAndroid Build Coastguard Worker * OF THIS SOFTWARE.
23*3ac0a46fSAndroid Build Coastguard Worker */
24*3ac0a46fSAndroid Build Coastguard Worker
25*3ac0a46fSAndroid Build Coastguard Worker /*
26*3ac0a46fSAndroid Build Coastguard Worker * TIFF Library.
27*3ac0a46fSAndroid Build Coastguard Worker */
28*3ac0a46fSAndroid Build Coastguard Worker #include "tiffiop.h"
29*3ac0a46fSAndroid Build Coastguard Worker #include <string.h>
30*3ac0a46fSAndroid Build Coastguard Worker
31*3ac0a46fSAndroid Build Coastguard Worker /************************************************************************/
32*3ac0a46fSAndroid Build Coastguard Worker /* TIFFCleanup() */
33*3ac0a46fSAndroid Build Coastguard Worker /************************************************************************/
34*3ac0a46fSAndroid Build Coastguard Worker
35*3ac0a46fSAndroid Build Coastguard Worker /**
36*3ac0a46fSAndroid Build Coastguard Worker * Auxiliary function to free the TIFF structure. Given structure will be
37*3ac0a46fSAndroid Build Coastguard Worker * completely freed, so you should save opened file handle and pointer
38*3ac0a46fSAndroid Build Coastguard Worker * to the close procedure in external variables before calling
39*3ac0a46fSAndroid Build Coastguard Worker * _TIFFCleanup(), if you will need these ones to close the file.
40*3ac0a46fSAndroid Build Coastguard Worker *
41*3ac0a46fSAndroid Build Coastguard Worker * @param tif A TIFF pointer.
42*3ac0a46fSAndroid Build Coastguard Worker */
43*3ac0a46fSAndroid Build Coastguard Worker
TIFFCleanup(TIFF * tif)44*3ac0a46fSAndroid Build Coastguard Worker void TIFFCleanup(TIFF *tif)
45*3ac0a46fSAndroid Build Coastguard Worker {
46*3ac0a46fSAndroid Build Coastguard Worker /*
47*3ac0a46fSAndroid Build Coastguard Worker * Flush buffered data and directory (if dirty).
48*3ac0a46fSAndroid Build Coastguard Worker */
49*3ac0a46fSAndroid Build Coastguard Worker if (tif->tif_mode != O_RDONLY)
50*3ac0a46fSAndroid Build Coastguard Worker TIFFFlush(tif);
51*3ac0a46fSAndroid Build Coastguard Worker (*tif->tif_cleanup)(tif);
52*3ac0a46fSAndroid Build Coastguard Worker TIFFFreeDirectory(tif);
53*3ac0a46fSAndroid Build Coastguard Worker
54*3ac0a46fSAndroid Build Coastguard Worker _TIFFCleanupIFDOffsetAndNumberMaps(tif);
55*3ac0a46fSAndroid Build Coastguard Worker
56*3ac0a46fSAndroid Build Coastguard Worker /*
57*3ac0a46fSAndroid Build Coastguard Worker * Clean up client info links.
58*3ac0a46fSAndroid Build Coastguard Worker */
59*3ac0a46fSAndroid Build Coastguard Worker while (tif->tif_clientinfo)
60*3ac0a46fSAndroid Build Coastguard Worker {
61*3ac0a46fSAndroid Build Coastguard Worker TIFFClientInfoLink *psLink = tif->tif_clientinfo;
62*3ac0a46fSAndroid Build Coastguard Worker
63*3ac0a46fSAndroid Build Coastguard Worker tif->tif_clientinfo = psLink->next;
64*3ac0a46fSAndroid Build Coastguard Worker _TIFFfreeExt(tif, psLink->name);
65*3ac0a46fSAndroid Build Coastguard Worker _TIFFfreeExt(tif, psLink);
66*3ac0a46fSAndroid Build Coastguard Worker }
67*3ac0a46fSAndroid Build Coastguard Worker
68*3ac0a46fSAndroid Build Coastguard Worker if (tif->tif_rawdata && (tif->tif_flags & TIFF_MYBUFFER))
69*3ac0a46fSAndroid Build Coastguard Worker _TIFFfreeExt(tif, tif->tif_rawdata);
70*3ac0a46fSAndroid Build Coastguard Worker if (isMapped(tif))
71*3ac0a46fSAndroid Build Coastguard Worker TIFFUnmapFileContents(tif, tif->tif_base, (toff_t)tif->tif_size);
72*3ac0a46fSAndroid Build Coastguard Worker
73*3ac0a46fSAndroid Build Coastguard Worker /*
74*3ac0a46fSAndroid Build Coastguard Worker * Clean up custom fields.
75*3ac0a46fSAndroid Build Coastguard Worker */
76*3ac0a46fSAndroid Build Coastguard Worker if (tif->tif_fields && tif->tif_nfields > 0)
77*3ac0a46fSAndroid Build Coastguard Worker {
78*3ac0a46fSAndroid Build Coastguard Worker uint32_t i;
79*3ac0a46fSAndroid Build Coastguard Worker
80*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < tif->tif_nfields; i++)
81*3ac0a46fSAndroid Build Coastguard Worker {
82*3ac0a46fSAndroid Build Coastguard Worker TIFFField *fld = tif->tif_fields[i];
83*3ac0a46fSAndroid Build Coastguard Worker if (fld->field_name != NULL)
84*3ac0a46fSAndroid Build Coastguard Worker {
85*3ac0a46fSAndroid Build Coastguard Worker if (fld->field_bit == FIELD_CUSTOM &&
86*3ac0a46fSAndroid Build Coastguard Worker /* caution: tif_fields[i] must not be the beginning of a
87*3ac0a46fSAndroid Build Coastguard Worker * fields-array. Otherwise the following tags are also freed
88*3ac0a46fSAndroid Build Coastguard Worker * with the first free().
89*3ac0a46fSAndroid Build Coastguard Worker */
90*3ac0a46fSAndroid Build Coastguard Worker TIFFFieldIsAnonymous(fld))
91*3ac0a46fSAndroid Build Coastguard Worker {
92*3ac0a46fSAndroid Build Coastguard Worker _TIFFfreeExt(tif, fld->field_name);
93*3ac0a46fSAndroid Build Coastguard Worker _TIFFfreeExt(tif, fld);
94*3ac0a46fSAndroid Build Coastguard Worker }
95*3ac0a46fSAndroid Build Coastguard Worker }
96*3ac0a46fSAndroid Build Coastguard Worker }
97*3ac0a46fSAndroid Build Coastguard Worker
98*3ac0a46fSAndroid Build Coastguard Worker _TIFFfreeExt(tif, tif->tif_fields);
99*3ac0a46fSAndroid Build Coastguard Worker }
100*3ac0a46fSAndroid Build Coastguard Worker
101*3ac0a46fSAndroid Build Coastguard Worker if (tif->tif_nfieldscompat > 0)
102*3ac0a46fSAndroid Build Coastguard Worker {
103*3ac0a46fSAndroid Build Coastguard Worker uint32_t i;
104*3ac0a46fSAndroid Build Coastguard Worker
105*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < tif->tif_nfieldscompat; i++)
106*3ac0a46fSAndroid Build Coastguard Worker {
107*3ac0a46fSAndroid Build Coastguard Worker if (tif->tif_fieldscompat[i].allocated_size)
108*3ac0a46fSAndroid Build Coastguard Worker _TIFFfreeExt(tif, tif->tif_fieldscompat[i].fields);
109*3ac0a46fSAndroid Build Coastguard Worker }
110*3ac0a46fSAndroid Build Coastguard Worker _TIFFfreeExt(tif, tif->tif_fieldscompat);
111*3ac0a46fSAndroid Build Coastguard Worker }
112*3ac0a46fSAndroid Build Coastguard Worker
113*3ac0a46fSAndroid Build Coastguard Worker _TIFFfreeExt(NULL, tif);
114*3ac0a46fSAndroid Build Coastguard Worker }
115*3ac0a46fSAndroid Build Coastguard Worker
116*3ac0a46fSAndroid Build Coastguard Worker /************************************************************************/
117*3ac0a46fSAndroid Build Coastguard Worker /* _TIFFCleanupIFDOffsetAndNumberMaps() */
118*3ac0a46fSAndroid Build Coastguard Worker /************************************************************************/
119*3ac0a46fSAndroid Build Coastguard Worker
_TIFFCleanupIFDOffsetAndNumberMaps(TIFF * tif)120*3ac0a46fSAndroid Build Coastguard Worker void _TIFFCleanupIFDOffsetAndNumberMaps(TIFF *tif)
121*3ac0a46fSAndroid Build Coastguard Worker {
122*3ac0a46fSAndroid Build Coastguard Worker if (tif->tif_map_dir_offset_to_number)
123*3ac0a46fSAndroid Build Coastguard Worker {
124*3ac0a46fSAndroid Build Coastguard Worker TIFFHashSetDestroy(tif->tif_map_dir_offset_to_number);
125*3ac0a46fSAndroid Build Coastguard Worker tif->tif_map_dir_offset_to_number = NULL;
126*3ac0a46fSAndroid Build Coastguard Worker }
127*3ac0a46fSAndroid Build Coastguard Worker if (tif->tif_map_dir_number_to_offset)
128*3ac0a46fSAndroid Build Coastguard Worker {
129*3ac0a46fSAndroid Build Coastguard Worker TIFFHashSetDestroy(tif->tif_map_dir_number_to_offset);
130*3ac0a46fSAndroid Build Coastguard Worker tif->tif_map_dir_number_to_offset = NULL;
131*3ac0a46fSAndroid Build Coastguard Worker }
132*3ac0a46fSAndroid Build Coastguard Worker }
133*3ac0a46fSAndroid Build Coastguard Worker
134*3ac0a46fSAndroid Build Coastguard Worker /************************************************************************/
135*3ac0a46fSAndroid Build Coastguard Worker /* TIFFClose() */
136*3ac0a46fSAndroid Build Coastguard Worker /************************************************************************/
137*3ac0a46fSAndroid Build Coastguard Worker
138*3ac0a46fSAndroid Build Coastguard Worker /**
139*3ac0a46fSAndroid Build Coastguard Worker * Close a previously opened TIFF file.
140*3ac0a46fSAndroid Build Coastguard Worker *
141*3ac0a46fSAndroid Build Coastguard Worker * TIFFClose closes a file that was previously opened with TIFFOpen().
142*3ac0a46fSAndroid Build Coastguard Worker * Any buffered data are flushed to the file, including the contents of
143*3ac0a46fSAndroid Build Coastguard Worker * the current directory (if modified); and all resources are reclaimed.
144*3ac0a46fSAndroid Build Coastguard Worker *
145*3ac0a46fSAndroid Build Coastguard Worker * @param tif A TIFF pointer.
146*3ac0a46fSAndroid Build Coastguard Worker */
147*3ac0a46fSAndroid Build Coastguard Worker
TIFFClose(TIFF * tif)148*3ac0a46fSAndroid Build Coastguard Worker void TIFFClose(TIFF *tif)
149*3ac0a46fSAndroid Build Coastguard Worker {
150*3ac0a46fSAndroid Build Coastguard Worker if (tif != NULL)
151*3ac0a46fSAndroid Build Coastguard Worker {
152*3ac0a46fSAndroid Build Coastguard Worker TIFFCloseProc closeproc = tif->tif_closeproc;
153*3ac0a46fSAndroid Build Coastguard Worker thandle_t fd = tif->tif_clientdata;
154*3ac0a46fSAndroid Build Coastguard Worker
155*3ac0a46fSAndroid Build Coastguard Worker TIFFCleanup(tif);
156*3ac0a46fSAndroid Build Coastguard Worker (void)(*closeproc)(fd);
157*3ac0a46fSAndroid Build Coastguard Worker }
158*3ac0a46fSAndroid Build Coastguard Worker }
159