xref: /aosp_15_r20/external/pdfium/third_party/libtiff/tif_close.c (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
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