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