xref: /reactos/dll/3rdparty/libtiff/tif_dirwrite.c (revision cc439606)
1 /* $Id: tif_dirwrite.c,v 1.89 2017-08-23 13:33:42 erouault Exp $ */
2 
3 /*
4  * Copyright (c) 1988-1997 Sam Leffler
5  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
6  *
7  * Permission to use, copy, modify, distribute, and sell this software and
8  * its documentation for any purpose is hereby granted without fee, provided
9  * that (i) the above copyright notices and this permission notice appear in
10  * all copies of the software and related documentation, and (ii) the names of
11  * Sam Leffler and Silicon Graphics may not be used in any advertising or
12  * publicity relating to the software without the specific, prior written
13  * permission of Sam Leffler and Silicon Graphics.
14  *
15  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
17  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
18  *
19  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
20  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
21  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
22  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
23  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
24  * OF THIS SOFTWARE.
25  */
26 
27 /*
28  * TIFF Library.
29  *
30  * Directory Write Support Routines.
31  */
32 #include <precomp.h>
33 #include <float.h>
34 
35 #ifdef HAVE_IEEEFP
36 #define TIFFCvtNativeToIEEEFloat(tif, n, fp)
37 #define TIFFCvtNativeToIEEEDouble(tif, n, dp)
38 #else
39 extern void TIFFCvtNativeToIEEEFloat(TIFF* tif, uint32 n, float* fp);
40 extern void TIFFCvtNativeToIEEEDouble(TIFF* tif, uint32 n, double* dp);
41 #endif
42 
43 static int TIFFWriteDirectorySec(TIFF* tif, int isimage, int imagedone, uint64* pdiroff);
44 
45 static int TIFFWriteDirectoryTagSampleformatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value);
46 #if 0
47 static int TIFFWriteDirectoryTagSampleformatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
48 #endif
49 
50 static int TIFFWriteDirectoryTagAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value);
51 static int TIFFWriteDirectoryTagUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
52 #ifdef notdef
53 static int TIFFWriteDirectoryTagByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value);
54 #endif
55 static int TIFFWriteDirectoryTagByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
56 #if 0
57 static int TIFFWriteDirectoryTagBytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value);
58 #endif
59 #ifdef notdef
60 static int TIFFWriteDirectoryTagSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value);
61 #endif
62 static int TIFFWriteDirectoryTagSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value);
63 #if 0
64 static int TIFFWriteDirectoryTagSbytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value);
65 #endif
66 static int TIFFWriteDirectoryTagShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value);
67 static int TIFFWriteDirectoryTagShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value);
68 static int TIFFWriteDirectoryTagShortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value);
69 #ifdef notdef
70 static int TIFFWriteDirectoryTagSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value);
71 #endif
72 static int TIFFWriteDirectoryTagSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value);
73 #if 0
74 static int TIFFWriteDirectoryTagSshortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value);
75 #endif
76 static int TIFFWriteDirectoryTagLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
77 static int TIFFWriteDirectoryTagLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
78 #if 0
79 static int TIFFWriteDirectoryTagLongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
80 #endif
81 #ifdef notdef
82 static int TIFFWriteDirectoryTagSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value);
83 #endif
84 static int TIFFWriteDirectoryTagSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value);
85 #if 0
86 static int TIFFWriteDirectoryTagSlongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value);
87 #endif
88 #ifdef notdef
89 static int TIFFWriteDirectoryTagLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value);
90 #endif
91 static int TIFFWriteDirectoryTagLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
92 #ifdef notdef
93 static int TIFFWriteDirectoryTagSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value);
94 #endif
95 static int TIFFWriteDirectoryTagSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value);
96 static int TIFFWriteDirectoryTagRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
97 static int TIFFWriteDirectoryTagRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
98 static int TIFFWriteDirectoryTagSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
99 #ifdef notdef
100 static int TIFFWriteDirectoryTagFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value);
101 #endif
102 static int TIFFWriteDirectoryTagFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
103 #if 0
104 static int TIFFWriteDirectoryTagFloatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value);
105 #endif
106 #ifdef notdef
107 static int TIFFWriteDirectoryTagDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
108 #endif
109 static int TIFFWriteDirectoryTagDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value);
110 #if 0
111 static int TIFFWriteDirectoryTagDoublePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
112 #endif
113 static int TIFFWriteDirectoryTagIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
114 #ifdef notdef
115 static int TIFFWriteDirectoryTagIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
116 #endif
117 static int TIFFWriteDirectoryTagShortLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
118 static int TIFFWriteDirectoryTagLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
119 static int TIFFWriteDirectoryTagIfdIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
120 #ifdef notdef
121 static int TIFFWriteDirectoryTagShortLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
122 #endif
123 static int TIFFWriteDirectoryTagColormap(TIFF* tif, uint32* ndir, TIFFDirEntry* dir);
124 static int TIFFWriteDirectoryTagTransferfunction(TIFF* tif, uint32* ndir, TIFFDirEntry* dir);
125 static int TIFFWriteDirectoryTagSubifd(TIFF* tif, uint32* ndir, TIFFDirEntry* dir);
126 
127 static int TIFFWriteDirectoryTagCheckedAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value);
128 static int TIFFWriteDirectoryTagCheckedUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
129 #ifdef notdef
130 static int TIFFWriteDirectoryTagCheckedByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value);
131 #endif
132 static int TIFFWriteDirectoryTagCheckedByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
133 #ifdef notdef
134 static int TIFFWriteDirectoryTagCheckedSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value);
135 #endif
136 static int TIFFWriteDirectoryTagCheckedSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value);
137 static int TIFFWriteDirectoryTagCheckedShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value);
138 static int TIFFWriteDirectoryTagCheckedShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value);
139 #ifdef notdef
140 static int TIFFWriteDirectoryTagCheckedSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value);
141 #endif
142 static int TIFFWriteDirectoryTagCheckedSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value);
143 static int TIFFWriteDirectoryTagCheckedLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
144 static int TIFFWriteDirectoryTagCheckedLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
145 #ifdef notdef
146 static int TIFFWriteDirectoryTagCheckedSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value);
147 #endif
148 static int TIFFWriteDirectoryTagCheckedSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value);
149 #ifdef notdef
150 static int TIFFWriteDirectoryTagCheckedLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value);
151 #endif
152 static int TIFFWriteDirectoryTagCheckedLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
153 #ifdef notdef
154 static int TIFFWriteDirectoryTagCheckedSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value);
155 #endif
156 static int TIFFWriteDirectoryTagCheckedSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value);
157 static int TIFFWriteDirectoryTagCheckedRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
158 static int TIFFWriteDirectoryTagCheckedRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
159 static int TIFFWriteDirectoryTagCheckedSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
160 #ifdef notdef
161 static int TIFFWriteDirectoryTagCheckedFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value);
162 #endif
163 static int TIFFWriteDirectoryTagCheckedFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
164 #ifdef notdef
165 static int TIFFWriteDirectoryTagCheckedDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
166 #endif
167 static int TIFFWriteDirectoryTagCheckedDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value);
168 static int TIFFWriteDirectoryTagCheckedIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
169 static int TIFFWriteDirectoryTagCheckedIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
170 
171 static int TIFFWriteDirectoryTagData(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 datatype, uint32 count, uint32 datalength, void* data);
172 
173 static int TIFFLinkDirectory(TIFF*);
174 
175 /*
176  * Write the contents of the current directory
177  * to the specified file.  This routine doesn't
178  * handle overwriting a directory with auxiliary
179  * storage that's been changed.
180  */
181 int
182 TIFFWriteDirectory(TIFF* tif)
183 {
184 	return TIFFWriteDirectorySec(tif,TRUE,TRUE,NULL);
185 }
186 
187 /*
188  * Similar to TIFFWriteDirectory(), writes the directory out
189  * but leaves all data structures in memory so that it can be
190  * written again.  This will make a partially written TIFF file
191  * readable before it is successfully completed/closed.
192  */
193 int
194 TIFFCheckpointDirectory(TIFF* tif)
195 {
196 	int rc;
197 	/* Setup the strips arrays, if they haven't already been. */
198 	if (tif->tif_dir.td_stripoffset == NULL)
199 	    (void) TIFFSetupStrips(tif);
200 	rc = TIFFWriteDirectorySec(tif,TRUE,FALSE,NULL);
201 	(void) TIFFSetWriteOffset(tif, TIFFSeekFile(tif, 0, SEEK_END));
202 	return rc;
203 }
204 
205 int
206 TIFFWriteCustomDirectory(TIFF* tif, uint64* pdiroff)
207 {
208 	return TIFFWriteDirectorySec(tif,FALSE,FALSE,pdiroff);
209 }
210 
211 /*
212  * Similar to TIFFWriteDirectory(), but if the directory has already
213  * been written once, it is relocated to the end of the file, in case it
214  * has changed in size.  Note that this will result in the loss of the
215  * previously used directory space.
216  */
217 int
218 TIFFRewriteDirectory( TIFF *tif )
219 {
220 	static const char module[] = "TIFFRewriteDirectory";
221 
222 	/* We don't need to do anything special if it hasn't been written. */
223 	if( tif->tif_diroff == 0 )
224 		return TIFFWriteDirectory( tif );
225 
226 	/*
227 	 * Find and zero the pointer to this directory, so that TIFFLinkDirectory
228 	 * will cause it to be added after this directories current pre-link.
229 	 */
230 
231 	if (!(tif->tif_flags&TIFF_BIGTIFF))
232 	{
233 		if (tif->tif_header.classic.tiff_diroff == tif->tif_diroff)
234 		{
235 			tif->tif_header.classic.tiff_diroff = 0;
236 			tif->tif_diroff = 0;
237 
238 			TIFFSeekFile(tif,4,SEEK_SET);
239 			if (!WriteOK(tif, &(tif->tif_header.classic.tiff_diroff),4))
240 			{
241 				TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
242 				    "Error updating TIFF header");
243 				return (0);
244 			}
245 		}
246 		else
247 		{
248 			uint32 nextdir;
249 			nextdir = tif->tif_header.classic.tiff_diroff;
250 			while(1) {
251 				uint16 dircount;
252 				uint32 nextnextdir;
253 
254 				if (!SeekOK(tif, nextdir) ||
255 				    !ReadOK(tif, &dircount, 2)) {
256 					TIFFErrorExt(tif->tif_clientdata, module,
257 					     "Error fetching directory count");
258 					return (0);
259 				}
260 				if (tif->tif_flags & TIFF_SWAB)
261 					TIFFSwabShort(&dircount);
262 				(void) TIFFSeekFile(tif,
263 				    nextdir+2+dircount*12, SEEK_SET);
264 				if (!ReadOK(tif, &nextnextdir, 4)) {
265 					TIFFErrorExt(tif->tif_clientdata, module,
266 					     "Error fetching directory link");
267 					return (0);
268 				}
269 				if (tif->tif_flags & TIFF_SWAB)
270 					TIFFSwabLong(&nextnextdir);
271 				if (nextnextdir==tif->tif_diroff)
272 				{
273 					uint32 m;
274 					m=0;
275 					(void) TIFFSeekFile(tif,
276 					    nextdir+2+dircount*12, SEEK_SET);
277 					if (!WriteOK(tif, &m, 4)) {
278 						TIFFErrorExt(tif->tif_clientdata, module,
279 						     "Error writing directory link");
280 						return (0);
281 					}
282 					tif->tif_diroff=0;
283 					break;
284 				}
285 				nextdir=nextnextdir;
286 			}
287 		}
288 	}
289 	else
290 	{
291 		if (tif->tif_header.big.tiff_diroff == tif->tif_diroff)
292 		{
293 			tif->tif_header.big.tiff_diroff = 0;
294 			tif->tif_diroff = 0;
295 
296 			TIFFSeekFile(tif,8,SEEK_SET);
297 			if (!WriteOK(tif, &(tif->tif_header.big.tiff_diroff),8))
298 			{
299 				TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
300 				    "Error updating TIFF header");
301 				return (0);
302 			}
303 		}
304 		else
305 		{
306 			uint64 nextdir;
307 			nextdir = tif->tif_header.big.tiff_diroff;
308 			while(1) {
309 				uint64 dircount64;
310 				uint16 dircount;
311 				uint64 nextnextdir;
312 
313 				if (!SeekOK(tif, nextdir) ||
314 				    !ReadOK(tif, &dircount64, 8)) {
315 					TIFFErrorExt(tif->tif_clientdata, module,
316 					     "Error fetching directory count");
317 					return (0);
318 				}
319 				if (tif->tif_flags & TIFF_SWAB)
320 					TIFFSwabLong8(&dircount64);
321 				if (dircount64>0xFFFF)
322 				{
323 					TIFFErrorExt(tif->tif_clientdata, module,
324 					     "Sanity check on tag count failed, likely corrupt TIFF");
325 					return (0);
326 				}
327 				dircount=(uint16)dircount64;
328 				(void) TIFFSeekFile(tif,
329 				    nextdir+8+dircount*20, SEEK_SET);
330 				if (!ReadOK(tif, &nextnextdir, 8)) {
331 					TIFFErrorExt(tif->tif_clientdata, module,
332 					     "Error fetching directory link");
333 					return (0);
334 				}
335 				if (tif->tif_flags & TIFF_SWAB)
336 					TIFFSwabLong8(&nextnextdir);
337 				if (nextnextdir==tif->tif_diroff)
338 				{
339 					uint64 m;
340 					m=0;
341 					(void) TIFFSeekFile(tif,
342 					    nextdir+8+dircount*20, SEEK_SET);
343 					if (!WriteOK(tif, &m, 8)) {
344 						TIFFErrorExt(tif->tif_clientdata, module,
345 						     "Error writing directory link");
346 						return (0);
347 					}
348 					tif->tif_diroff=0;
349 					break;
350 				}
351 				nextdir=nextnextdir;
352 			}
353 		}
354 	}
355 
356 	/*
357 	 * Now use TIFFWriteDirectory() normally.
358 	 */
359 
360 	return TIFFWriteDirectory( tif );
361 }
362 
363 static int
364 TIFFWriteDirectorySec(TIFF* tif, int isimage, int imagedone, uint64* pdiroff)
365 {
366 	static const char module[] = "TIFFWriteDirectorySec";
367 	uint32 ndir;
368 	TIFFDirEntry* dir;
369 	uint32 dirsize;
370 	void* dirmem;
371 	uint32 m;
372 	if (tif->tif_mode == O_RDONLY)
373 		return (1);
374 
375         _TIFFFillStriles( tif );
376 
377 	/*
378 	 * Clear write state so that subsequent images with
379 	 * different characteristics get the right buffers
380 	 * setup for them.
381 	 */
382 	if (imagedone)
383 	{
384 		if (tif->tif_flags & TIFF_POSTENCODE)
385 		{
386 			tif->tif_flags &= ~TIFF_POSTENCODE;
387 			if (!(*tif->tif_postencode)(tif))
388 			{
389 				TIFFErrorExt(tif->tif_clientdata,module,
390 				    "Error post-encoding before directory write");
391 				return (0);
392 			}
393 		}
394 		(*tif->tif_close)(tif);       /* shutdown encoder */
395 		/*
396 		 * Flush any data that might have been written
397 		 * by the compression close+cleanup routines.  But
398                  * be careful not to write stuff if we didn't add data
399                  * in the previous steps as the "rawcc" data may well be
400                  * a previously read tile/strip in mixed read/write mode.
401 		 */
402 		if (tif->tif_rawcc > 0
403 		    && (tif->tif_flags & TIFF_BEENWRITING) != 0 )
404 		{
405 		    if( !TIFFFlushData1(tif) )
406                     {
407 			TIFFErrorExt(tif->tif_clientdata, module,
408 			    "Error flushing data before directory write");
409 			return (0);
410                     }
411 		}
412 		if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata)
413 		{
414 			_TIFFfree(tif->tif_rawdata);
415 			tif->tif_rawdata = NULL;
416 			tif->tif_rawcc = 0;
417 			tif->tif_rawdatasize = 0;
418                         tif->tif_rawdataoff = 0;
419                         tif->tif_rawdataloaded = 0;
420 		}
421 		tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP);
422 	}
423 	dir=NULL;
424 	dirmem=NULL;
425 	dirsize=0;
426 	while (1)
427 	{
428 		ndir=0;
429 		if (isimage)
430 		{
431 			if (TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS))
432 			{
433 				if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_IMAGEWIDTH,tif->tif_dir.td_imagewidth))
434 					goto bad;
435 				if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_IMAGELENGTH,tif->tif_dir.td_imagelength))
436 					goto bad;
437 			}
438 			if (TIFFFieldSet(tif,FIELD_TILEDIMENSIONS))
439 			{
440 				if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_TILEWIDTH,tif->tif_dir.td_tilewidth))
441 					goto bad;
442 				if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_TILELENGTH,tif->tif_dir.td_tilelength))
443 					goto bad;
444 			}
445 			if (TIFFFieldSet(tif,FIELD_RESOLUTION))
446 			{
447 				if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_XRESOLUTION,tif->tif_dir.td_xresolution))
448 					goto bad;
449 				if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_YRESOLUTION,tif->tif_dir.td_yresolution))
450 					goto bad;
451 			}
452 			if (TIFFFieldSet(tif,FIELD_POSITION))
453 			{
454 				if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_XPOSITION,tif->tif_dir.td_xposition))
455 					goto bad;
456 				if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_YPOSITION,tif->tif_dir.td_yposition))
457 					goto bad;
458 			}
459 			if (TIFFFieldSet(tif,FIELD_SUBFILETYPE))
460 			{
461 				if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,TIFFTAG_SUBFILETYPE,tif->tif_dir.td_subfiletype))
462 					goto bad;
463 			}
464 			if (TIFFFieldSet(tif,FIELD_BITSPERSAMPLE))
465 			{
466 				if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_BITSPERSAMPLE,tif->tif_dir.td_bitspersample))
467 					goto bad;
468 			}
469 			if (TIFFFieldSet(tif,FIELD_COMPRESSION))
470 			{
471 				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_COMPRESSION,tif->tif_dir.td_compression))
472 					goto bad;
473 			}
474 			if (TIFFFieldSet(tif,FIELD_PHOTOMETRIC))
475 			{
476 				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_PHOTOMETRIC,tif->tif_dir.td_photometric))
477 					goto bad;
478 			}
479 			if (TIFFFieldSet(tif,FIELD_THRESHHOLDING))
480 			{
481 				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_THRESHHOLDING,tif->tif_dir.td_threshholding))
482 					goto bad;
483 			}
484 			if (TIFFFieldSet(tif,FIELD_FILLORDER))
485 			{
486 				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_FILLORDER,tif->tif_dir.td_fillorder))
487 					goto bad;
488 			}
489 			if (TIFFFieldSet(tif,FIELD_ORIENTATION))
490 			{
491 				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_ORIENTATION,tif->tif_dir.td_orientation))
492 					goto bad;
493 			}
494 			if (TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL))
495 			{
496 				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_SAMPLESPERPIXEL,tif->tif_dir.td_samplesperpixel))
497 					goto bad;
498 			}
499 			if (TIFFFieldSet(tif,FIELD_ROWSPERSTRIP))
500 			{
501 				if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_ROWSPERSTRIP,tif->tif_dir.td_rowsperstrip))
502 					goto bad;
503 			}
504 			if (TIFFFieldSet(tif,FIELD_MINSAMPLEVALUE))
505 			{
506 				if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_MINSAMPLEVALUE,tif->tif_dir.td_minsamplevalue))
507 					goto bad;
508 			}
509 			if (TIFFFieldSet(tif,FIELD_MAXSAMPLEVALUE))
510 			{
511 				if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_MAXSAMPLEVALUE,tif->tif_dir.td_maxsamplevalue))
512 					goto bad;
513 			}
514 			if (TIFFFieldSet(tif,FIELD_PLANARCONFIG))
515 			{
516 				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_PLANARCONFIG,tif->tif_dir.td_planarconfig))
517 					goto bad;
518 			}
519 			if (TIFFFieldSet(tif,FIELD_RESOLUTIONUNIT))
520 			{
521 				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_RESOLUTIONUNIT,tif->tif_dir.td_resolutionunit))
522 					goto bad;
523 			}
524 			if (TIFFFieldSet(tif,FIELD_PAGENUMBER))
525 			{
526 				if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_PAGENUMBER,2,&tif->tif_dir.td_pagenumber[0]))
527 					goto bad;
528 			}
529 			if (TIFFFieldSet(tif,FIELD_STRIPBYTECOUNTS))
530 			{
531 				if (!isTiled(tif))
532 				{
533 					if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_STRIPBYTECOUNTS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripbytecount))
534 						goto bad;
535 				}
536 				else
537 				{
538 					if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_TILEBYTECOUNTS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripbytecount))
539 						goto bad;
540 				}
541 			}
542 			if (TIFFFieldSet(tif,FIELD_STRIPOFFSETS))
543 			{
544 				if (!isTiled(tif))
545 				{
546                     /* td_stripoffset might be NULL in an odd OJPEG case. See
547                      *  tif_dirread.c around line 3634.
548                      * XXX: OJPEG hack.
549                      * If a) compression is OJPEG, b) it's not a tiled TIFF,
550                      * and c) the number of strips is 1,
551                      * then we tolerate the absence of stripoffsets tag,
552                      * because, presumably, all required data is in the
553                      * JpegInterchangeFormat stream.
554                      * We can get here when using tiffset on such a file.
555                      * See http://bugzilla.maptools.org/show_bug.cgi?id=2500
556                     */
557                     if (tif->tif_dir.td_stripoffset != NULL &&
558                         !TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_STRIPOFFSETS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripoffset))
559                         goto bad;
560 				}
561 				else
562 				{
563 					if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_TILEOFFSETS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripoffset))
564 						goto bad;
565 				}
566 			}
567 			if (TIFFFieldSet(tif,FIELD_COLORMAP))
568 			{
569 				if (!TIFFWriteDirectoryTagColormap(tif,&ndir,dir))
570 					goto bad;
571 			}
572 			if (TIFFFieldSet(tif,FIELD_EXTRASAMPLES))
573 			{
574 				if (tif->tif_dir.td_extrasamples)
575 				{
576 					uint16 na;
577 					uint16* nb;
578 					TIFFGetFieldDefaulted(tif,TIFFTAG_EXTRASAMPLES,&na,&nb);
579 					if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_EXTRASAMPLES,na,nb))
580 						goto bad;
581 				}
582 			}
583 			if (TIFFFieldSet(tif,FIELD_SAMPLEFORMAT))
584 			{
585 				if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_SAMPLEFORMAT,tif->tif_dir.td_sampleformat))
586 					goto bad;
587 			}
588 			if (TIFFFieldSet(tif,FIELD_SMINSAMPLEVALUE))
589 			{
590 				if (!TIFFWriteDirectoryTagSampleformatArray(tif,&ndir,dir,TIFFTAG_SMINSAMPLEVALUE,tif->tif_dir.td_samplesperpixel,tif->tif_dir.td_sminsamplevalue))
591 					goto bad;
592 			}
593 			if (TIFFFieldSet(tif,FIELD_SMAXSAMPLEVALUE))
594 			{
595 				if (!TIFFWriteDirectoryTagSampleformatArray(tif,&ndir,dir,TIFFTAG_SMAXSAMPLEVALUE,tif->tif_dir.td_samplesperpixel,tif->tif_dir.td_smaxsamplevalue))
596 					goto bad;
597 			}
598 			if (TIFFFieldSet(tif,FIELD_IMAGEDEPTH))
599 			{
600 				if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,TIFFTAG_IMAGEDEPTH,tif->tif_dir.td_imagedepth))
601 					goto bad;
602 			}
603 			if (TIFFFieldSet(tif,FIELD_TILEDEPTH))
604 			{
605 				if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,TIFFTAG_TILEDEPTH,tif->tif_dir.td_tiledepth))
606 					goto bad;
607 			}
608 			if (TIFFFieldSet(tif,FIELD_HALFTONEHINTS))
609 			{
610 				if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_HALFTONEHINTS,2,&tif->tif_dir.td_halftonehints[0]))
611 					goto bad;
612 			}
613 			if (TIFFFieldSet(tif,FIELD_YCBCRSUBSAMPLING))
614 			{
615 				if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_YCBCRSUBSAMPLING,2,&tif->tif_dir.td_ycbcrsubsampling[0]))
616 					goto bad;
617 			}
618 			if (TIFFFieldSet(tif,FIELD_YCBCRPOSITIONING))
619 			{
620 				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_YCBCRPOSITIONING,tif->tif_dir.td_ycbcrpositioning))
621 					goto bad;
622 			}
623 			if (TIFFFieldSet(tif,FIELD_REFBLACKWHITE))
624 			{
625 				if (!TIFFWriteDirectoryTagRationalArray(tif,&ndir,dir,TIFFTAG_REFERENCEBLACKWHITE,6,tif->tif_dir.td_refblackwhite))
626 					goto bad;
627 			}
628 			if (TIFFFieldSet(tif,FIELD_TRANSFERFUNCTION))
629 			{
630 				if (!TIFFWriteDirectoryTagTransferfunction(tif,&ndir,dir))
631 					goto bad;
632 			}
633 			if (TIFFFieldSet(tif,FIELD_INKNAMES))
634 			{
635 				if (!TIFFWriteDirectoryTagAscii(tif,&ndir,dir,TIFFTAG_INKNAMES,tif->tif_dir.td_inknameslen,tif->tif_dir.td_inknames))
636 					goto bad;
637 			}
638 			if (TIFFFieldSet(tif,FIELD_SUBIFD))
639 			{
640 				if (!TIFFWriteDirectoryTagSubifd(tif,&ndir,dir))
641 					goto bad;
642 			}
643 			{
644 				uint32 n;
645 				for (n=0; n<tif->tif_nfields; n++) {
646 					const TIFFField* o;
647 					o = tif->tif_fields[n];
648 					if ((o->field_bit>=FIELD_CODEC)&&(TIFFFieldSet(tif,o->field_bit)))
649 					{
650 						switch (o->get_field_type)
651 						{
652 							case TIFF_SETGET_ASCII:
653 								{
654 									uint32 pa;
655 									char* pb;
656 									assert(o->field_type==TIFF_ASCII);
657 									assert(o->field_readcount==TIFF_VARIABLE);
658 									assert(o->field_passcount==0);
659 									TIFFGetField(tif,o->field_tag,&pb);
660 									pa=(uint32)(strlen(pb));
661 									if (!TIFFWriteDirectoryTagAscii(tif,&ndir,dir,(uint16)o->field_tag,pa,pb))
662 										goto bad;
663 								}
664 								break;
665 							case TIFF_SETGET_UINT16:
666 								{
667 									uint16 p;
668 									assert(o->field_type==TIFF_SHORT);
669 									assert(o->field_readcount==1);
670 									assert(o->field_passcount==0);
671 									TIFFGetField(tif,o->field_tag,&p);
672 									if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,(uint16)o->field_tag,p))
673 										goto bad;
674 								}
675 								break;
676 							case TIFF_SETGET_UINT32:
677 								{
678 									uint32 p;
679 									assert(o->field_type==TIFF_LONG);
680 									assert(o->field_readcount==1);
681 									assert(o->field_passcount==0);
682 									TIFFGetField(tif,o->field_tag,&p);
683 									if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,(uint16)o->field_tag,p))
684 										goto bad;
685 								}
686 								break;
687 							case TIFF_SETGET_C32_UINT8:
688 								{
689 									uint32 pa;
690 									void* pb;
691 									assert(o->field_type==TIFF_UNDEFINED);
692 									assert(o->field_readcount==TIFF_VARIABLE2);
693 									assert(o->field_passcount==1);
694 									TIFFGetField(tif,o->field_tag,&pa,&pb);
695 									if (!TIFFWriteDirectoryTagUndefinedArray(tif,&ndir,dir,(uint16)o->field_tag,pa,pb))
696 										goto bad;
697 								}
698 								break;
699 							default:
700 								assert(0);   /* we should never get here */
701 								break;
702 						}
703 					}
704 				}
705 			}
706 		}
707 		for (m=0; m<(uint32)(tif->tif_dir.td_customValueCount); m++)
708 		{
709                         uint16 tag = (uint16)tif->tif_dir.td_customValues[m].info->field_tag;
710                         uint32 count = tif->tif_dir.td_customValues[m].count;
711 			switch (tif->tif_dir.td_customValues[m].info->field_type)
712 			{
713 				case TIFF_ASCII:
714 					if (!TIFFWriteDirectoryTagAscii(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
715 						goto bad;
716 					break;
717 				case TIFF_UNDEFINED:
718 					if (!TIFFWriteDirectoryTagUndefinedArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
719 						goto bad;
720 					break;
721 				case TIFF_BYTE:
722 					if (!TIFFWriteDirectoryTagByteArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
723 						goto bad;
724 					break;
725 				case TIFF_SBYTE:
726 					if (!TIFFWriteDirectoryTagSbyteArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
727 						goto bad;
728 					break;
729 				case TIFF_SHORT:
730 					if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
731 						goto bad;
732 					break;
733 				case TIFF_SSHORT:
734 					if (!TIFFWriteDirectoryTagSshortArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
735 						goto bad;
736 					break;
737 				case TIFF_LONG:
738 					if (!TIFFWriteDirectoryTagLongArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
739 						goto bad;
740 					break;
741 				case TIFF_SLONG:
742 					if (!TIFFWriteDirectoryTagSlongArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
743 						goto bad;
744 					break;
745 				case TIFF_LONG8:
746 					if (!TIFFWriteDirectoryTagLong8Array(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
747 						goto bad;
748 					break;
749 				case TIFF_SLONG8:
750 					if (!TIFFWriteDirectoryTagSlong8Array(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
751 						goto bad;
752 					break;
753 				case TIFF_RATIONAL:
754 					if (!TIFFWriteDirectoryTagRationalArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
755 						goto bad;
756 					break;
757 				case TIFF_SRATIONAL:
758 					if (!TIFFWriteDirectoryTagSrationalArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
759 						goto bad;
760 					break;
761 				case TIFF_FLOAT:
762 					if (!TIFFWriteDirectoryTagFloatArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
763 						goto bad;
764 					break;
765 				case TIFF_DOUBLE:
766 					if (!TIFFWriteDirectoryTagDoubleArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
767 						goto bad;
768 					break;
769 				case TIFF_IFD:
770 					if (!TIFFWriteDirectoryTagIfdArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
771 						goto bad;
772 					break;
773 				case TIFF_IFD8:
774 					if (!TIFFWriteDirectoryTagIfdIfd8Array(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
775 						goto bad;
776 					break;
777 				default:
778 					assert(0);   /* we should never get here */
779 					break;
780 			}
781 		}
782 		if (dir!=NULL)
783 			break;
784 		dir=_TIFFmalloc(ndir*sizeof(TIFFDirEntry));
785 		if (dir==NULL)
786 		{
787 			TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
788 			goto bad;
789 		}
790 		if (isimage)
791 		{
792 			if ((tif->tif_diroff==0)&&(!TIFFLinkDirectory(tif)))
793 				goto bad;
794 		}
795 		else
796 			tif->tif_diroff=(TIFFSeekFile(tif,0,SEEK_END)+1)&(~((toff_t)1));
797 		if (pdiroff!=NULL)
798 			*pdiroff=tif->tif_diroff;
799 		if (!(tif->tif_flags&TIFF_BIGTIFF))
800 			dirsize=2+ndir*12+4;
801 		else
802 			dirsize=8+ndir*20+8;
803 		tif->tif_dataoff=tif->tif_diroff+dirsize;
804 		if (!(tif->tif_flags&TIFF_BIGTIFF))
805 			tif->tif_dataoff=(uint32)tif->tif_dataoff;
806 		if ((tif->tif_dataoff<tif->tif_diroff)||(tif->tif_dataoff<(uint64)dirsize))
807 		{
808 			TIFFErrorExt(tif->tif_clientdata,module,"Maximum TIFF file size exceeded");
809 			goto bad;
810 		}
811 		if (tif->tif_dataoff&1)
812 			tif->tif_dataoff++;
813 		if (isimage)
814 			tif->tif_curdir++;
815 	}
816 	if (isimage)
817 	{
818 		if (TIFFFieldSet(tif,FIELD_SUBIFD)&&(tif->tif_subifdoff==0))
819 		{
820 			uint32 na;
821 			TIFFDirEntry* nb;
822 			for (na=0, nb=dir; ; na++, nb++)
823 			{
824 				if( na == ndir )
825                                 {
826                                     TIFFErrorExt(tif->tif_clientdata,module,
827                                                  "Cannot find SubIFD tag");
828                                     goto bad;
829                                 }
830 				if (nb->tdir_tag==TIFFTAG_SUBIFD)
831 					break;
832 			}
833 			if (!(tif->tif_flags&TIFF_BIGTIFF))
834 				tif->tif_subifdoff=tif->tif_diroff+2+na*12+8;
835 			else
836 				tif->tif_subifdoff=tif->tif_diroff+8+na*20+12;
837 		}
838 	}
839 	dirmem=_TIFFmalloc(dirsize);
840 	if (dirmem==NULL)
841 	{
842 		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
843 		goto bad;
844 	}
845 	if (!(tif->tif_flags&TIFF_BIGTIFF))
846 	{
847 		uint8* n;
848 		uint32 nTmp;
849 		TIFFDirEntry* o;
850 		n=dirmem;
851 		*(uint16*)n=(uint16)ndir;
852 		if (tif->tif_flags&TIFF_SWAB)
853 			TIFFSwabShort((uint16*)n);
854 		n+=2;
855 		o=dir;
856 		for (m=0; m<ndir; m++)
857 		{
858 			*(uint16*)n=o->tdir_tag;
859 			if (tif->tif_flags&TIFF_SWAB)
860 				TIFFSwabShort((uint16*)n);
861 			n+=2;
862 			*(uint16*)n=o->tdir_type;
863 			if (tif->tif_flags&TIFF_SWAB)
864 				TIFFSwabShort((uint16*)n);
865 			n+=2;
866 			nTmp = (uint32)o->tdir_count;
867 			_TIFFmemcpy(n,&nTmp,4);
868 			if (tif->tif_flags&TIFF_SWAB)
869 				TIFFSwabLong((uint32*)n);
870 			n+=4;
871 			/* This is correct. The data has been */
872 			/* swabbed previously in TIFFWriteDirectoryTagData */
873 			_TIFFmemcpy(n,&o->tdir_offset,4);
874 			n+=4;
875 			o++;
876 		}
877 		nTmp = (uint32)tif->tif_nextdiroff;
878 		if (tif->tif_flags&TIFF_SWAB)
879 			TIFFSwabLong(&nTmp);
880 		_TIFFmemcpy(n,&nTmp,4);
881 	}
882 	else
883 	{
884 		uint8* n;
885 		TIFFDirEntry* o;
886 		n=dirmem;
887 		*(uint64*)n=ndir;
888 		if (tif->tif_flags&TIFF_SWAB)
889 			TIFFSwabLong8((uint64*)n);
890 		n+=8;
891 		o=dir;
892 		for (m=0; m<ndir; m++)
893 		{
894 			*(uint16*)n=o->tdir_tag;
895 			if (tif->tif_flags&TIFF_SWAB)
896 				TIFFSwabShort((uint16*)n);
897 			n+=2;
898 			*(uint16*)n=o->tdir_type;
899 			if (tif->tif_flags&TIFF_SWAB)
900 				TIFFSwabShort((uint16*)n);
901 			n+=2;
902 			_TIFFmemcpy(n,&o->tdir_count,8);
903 			if (tif->tif_flags&TIFF_SWAB)
904 				TIFFSwabLong8((uint64*)n);
905 			n+=8;
906 			_TIFFmemcpy(n,&o->tdir_offset,8);
907 			n+=8;
908 			o++;
909 		}
910 		_TIFFmemcpy(n,&tif->tif_nextdiroff,8);
911 		if (tif->tif_flags&TIFF_SWAB)
912 			TIFFSwabLong8((uint64*)n);
913 	}
914 	_TIFFfree(dir);
915 	dir=NULL;
916 	if (!SeekOK(tif,tif->tif_diroff))
917 	{
918 		TIFFErrorExt(tif->tif_clientdata,module,"IO error writing directory");
919 		goto bad;
920 	}
921 	if (!WriteOK(tif,dirmem,(tmsize_t)dirsize))
922 	{
923 		TIFFErrorExt(tif->tif_clientdata,module,"IO error writing directory");
924 		goto bad;
925 	}
926 	_TIFFfree(dirmem);
927 	if (imagedone)
928 	{
929 		TIFFFreeDirectory(tif);
930 		tif->tif_flags &= ~TIFF_DIRTYDIRECT;
931 		tif->tif_flags &= ~TIFF_DIRTYSTRIP;
932 		(*tif->tif_cleanup)(tif);
933 		/*
934 		* Reset directory-related state for subsequent
935 		* directories.
936 		*/
937 		TIFFCreateDirectory(tif);
938 	}
939 	return(1);
940 bad:
941 	if (dir!=NULL)
942 		_TIFFfree(dir);
943 	if (dirmem!=NULL)
944 		_TIFFfree(dirmem);
945 	return(0);
946 }
947 
948 static float TIFFClampDoubleToFloat( double val )
949 {
950     if( val > FLT_MAX )
951         return FLT_MAX;
952     if( val < -FLT_MAX )
953         return -FLT_MAX;
954     return (float)val;
955 }
956 
957 static int8 TIFFClampDoubleToInt8( double val )
958 {
959     if( val > 127 )
960         return 127;
961     if( val < -128 || val != val )
962         return -128;
963     return (int8)val;
964 }
965 
966 static int16 TIFFClampDoubleToInt16( double val )
967 {
968     if( val > 32767 )
969         return 32767;
970     if( val < -32768 || val != val )
971         return -32768;
972     return (int16)val;
973 }
974 
975 static int32 TIFFClampDoubleToInt32( double val )
976 {
977     if( val > 0x7FFFFFFF )
978         return 0x7FFFFFFF;
979     if( val < -0x7FFFFFFF-1 || val != val )
980         return -0x7FFFFFFF-1;
981     return (int32)val;
982 }
983 
984 static uint8 TIFFClampDoubleToUInt8( double val )
985 {
986     if( val < 0 )
987         return 0;
988     if( val > 255 || val != val )
989         return 255;
990     return (uint8)val;
991 }
992 
993 static uint16 TIFFClampDoubleToUInt16( double val )
994 {
995     if( val < 0 )
996         return 0;
997     if( val > 65535 || val != val )
998         return 65535;
999     return (uint16)val;
1000 }
1001 
1002 static uint32 TIFFClampDoubleToUInt32( double val )
1003 {
1004     if( val < 0 )
1005         return 0;
1006     if( val > 0xFFFFFFFFU || val != val )
1007         return 0xFFFFFFFFU;
1008     return (uint32)val;
1009 }
1010 
1011 static int
1012 TIFFWriteDirectoryTagSampleformatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value)
1013 {
1014 	static const char module[] = "TIFFWriteDirectoryTagSampleformatArray";
1015 	void* conv;
1016 	uint32 i;
1017 	int ok;
1018 	conv = _TIFFmalloc(count*sizeof(double));
1019 	if (conv == NULL)
1020 	{
1021 		TIFFErrorExt(tif->tif_clientdata, module, "Out of memory");
1022 		return (0);
1023 	}
1024 
1025 	switch (tif->tif_dir.td_sampleformat)
1026 	{
1027 		case SAMPLEFORMAT_IEEEFP:
1028 			if (tif->tif_dir.td_bitspersample<=32)
1029 			{
1030 				for (i = 0; i < count; ++i)
1031 					((float*)conv)[i] = TIFFClampDoubleToFloat(value[i]);
1032 				ok = TIFFWriteDirectoryTagFloatArray(tif,ndir,dir,tag,count,(float*)conv);
1033 			}
1034 			else
1035 			{
1036 				ok = TIFFWriteDirectoryTagDoubleArray(tif,ndir,dir,tag,count,value);
1037 			}
1038 			break;
1039 		case SAMPLEFORMAT_INT:
1040 			if (tif->tif_dir.td_bitspersample<=8)
1041 			{
1042 				for (i = 0; i < count; ++i)
1043 					((int8*)conv)[i] = TIFFClampDoubleToInt8(value[i]);
1044 				ok = TIFFWriteDirectoryTagSbyteArray(tif,ndir,dir,tag,count,(int8*)conv);
1045 			}
1046 			else if (tif->tif_dir.td_bitspersample<=16)
1047 			{
1048 				for (i = 0; i < count; ++i)
1049 					((int16*)conv)[i] = TIFFClampDoubleToInt16(value[i]);
1050 				ok = TIFFWriteDirectoryTagSshortArray(tif,ndir,dir,tag,count,(int16*)conv);
1051 			}
1052 			else
1053 			{
1054 				for (i = 0; i < count; ++i)
1055 					((int32*)conv)[i] = TIFFClampDoubleToInt32(value[i]);
1056 				ok = TIFFWriteDirectoryTagSlongArray(tif,ndir,dir,tag,count,(int32*)conv);
1057 			}
1058 			break;
1059 		case SAMPLEFORMAT_UINT:
1060 			if (tif->tif_dir.td_bitspersample<=8)
1061 			{
1062 				for (i = 0; i < count; ++i)
1063 					((uint8*)conv)[i] = TIFFClampDoubleToUInt8(value[i]);
1064 				ok = TIFFWriteDirectoryTagByteArray(tif,ndir,dir,tag,count,(uint8*)conv);
1065 			}
1066 			else if (tif->tif_dir.td_bitspersample<=16)
1067 			{
1068 				for (i = 0; i < count; ++i)
1069 					((uint16*)conv)[i] = TIFFClampDoubleToUInt16(value[i]);
1070 				ok = TIFFWriteDirectoryTagShortArray(tif,ndir,dir,tag,count,(uint16*)conv);
1071 			}
1072 			else
1073 			{
1074 				for (i = 0; i < count; ++i)
1075 					((uint32*)conv)[i] = TIFFClampDoubleToUInt32(value[i]);
1076 				ok = TIFFWriteDirectoryTagLongArray(tif,ndir,dir,tag,count,(uint32*)conv);
1077 			}
1078 			break;
1079 		default:
1080 			ok = 0;
1081 	}
1082 
1083 	_TIFFfree(conv);
1084 	return (ok);
1085 }
1086 
1087 #if 0
1088 static int
1089 TIFFWriteDirectoryTagSampleformatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
1090 {
1091 	switch (tif->tif_dir.td_sampleformat)
1092 	{
1093 		case SAMPLEFORMAT_IEEEFP:
1094 			if (tif->tif_dir.td_bitspersample<=32)
1095 				return(TIFFWriteDirectoryTagFloatPerSample(tif,ndir,dir,tag,(float)value));
1096 			else
1097 				return(TIFFWriteDirectoryTagDoublePerSample(tif,ndir,dir,tag,value));
1098 		case SAMPLEFORMAT_INT:
1099 			if (tif->tif_dir.td_bitspersample<=8)
1100 				return(TIFFWriteDirectoryTagSbytePerSample(tif,ndir,dir,tag,(int8)value));
1101 			else if (tif->tif_dir.td_bitspersample<=16)
1102 				return(TIFFWriteDirectoryTagSshortPerSample(tif,ndir,dir,tag,(int16)value));
1103 			else
1104 				return(TIFFWriteDirectoryTagSlongPerSample(tif,ndir,dir,tag,(int32)value));
1105 		case SAMPLEFORMAT_UINT:
1106 			if (tif->tif_dir.td_bitspersample<=8)
1107 				return(TIFFWriteDirectoryTagBytePerSample(tif,ndir,dir,tag,(uint8)value));
1108 			else if (tif->tif_dir.td_bitspersample<=16)
1109 				return(TIFFWriteDirectoryTagShortPerSample(tif,ndir,dir,tag,(uint16)value));
1110 			else
1111 				return(TIFFWriteDirectoryTagLongPerSample(tif,ndir,dir,tag,(uint32)value));
1112 		default:
1113 			return(1);
1114 	}
1115 }
1116 #endif
1117 
1118 static int
1119 TIFFWriteDirectoryTagAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value)
1120 {
1121 	if (dir==NULL)
1122 	{
1123 		(*ndir)++;
1124 		return(1);
1125 	}
1126 	return(TIFFWriteDirectoryTagCheckedAscii(tif,ndir,dir,tag,count,value));
1127 }
1128 
1129 static int
1130 TIFFWriteDirectoryTagUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
1131 {
1132 	if (dir==NULL)
1133 	{
1134 		(*ndir)++;
1135 		return(1);
1136 	}
1137 	return(TIFFWriteDirectoryTagCheckedUndefinedArray(tif,ndir,dir,tag,count,value));
1138 }
1139 
1140 #ifdef notdef
1141 static int
1142 TIFFWriteDirectoryTagByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value)
1143 {
1144 	if (dir==NULL)
1145 	{
1146 		(*ndir)++;
1147 		return(1);
1148 	}
1149 	return(TIFFWriteDirectoryTagCheckedByte(tif,ndir,dir,tag,value));
1150 }
1151 #endif
1152 
1153 static int
1154 TIFFWriteDirectoryTagByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
1155 {
1156 	if (dir==NULL)
1157 	{
1158 		(*ndir)++;
1159 		return(1);
1160 	}
1161 	return(TIFFWriteDirectoryTagCheckedByteArray(tif,ndir,dir,tag,count,value));
1162 }
1163 
1164 #if 0
1165 static int
1166 TIFFWriteDirectoryTagBytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value)
1167 {
1168 	static const char module[] = "TIFFWriteDirectoryTagBytePerSample";
1169 	uint8* m;
1170 	uint8* na;
1171 	uint16 nb;
1172 	int o;
1173 	if (dir==NULL)
1174 	{
1175 		(*ndir)++;
1176 		return(1);
1177 	}
1178 	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(uint8));
1179 	if (m==NULL)
1180 	{
1181 		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1182 		return(0);
1183 	}
1184 	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
1185 		*na=value;
1186 	o=TIFFWriteDirectoryTagCheckedByteArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
1187 	_TIFFfree(m);
1188 	return(o);
1189 }
1190 #endif
1191 
1192 #ifdef notdef
1193 static int
1194 TIFFWriteDirectoryTagSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value)
1195 {
1196 	if (dir==NULL)
1197 	{
1198 		(*ndir)++;
1199 		return(1);
1200 	}
1201 	return(TIFFWriteDirectoryTagCheckedSbyte(tif,ndir,dir,tag,value));
1202 }
1203 #endif
1204 
1205 static int
1206 TIFFWriteDirectoryTagSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value)
1207 {
1208 	if (dir==NULL)
1209 	{
1210 		(*ndir)++;
1211 		return(1);
1212 	}
1213 	return(TIFFWriteDirectoryTagCheckedSbyteArray(tif,ndir,dir,tag,count,value));
1214 }
1215 
1216 #if 0
1217 static int
1218 TIFFWriteDirectoryTagSbytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value)
1219 {
1220 	static const char module[] = "TIFFWriteDirectoryTagSbytePerSample";
1221 	int8* m;
1222 	int8* na;
1223 	uint16 nb;
1224 	int o;
1225 	if (dir==NULL)
1226 	{
1227 		(*ndir)++;
1228 		return(1);
1229 	}
1230 	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(int8));
1231 	if (m==NULL)
1232 	{
1233 		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1234 		return(0);
1235 	}
1236 	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
1237 		*na=value;
1238 	o=TIFFWriteDirectoryTagCheckedSbyteArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
1239 	_TIFFfree(m);
1240 	return(o);
1241 }
1242 #endif
1243 
1244 static int
1245 TIFFWriteDirectoryTagShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value)
1246 {
1247 	if (dir==NULL)
1248 	{
1249 		(*ndir)++;
1250 		return(1);
1251 	}
1252 	return(TIFFWriteDirectoryTagCheckedShort(tif,ndir,dir,tag,value));
1253 }
1254 
1255 static int
1256 TIFFWriteDirectoryTagShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value)
1257 {
1258 	if (dir==NULL)
1259 	{
1260 		(*ndir)++;
1261 		return(1);
1262 	}
1263 	return(TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,tag,count,value));
1264 }
1265 
1266 static int
1267 TIFFWriteDirectoryTagShortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value)
1268 {
1269 	static const char module[] = "TIFFWriteDirectoryTagShortPerSample";
1270 	uint16* m;
1271 	uint16* na;
1272 	uint16 nb;
1273 	int o;
1274 	if (dir==NULL)
1275 	{
1276 		(*ndir)++;
1277 		return(1);
1278 	}
1279 	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(uint16));
1280 	if (m==NULL)
1281 	{
1282 		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1283 		return(0);
1284 	}
1285 	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
1286 		*na=value;
1287 	o=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
1288 	_TIFFfree(m);
1289 	return(o);
1290 }
1291 
1292 #ifdef notdef
1293 static int
1294 TIFFWriteDirectoryTagSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value)
1295 {
1296 	if (dir==NULL)
1297 	{
1298 		(*ndir)++;
1299 		return(1);
1300 	}
1301 	return(TIFFWriteDirectoryTagCheckedSshort(tif,ndir,dir,tag,value));
1302 }
1303 #endif
1304 
1305 static int
1306 TIFFWriteDirectoryTagSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value)
1307 {
1308 	if (dir==NULL)
1309 	{
1310 		(*ndir)++;
1311 		return(1);
1312 	}
1313 	return(TIFFWriteDirectoryTagCheckedSshortArray(tif,ndir,dir,tag,count,value));
1314 }
1315 
1316 #if 0
1317 static int
1318 TIFFWriteDirectoryTagSshortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value)
1319 {
1320 	static const char module[] = "TIFFWriteDirectoryTagSshortPerSample";
1321 	int16* m;
1322 	int16* na;
1323 	uint16 nb;
1324 	int o;
1325 	if (dir==NULL)
1326 	{
1327 		(*ndir)++;
1328 		return(1);
1329 	}
1330 	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(int16));
1331 	if (m==NULL)
1332 	{
1333 		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1334 		return(0);
1335 	}
1336 	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
1337 		*na=value;
1338 	o=TIFFWriteDirectoryTagCheckedSshortArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
1339 	_TIFFfree(m);
1340 	return(o);
1341 }
1342 #endif
1343 
1344 static int
1345 TIFFWriteDirectoryTagLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
1346 {
1347 	if (dir==NULL)
1348 	{
1349 		(*ndir)++;
1350 		return(1);
1351 	}
1352 	return(TIFFWriteDirectoryTagCheckedLong(tif,ndir,dir,tag,value));
1353 }
1354 
1355 static int
1356 TIFFWriteDirectoryTagLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
1357 {
1358 	if (dir==NULL)
1359 	{
1360 		(*ndir)++;
1361 		return(1);
1362 	}
1363 	return(TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,count,value));
1364 }
1365 
1366 #if 0
1367 static int
1368 TIFFWriteDirectoryTagLongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
1369 {
1370 	static const char module[] = "TIFFWriteDirectoryTagLongPerSample";
1371 	uint32* m;
1372 	uint32* na;
1373 	uint16 nb;
1374 	int o;
1375 	if (dir==NULL)
1376 	{
1377 		(*ndir)++;
1378 		return(1);
1379 	}
1380 	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(uint32));
1381 	if (m==NULL)
1382 	{
1383 		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1384 		return(0);
1385 	}
1386 	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
1387 		*na=value;
1388 	o=TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
1389 	_TIFFfree(m);
1390 	return(o);
1391 }
1392 #endif
1393 
1394 #ifdef notdef
1395 static int
1396 TIFFWriteDirectoryTagSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value)
1397 {
1398 	if (dir==NULL)
1399 	{
1400 		(*ndir)++;
1401 		return(1);
1402 	}
1403 	return(TIFFWriteDirectoryTagCheckedSlong(tif,ndir,dir,tag,value));
1404 }
1405 #endif
1406 
1407 static int
1408 TIFFWriteDirectoryTagSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value)
1409 {
1410 	if (dir==NULL)
1411 	{
1412 		(*ndir)++;
1413 		return(1);
1414 	}
1415 	return(TIFFWriteDirectoryTagCheckedSlongArray(tif,ndir,dir,tag,count,value));
1416 }
1417 
1418 #if 0
1419 static int
1420 TIFFWriteDirectoryTagSlongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value)
1421 {
1422 	static const char module[] = "TIFFWriteDirectoryTagSlongPerSample";
1423 	int32* m;
1424 	int32* na;
1425 	uint16 nb;
1426 	int o;
1427 	if (dir==NULL)
1428 	{
1429 		(*ndir)++;
1430 		return(1);
1431 	}
1432 	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(int32));
1433 	if (m==NULL)
1434 	{
1435 		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1436 		return(0);
1437 	}
1438 	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
1439 		*na=value;
1440 	o=TIFFWriteDirectoryTagCheckedSlongArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
1441 	_TIFFfree(m);
1442 	return(o);
1443 }
1444 #endif
1445 
1446 #ifdef notdef
1447 static int
1448 TIFFWriteDirectoryTagLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value)
1449 {
1450 	if (dir==NULL)
1451 	{
1452 		(*ndir)++;
1453 		return(1);
1454 	}
1455 	return(TIFFWriteDirectoryTagCheckedLong8(tif,ndir,dir,tag,value));
1456 }
1457 #endif
1458 
1459 static int
1460 TIFFWriteDirectoryTagLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
1461 {
1462 	if (dir==NULL)
1463 	{
1464 		(*ndir)++;
1465 		return(1);
1466 	}
1467 	return(TIFFWriteDirectoryTagCheckedLong8Array(tif,ndir,dir,tag,count,value));
1468 }
1469 
1470 #ifdef notdef
1471 static int
1472 TIFFWriteDirectoryTagSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value)
1473 {
1474 	if (dir==NULL)
1475 	{
1476 		(*ndir)++;
1477 		return(1);
1478 	}
1479 	return(TIFFWriteDirectoryTagCheckedSlong8(tif,ndir,dir,tag,value));
1480 }
1481 #endif
1482 
1483 static int
1484 TIFFWriteDirectoryTagSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value)
1485 {
1486 	if (dir==NULL)
1487 	{
1488 		(*ndir)++;
1489 		return(1);
1490 	}
1491 	return(TIFFWriteDirectoryTagCheckedSlong8Array(tif,ndir,dir,tag,count,value));
1492 }
1493 
1494 static int
1495 TIFFWriteDirectoryTagRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
1496 {
1497 	if (dir==NULL)
1498 	{
1499 		(*ndir)++;
1500 		return(1);
1501 	}
1502 	return(TIFFWriteDirectoryTagCheckedRational(tif,ndir,dir,tag,value));
1503 }
1504 
1505 static int
1506 TIFFWriteDirectoryTagRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
1507 {
1508 	if (dir==NULL)
1509 	{
1510 		(*ndir)++;
1511 		return(1);
1512 	}
1513 	return(TIFFWriteDirectoryTagCheckedRationalArray(tif,ndir,dir,tag,count,value));
1514 }
1515 
1516 static int
1517 TIFFWriteDirectoryTagSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
1518 {
1519 	if (dir==NULL)
1520 	{
1521 		(*ndir)++;
1522 		return(1);
1523 	}
1524 	return(TIFFWriteDirectoryTagCheckedSrationalArray(tif,ndir,dir,tag,count,value));
1525 }
1526 
1527 #ifdef notdef
1528 static int TIFFWriteDirectoryTagFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value)
1529 {
1530 	if (dir==NULL)
1531 	{
1532 		(*ndir)++;
1533 		return(1);
1534 	}
1535 	return(TIFFWriteDirectoryTagCheckedFloat(tif,ndir,dir,tag,value));
1536 }
1537 #endif
1538 
1539 static int TIFFWriteDirectoryTagFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
1540 {
1541 	if (dir==NULL)
1542 	{
1543 		(*ndir)++;
1544 		return(1);
1545 	}
1546 	return(TIFFWriteDirectoryTagCheckedFloatArray(tif,ndir,dir,tag,count,value));
1547 }
1548 
1549 #if 0
1550 static int TIFFWriteDirectoryTagFloatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value)
1551 {
1552 	static const char module[] = "TIFFWriteDirectoryTagFloatPerSample";
1553 	float* m;
1554 	float* na;
1555 	uint16 nb;
1556 	int o;
1557 	if (dir==NULL)
1558 	{
1559 		(*ndir)++;
1560 		return(1);
1561 	}
1562 	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(float));
1563 	if (m==NULL)
1564 	{
1565 		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1566 		return(0);
1567 	}
1568 	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
1569 		*na=value;
1570 	o=TIFFWriteDirectoryTagCheckedFloatArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
1571 	_TIFFfree(m);
1572 	return(o);
1573 }
1574 #endif
1575 
1576 #ifdef notdef
1577 static int TIFFWriteDirectoryTagDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
1578 {
1579 	if (dir==NULL)
1580 	{
1581 		(*ndir)++;
1582 		return(1);
1583 	}
1584 	return(TIFFWriteDirectoryTagCheckedDouble(tif,ndir,dir,tag,value));
1585 }
1586 #endif
1587 
1588 static int TIFFWriteDirectoryTagDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value)
1589 {
1590 	if (dir==NULL)
1591 	{
1592 		(*ndir)++;
1593 		return(1);
1594 	}
1595 	return(TIFFWriteDirectoryTagCheckedDoubleArray(tif,ndir,dir,tag,count,value));
1596 }
1597 
1598 #if 0
1599 static int TIFFWriteDirectoryTagDoublePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
1600 {
1601 	static const char module[] = "TIFFWriteDirectoryTagDoublePerSample";
1602 	double* m;
1603 	double* na;
1604 	uint16 nb;
1605 	int o;
1606 	if (dir==NULL)
1607 	{
1608 		(*ndir)++;
1609 		return(1);
1610 	}
1611 	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(double));
1612 	if (m==NULL)
1613 	{
1614 		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1615 		return(0);
1616 	}
1617 	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
1618 		*na=value;
1619 	o=TIFFWriteDirectoryTagCheckedDoubleArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
1620 	_TIFFfree(m);
1621 	return(o);
1622 }
1623 #endif
1624 
1625 static int
1626 TIFFWriteDirectoryTagIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
1627 {
1628 	if (dir==NULL)
1629 	{
1630 		(*ndir)++;
1631 		return(1);
1632 	}
1633 	return(TIFFWriteDirectoryTagCheckedIfdArray(tif,ndir,dir,tag,count,value));
1634 }
1635 
1636 #ifdef notdef
1637 static int
1638 TIFFWriteDirectoryTagIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
1639 {
1640 	if (dir==NULL)
1641 	{
1642 		(*ndir)++;
1643 		return(1);
1644 	}
1645 	return(TIFFWriteDirectoryTagCheckedIfd8Array(tif,ndir,dir,tag,count,value));
1646 }
1647 #endif
1648 
1649 static int
1650 TIFFWriteDirectoryTagShortLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
1651 {
1652 	if (dir==NULL)
1653 	{
1654 		(*ndir)++;
1655 		return(1);
1656 	}
1657 	if (value<=0xFFFF)
1658 		return(TIFFWriteDirectoryTagCheckedShort(tif,ndir,dir,tag,(uint16)value));
1659 	else
1660 		return(TIFFWriteDirectoryTagCheckedLong(tif,ndir,dir,tag,value));
1661 }
1662 
1663 /************************************************************************/
1664 /*                TIFFWriteDirectoryTagLongLong8Array()                 */
1665 /*                                                                      */
1666 /*      Write out LONG8 array as LONG8 for BigTIFF or LONG for          */
1667 /*      Classic TIFF with some checking.                                */
1668 /************************************************************************/
1669 
1670 static int
1671 TIFFWriteDirectoryTagLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
1672 {
1673     static const char module[] = "TIFFWriteDirectoryTagLongLong8Array";
1674     uint64* ma;
1675     uint32 mb;
1676     uint32* p;
1677     uint32* q;
1678     int o;
1679 
1680     /* is this just a counting pass? */
1681     if (dir==NULL)
1682     {
1683         (*ndir)++;
1684         return(1);
1685     }
1686 
1687     /* We always write LONG8 for BigTIFF, no checking needed. */
1688     if( tif->tif_flags&TIFF_BIGTIFF )
1689         return TIFFWriteDirectoryTagCheckedLong8Array(tif,ndir,dir,
1690                                                       tag,count,value);
1691 
1692     /*
1693     ** For classic tiff we want to verify everything is in range for LONG
1694     ** and convert to long format.
1695     */
1696 
1697     p = _TIFFmalloc(count*sizeof(uint32));
1698     if (p==NULL)
1699     {
1700         TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1701         return(0);
1702     }
1703 
1704     for (q=p, ma=value, mb=0; mb<count; ma++, mb++, q++)
1705     {
1706         if (*ma>0xFFFFFFFF)
1707         {
1708             TIFFErrorExt(tif->tif_clientdata,module,
1709                          "Attempt to write value larger than 0xFFFFFFFF in Classic TIFF file.");
1710             _TIFFfree(p);
1711             return(0);
1712         }
1713         *q= (uint32)(*ma);
1714     }
1715 
1716     o=TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,count,p);
1717     _TIFFfree(p);
1718 
1719     return(o);
1720 }
1721 
1722 /************************************************************************/
1723 /*                 TIFFWriteDirectoryTagIfdIfd8Array()                  */
1724 /*                                                                      */
1725 /*      Write either IFD8 or IFD array depending on file type.          */
1726 /************************************************************************/
1727 
1728 static int
1729 TIFFWriteDirectoryTagIfdIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
1730 {
1731     static const char module[] = "TIFFWriteDirectoryTagIfdIfd8Array";
1732     uint64* ma;
1733     uint32 mb;
1734     uint32* p;
1735     uint32* q;
1736     int o;
1737 
1738     /* is this just a counting pass? */
1739     if (dir==NULL)
1740     {
1741         (*ndir)++;
1742         return(1);
1743     }
1744 
1745     /* We always write IFD8 for BigTIFF, no checking needed. */
1746     if( tif->tif_flags&TIFF_BIGTIFF )
1747         return TIFFWriteDirectoryTagCheckedIfd8Array(tif,ndir,dir,
1748                                                      tag,count,value);
1749 
1750     /*
1751     ** For classic tiff we want to verify everything is in range for IFD
1752     ** and convert to long format.
1753     */
1754 
1755     p = _TIFFmalloc(count*sizeof(uint32));
1756     if (p==NULL)
1757     {
1758         TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1759         return(0);
1760     }
1761 
1762     for (q=p, ma=value, mb=0; mb<count; ma++, mb++, q++)
1763     {
1764         if (*ma>0xFFFFFFFF)
1765         {
1766             TIFFErrorExt(tif->tif_clientdata,module,
1767                          "Attempt to write value larger than 0xFFFFFFFF in Classic TIFF file.");
1768             _TIFFfree(p);
1769             return(0);
1770         }
1771         *q= (uint32)(*ma);
1772     }
1773 
1774     o=TIFFWriteDirectoryTagCheckedIfdArray(tif,ndir,dir,tag,count,p);
1775     _TIFFfree(p);
1776 
1777     return(o);
1778 }
1779 
1780 #ifdef notdef
1781 static int
1782 TIFFWriteDirectoryTagShortLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
1783 {
1784 	static const char module[] = "TIFFWriteDirectoryTagShortLongLong8Array";
1785 	uint64* ma;
1786 	uint32 mb;
1787 	uint8 n;
1788 	int o;
1789 	if (dir==NULL)
1790 	{
1791 		(*ndir)++;
1792 		return(1);
1793 	}
1794 	n=0;
1795 	for (ma=value, mb=0; mb<count; ma++, mb++)
1796 	{
1797 		if ((n==0)&&(*ma>0xFFFF))
1798 			n=1;
1799 		if ((n==1)&&(*ma>0xFFFFFFFF))
1800 		{
1801 			n=2;
1802 			break;
1803 		}
1804 	}
1805 	if (n==0)
1806 	{
1807 		uint16* p;
1808 		uint16* q;
1809 		p=_TIFFmalloc(count*sizeof(uint16));
1810 		if (p==NULL)
1811 		{
1812 			TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1813 			return(0);
1814 		}
1815 		for (ma=value, mb=0, q=p; mb<count; ma++, mb++, q++)
1816 			*q=(uint16)(*ma);
1817 		o=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,tag,count,p);
1818 		_TIFFfree(p);
1819 	}
1820 	else if (n==1)
1821 	{
1822 		uint32* p;
1823 		uint32* q;
1824 		p=_TIFFmalloc(count*sizeof(uint32));
1825 		if (p==NULL)
1826 		{
1827 			TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1828 			return(0);
1829 		}
1830 		for (ma=value, mb=0, q=p; mb<count; ma++, mb++, q++)
1831 			*q=(uint32)(*ma);
1832 		o=TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,count,p);
1833 		_TIFFfree(p);
1834 	}
1835 	else
1836 	{
1837 		assert(n==2);
1838 		o=TIFFWriteDirectoryTagCheckedLong8Array(tif,ndir,dir,tag,count,value);
1839 	}
1840 	return(o);
1841 }
1842 #endif
1843 static int
1844 TIFFWriteDirectoryTagColormap(TIFF* tif, uint32* ndir, TIFFDirEntry* dir)
1845 {
1846 	static const char module[] = "TIFFWriteDirectoryTagColormap";
1847 	uint32 m;
1848 	uint16* n;
1849 	int o;
1850 	if (dir==NULL)
1851 	{
1852 		(*ndir)++;
1853 		return(1);
1854 	}
1855 	m=(1<<tif->tif_dir.td_bitspersample);
1856 	n=_TIFFmalloc(3*m*sizeof(uint16));
1857 	if (n==NULL)
1858 	{
1859 		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1860 		return(0);
1861 	}
1862 	_TIFFmemcpy(&n[0],tif->tif_dir.td_colormap[0],m*sizeof(uint16));
1863 	_TIFFmemcpy(&n[m],tif->tif_dir.td_colormap[1],m*sizeof(uint16));
1864 	_TIFFmemcpy(&n[2*m],tif->tif_dir.td_colormap[2],m*sizeof(uint16));
1865 	o=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,TIFFTAG_COLORMAP,3*m,n);
1866 	_TIFFfree(n);
1867 	return(o);
1868 }
1869 
1870 static int
1871 TIFFWriteDirectoryTagTransferfunction(TIFF* tif, uint32* ndir, TIFFDirEntry* dir)
1872 {
1873 	static const char module[] = "TIFFWriteDirectoryTagTransferfunction";
1874 	uint32 m;
1875 	uint16 n;
1876 	uint16* o;
1877 	int p;
1878 	if (dir==NULL)
1879 	{
1880 		(*ndir)++;
1881 		return(1);
1882 	}
1883 	m=(1<<tif->tif_dir.td_bitspersample);
1884 	n=tif->tif_dir.td_samplesperpixel-tif->tif_dir.td_extrasamples;
1885 	/*
1886 	 * Check if the table can be written as a single column,
1887 	 * or if it must be written as 3 columns.  Note that we
1888 	 * write a 3-column tag if there are 2 samples/pixel and
1889 	 * a single column of data won't suffice--hmm.
1890 	 */
1891 	if (n>3)
1892 		n=3;
1893 	if (n==3)
1894 	{
1895 		if (!_TIFFmemcmp(tif->tif_dir.td_transferfunction[0],tif->tif_dir.td_transferfunction[2],m*sizeof(uint16)))
1896 			n=2;
1897 	}
1898 	if (n==2)
1899 	{
1900 		if (!_TIFFmemcmp(tif->tif_dir.td_transferfunction[0],tif->tif_dir.td_transferfunction[1],m*sizeof(uint16)))
1901 			n=1;
1902 	}
1903 	if (n==0)
1904 		n=1;
1905 	o=_TIFFmalloc(n*m*sizeof(uint16));
1906 	if (o==NULL)
1907 	{
1908 		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1909 		return(0);
1910 	}
1911 	_TIFFmemcpy(&o[0],tif->tif_dir.td_transferfunction[0],m*sizeof(uint16));
1912 	if (n>1)
1913 		_TIFFmemcpy(&o[m],tif->tif_dir.td_transferfunction[1],m*sizeof(uint16));
1914 	if (n>2)
1915 		_TIFFmemcpy(&o[2*m],tif->tif_dir.td_transferfunction[2],m*sizeof(uint16));
1916 	p=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,TIFFTAG_TRANSFERFUNCTION,n*m,o);
1917 	_TIFFfree(o);
1918 	return(p);
1919 }
1920 
1921 static int
1922 TIFFWriteDirectoryTagSubifd(TIFF* tif, uint32* ndir, TIFFDirEntry* dir)
1923 {
1924 	static const char module[] = "TIFFWriteDirectoryTagSubifd";
1925 	uint64 m;
1926 	int n;
1927 	if (tif->tif_dir.td_nsubifd==0)
1928 		return(1);
1929 	if (dir==NULL)
1930 	{
1931 		(*ndir)++;
1932 		return(1);
1933 	}
1934 	m=tif->tif_dataoff;
1935 	if (!(tif->tif_flags&TIFF_BIGTIFF))
1936 	{
1937 		uint32* o;
1938 		uint64* pa;
1939 		uint32* pb;
1940 		uint16 p;
1941 		o=_TIFFmalloc(tif->tif_dir.td_nsubifd*sizeof(uint32));
1942 		if (o==NULL)
1943 		{
1944 			TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1945 			return(0);
1946 		}
1947 		pa=tif->tif_dir.td_subifd;
1948 		pb=o;
1949 		for (p=0; p < tif->tif_dir.td_nsubifd; p++)
1950 		{
1951                         assert(pa != 0);
1952 
1953                         /* Could happen if an classicTIFF has a SubIFD of type LONG8 (which is illegal) */
1954                         if( *pa > 0xFFFFFFFFUL)
1955                         {
1956                             TIFFErrorExt(tif->tif_clientdata,module,"Illegal value for SubIFD tag");
1957                             _TIFFfree(o);
1958                             return(0);
1959                         }
1960 			*pb++=(uint32)(*pa++);
1961 		}
1962 		n=TIFFWriteDirectoryTagCheckedIfdArray(tif,ndir,dir,TIFFTAG_SUBIFD,tif->tif_dir.td_nsubifd,o);
1963 		_TIFFfree(o);
1964 	}
1965 	else
1966 		n=TIFFWriteDirectoryTagCheckedIfd8Array(tif,ndir,dir,TIFFTAG_SUBIFD,tif->tif_dir.td_nsubifd,tif->tif_dir.td_subifd);
1967 	if (!n)
1968 		return(0);
1969 	/*
1970 	 * Total hack: if this directory includes a SubIFD
1971 	 * tag then force the next <n> directories to be
1972 	 * written as ``sub directories'' of this one.  This
1973 	 * is used to write things like thumbnails and
1974 	 * image masks that one wants to keep out of the
1975 	 * normal directory linkage access mechanism.
1976 	 */
1977 	tif->tif_flags|=TIFF_INSUBIFD;
1978 	tif->tif_nsubifd=tif->tif_dir.td_nsubifd;
1979 	if (tif->tif_dir.td_nsubifd==1)
1980 		tif->tif_subifdoff=0;
1981 	else
1982 		tif->tif_subifdoff=m;
1983 	return(1);
1984 }
1985 
1986 static int
1987 TIFFWriteDirectoryTagCheckedAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value)
1988 {
1989 	assert(sizeof(char)==1);
1990 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_ASCII,count,count,value));
1991 }
1992 
1993 static int
1994 TIFFWriteDirectoryTagCheckedUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
1995 {
1996 	assert(sizeof(uint8)==1);
1997 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_UNDEFINED,count,count,value));
1998 }
1999 
2000 #ifdef notdef
2001 static int
2002 TIFFWriteDirectoryTagCheckedByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value)
2003 {
2004 	assert(sizeof(uint8)==1);
2005 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_BYTE,1,1,&value));
2006 }
2007 #endif
2008 
2009 static int
2010 TIFFWriteDirectoryTagCheckedByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
2011 {
2012 	assert(sizeof(uint8)==1);
2013 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_BYTE,count,count,value));
2014 }
2015 
2016 #ifdef notdef
2017 static int
2018 TIFFWriteDirectoryTagCheckedSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value)
2019 {
2020 	assert(sizeof(int8)==1);
2021 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SBYTE,1,1,&value));
2022 }
2023 #endif
2024 
2025 static int
2026 TIFFWriteDirectoryTagCheckedSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value)
2027 {
2028 	assert(sizeof(int8)==1);
2029 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SBYTE,count,count,value));
2030 }
2031 
2032 static int
2033 TIFFWriteDirectoryTagCheckedShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value)
2034 {
2035 	uint16 m;
2036 	assert(sizeof(uint16)==2);
2037 	m=value;
2038 	if (tif->tif_flags&TIFF_SWAB)
2039 		TIFFSwabShort(&m);
2040 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SHORT,1,2,&m));
2041 }
2042 
2043 static int
2044 TIFFWriteDirectoryTagCheckedShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value)
2045 {
2046 	assert(count<0x80000000);
2047 	assert(sizeof(uint16)==2);
2048 	if (tif->tif_flags&TIFF_SWAB)
2049 		TIFFSwabArrayOfShort(value,count);
2050 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SHORT,count,count*2,value));
2051 }
2052 
2053 #ifdef notdef
2054 static int
2055 TIFFWriteDirectoryTagCheckedSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value)
2056 {
2057 	int16 m;
2058 	assert(sizeof(int16)==2);
2059 	m=value;
2060 	if (tif->tif_flags&TIFF_SWAB)
2061 		TIFFSwabShort((uint16*)(&m));
2062 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SSHORT,1,2,&m));
2063 }
2064 #endif
2065 
2066 static int
2067 TIFFWriteDirectoryTagCheckedSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value)
2068 {
2069 	assert(count<0x80000000);
2070 	assert(sizeof(int16)==2);
2071 	if (tif->tif_flags&TIFF_SWAB)
2072 		TIFFSwabArrayOfShort((uint16*)value,count);
2073 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SSHORT,count,count*2,value));
2074 }
2075 
2076 static int
2077 TIFFWriteDirectoryTagCheckedLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
2078 {
2079 	uint32 m;
2080 	assert(sizeof(uint32)==4);
2081 	m=value;
2082 	if (tif->tif_flags&TIFF_SWAB)
2083 		TIFFSwabLong(&m);
2084 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG,1,4,&m));
2085 }
2086 
2087 static int
2088 TIFFWriteDirectoryTagCheckedLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
2089 {
2090 	assert(count<0x40000000);
2091 	assert(sizeof(uint32)==4);
2092 	if (tif->tif_flags&TIFF_SWAB)
2093 		TIFFSwabArrayOfLong(value,count);
2094 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG,count,count*4,value));
2095 }
2096 
2097 #ifdef notdef
2098 static int
2099 TIFFWriteDirectoryTagCheckedSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value)
2100 {
2101 	int32 m;
2102 	assert(sizeof(int32)==4);
2103 	m=value;
2104 	if (tif->tif_flags&TIFF_SWAB)
2105 		TIFFSwabLong((uint32*)(&m));
2106 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG,1,4,&m));
2107 }
2108 #endif
2109 
2110 static int
2111 TIFFWriteDirectoryTagCheckedSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value)
2112 {
2113 	assert(count<0x40000000);
2114 	assert(sizeof(int32)==4);
2115 	if (tif->tif_flags&TIFF_SWAB)
2116 		TIFFSwabArrayOfLong((uint32*)value,count);
2117 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG,count,count*4,value));
2118 }
2119 
2120 #ifdef notdef
2121 static int
2122 TIFFWriteDirectoryTagCheckedLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value)
2123 {
2124 	uint64 m;
2125 	assert(sizeof(uint64)==8);
2126 	if( !(tif->tif_flags&TIFF_BIGTIFF) ) {
2127 		TIFFErrorExt(tif->tif_clientdata,"TIFFWriteDirectoryTagCheckedLong8","LONG8 not allowed for ClassicTIFF");
2128 		return(0);
2129 	}
2130 	m=value;
2131 	if (tif->tif_flags&TIFF_SWAB)
2132 		TIFFSwabLong8(&m);
2133 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG8,1,8,&m));
2134 }
2135 #endif
2136 
2137 static int
2138 TIFFWriteDirectoryTagCheckedLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
2139 {
2140 	assert(count<0x20000000);
2141 	assert(sizeof(uint64)==8);
2142 	if( !(tif->tif_flags&TIFF_BIGTIFF) ) {
2143 		TIFFErrorExt(tif->tif_clientdata,"TIFFWriteDirectoryTagCheckedLong8Array","LONG8 not allowed for ClassicTIFF");
2144 		return(0);
2145 	}
2146 	if (tif->tif_flags&TIFF_SWAB)
2147 		TIFFSwabArrayOfLong8(value,count);
2148 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG8,count,count*8,value));
2149 }
2150 
2151 #ifdef notdef
2152 static int
2153 TIFFWriteDirectoryTagCheckedSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value)
2154 {
2155 	int64 m;
2156 	assert(sizeof(int64)==8);
2157 	if( !(tif->tif_flags&TIFF_BIGTIFF) ) {
2158 		TIFFErrorExt(tif->tif_clientdata,"TIFFWriteDirectoryTagCheckedSlong8","SLONG8 not allowed for ClassicTIFF");
2159 		return(0);
2160 	}
2161 	m=value;
2162 	if (tif->tif_flags&TIFF_SWAB)
2163 		TIFFSwabLong8((uint64*)(&m));
2164 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG8,1,8,&m));
2165 }
2166 #endif
2167 
2168 static int
2169 TIFFWriteDirectoryTagCheckedSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value)
2170 {
2171 	assert(count<0x20000000);
2172 	assert(sizeof(int64)==8);
2173 	if( !(tif->tif_flags&TIFF_BIGTIFF) ) {
2174 		TIFFErrorExt(tif->tif_clientdata,"TIFFWriteDirectoryTagCheckedSlong8Array","SLONG8 not allowed for ClassicTIFF");
2175 		return(0);
2176 	}
2177 	if (tif->tif_flags&TIFF_SWAB)
2178 		TIFFSwabArrayOfLong8((uint64*)value,count);
2179 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG8,count,count*8,value));
2180 }
2181 
2182 static int
2183 TIFFWriteDirectoryTagCheckedRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
2184 {
2185         static const char module[] = "TIFFWriteDirectoryTagCheckedRational";
2186 	uint32 m[2];
2187 	assert(sizeof(uint32)==4);
2188         if( value < 0 )
2189         {
2190             TIFFErrorExt(tif->tif_clientdata,module,"Negative value is illegal");
2191             return 0;
2192         }
2193         else if( value != value )
2194         {
2195             TIFFErrorExt(tif->tif_clientdata,module,"Not-a-number value is illegal");
2196             return 0;
2197         }
2198 	else if (value==0.0)
2199 	{
2200 		m[0]=0;
2201 		m[1]=1;
2202 	}
2203 	else if (value <= 0xFFFFFFFFU && value==(double)(uint32)value)
2204 	{
2205 		m[0]=(uint32)value;
2206 		m[1]=1;
2207 	}
2208 	else if (value<1.0)
2209 	{
2210 		m[0]=(uint32)(value*0xFFFFFFFF);
2211 		m[1]=0xFFFFFFFF;
2212 	}
2213 	else
2214 	{
2215 		m[0]=0xFFFFFFFF;
2216 		m[1]=(uint32)(0xFFFFFFFF/value);
2217 	}
2218 	if (tif->tif_flags&TIFF_SWAB)
2219 	{
2220 		TIFFSwabLong(&m[0]);
2221 		TIFFSwabLong(&m[1]);
2222 	}
2223 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_RATIONAL,1,8,&m[0]));
2224 }
2225 
2226 static int
2227 TIFFWriteDirectoryTagCheckedRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
2228 {
2229 	static const char module[] = "TIFFWriteDirectoryTagCheckedRationalArray";
2230 	uint32* m;
2231 	float* na;
2232 	uint32* nb;
2233 	uint32 nc;
2234 	int o;
2235 	assert(sizeof(uint32)==4);
2236 	m=_TIFFmalloc(count*2*sizeof(uint32));
2237 	if (m==NULL)
2238 	{
2239 		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
2240 		return(0);
2241 	}
2242 	for (na=value, nb=m, nc=0; nc<count; na++, nb+=2, nc++)
2243 	{
2244 		if (*na<=0.0 || *na != *na)
2245 		{
2246 			nb[0]=0;
2247 			nb[1]=1;
2248 		}
2249 		else if (*na >= 0 && *na <= (float)0xFFFFFFFFU &&
2250                          *na==(float)(uint32)(*na))
2251 		{
2252 			nb[0]=(uint32)(*na);
2253 			nb[1]=1;
2254 		}
2255 		else if (*na<1.0)
2256 		{
2257 			nb[0]=(uint32)((double)(*na)*0xFFFFFFFF);
2258 			nb[1]=0xFFFFFFFF;
2259 		}
2260 		else
2261 		{
2262 			nb[0]=0xFFFFFFFF;
2263 			nb[1]=(uint32)((double)0xFFFFFFFF/(*na));
2264 		}
2265 	}
2266 	if (tif->tif_flags&TIFF_SWAB)
2267 		TIFFSwabArrayOfLong(m,count*2);
2268 	o=TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_RATIONAL,count,count*8,&m[0]);
2269 	_TIFFfree(m);
2270 	return(o);
2271 }
2272 
2273 static int
2274 TIFFWriteDirectoryTagCheckedSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
2275 {
2276 	static const char module[] = "TIFFWriteDirectoryTagCheckedSrationalArray";
2277 	int32* m;
2278 	float* na;
2279 	int32* nb;
2280 	uint32 nc;
2281 	int o;
2282 	assert(sizeof(int32)==4);
2283 	m=_TIFFmalloc(count*2*sizeof(int32));
2284 	if (m==NULL)
2285 	{
2286 		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
2287 		return(0);
2288 	}
2289 	for (na=value, nb=m, nc=0; nc<count; na++, nb+=2, nc++)
2290 	{
2291 		if (*na<0.0)
2292 		{
2293 			if (*na==(int32)(*na))
2294 			{
2295 				nb[0]=(int32)(*na);
2296 				nb[1]=1;
2297 			}
2298 			else if (*na>-1.0)
2299 			{
2300 				nb[0]=-(int32)((double)(-*na)*0x7FFFFFFF);
2301 				nb[1]=0x7FFFFFFF;
2302 			}
2303 			else
2304 			{
2305 				nb[0]=-0x7FFFFFFF;
2306 				nb[1]=(int32)((double)0x7FFFFFFF/(-*na));
2307 			}
2308 		}
2309 		else
2310 		{
2311 			if (*na==(int32)(*na))
2312 			{
2313 				nb[0]=(int32)(*na);
2314 				nb[1]=1;
2315 			}
2316 			else if (*na<1.0)
2317 			{
2318 				nb[0]=(int32)((double)(*na)*0x7FFFFFFF);
2319 				nb[1]=0x7FFFFFFF;
2320 			}
2321 			else
2322 			{
2323 				nb[0]=0x7FFFFFFF;
2324 				nb[1]=(int32)((double)0x7FFFFFFF/(*na));
2325 			}
2326 		}
2327 	}
2328 	if (tif->tif_flags&TIFF_SWAB)
2329 		TIFFSwabArrayOfLong((uint32*)m,count*2);
2330 	o=TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SRATIONAL,count,count*8,&m[0]);
2331 	_TIFFfree(m);
2332 	return(o);
2333 }
2334 
2335 #ifdef notdef
2336 static int
2337 TIFFWriteDirectoryTagCheckedFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value)
2338 {
2339 	float m;
2340 	assert(sizeof(float)==4);
2341 	m=value;
2342 	TIFFCvtNativeToIEEEFloat(tif,1,&m);
2343 	if (tif->tif_flags&TIFF_SWAB)
2344 		TIFFSwabFloat(&m);
2345 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_FLOAT,1,4,&m));
2346 }
2347 #endif
2348 
2349 static int
2350 TIFFWriteDirectoryTagCheckedFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
2351 {
2352 	assert(count<0x40000000);
2353 	assert(sizeof(float)==4);
2354 	TIFFCvtNativeToIEEEFloat(tif,count,&value);
2355 	if (tif->tif_flags&TIFF_SWAB)
2356 		TIFFSwabArrayOfFloat(value,count);
2357 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_FLOAT,count,count*4,value));
2358 }
2359 
2360 #ifdef notdef
2361 static int
2362 TIFFWriteDirectoryTagCheckedDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
2363 {
2364 	double m;
2365 	assert(sizeof(double)==8);
2366 	m=value;
2367 	TIFFCvtNativeToIEEEDouble(tif,1,&m);
2368 	if (tif->tif_flags&TIFF_SWAB)
2369 		TIFFSwabDouble(&m);
2370 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_DOUBLE,1,8,&m));
2371 }
2372 #endif
2373 
2374 static int
2375 TIFFWriteDirectoryTagCheckedDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value)
2376 {
2377 	assert(count<0x20000000);
2378 	assert(sizeof(double)==8);
2379 	TIFFCvtNativeToIEEEDouble(tif,count,&value);
2380 	if (tif->tif_flags&TIFF_SWAB)
2381 		TIFFSwabArrayOfDouble(value,count);
2382 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_DOUBLE,count,count*8,value));
2383 }
2384 
2385 static int
2386 TIFFWriteDirectoryTagCheckedIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
2387 {
2388 	assert(count<0x40000000);
2389 	assert(sizeof(uint32)==4);
2390 	if (tif->tif_flags&TIFF_SWAB)
2391 		TIFFSwabArrayOfLong(value,count);
2392 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_IFD,count,count*4,value));
2393 }
2394 
2395 static int
2396 TIFFWriteDirectoryTagCheckedIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
2397 {
2398 	assert(count<0x20000000);
2399 	assert(sizeof(uint64)==8);
2400 	assert(tif->tif_flags&TIFF_BIGTIFF);
2401 	if (tif->tif_flags&TIFF_SWAB)
2402 		TIFFSwabArrayOfLong8(value,count);
2403 	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_IFD8,count,count*8,value));
2404 }
2405 
2406 static int
2407 TIFFWriteDirectoryTagData(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 datatype, uint32 count, uint32 datalength, void* data)
2408 {
2409 	static const char module[] = "TIFFWriteDirectoryTagData";
2410 	uint32 m;
2411 	m=0;
2412 	while (m<(*ndir))
2413 	{
2414 		assert(dir[m].tdir_tag!=tag);
2415 		if (dir[m].tdir_tag>tag)
2416 			break;
2417 		m++;
2418 	}
2419 	if (m<(*ndir))
2420 	{
2421 		uint32 n;
2422 		for (n=*ndir; n>m; n--)
2423 			dir[n]=dir[n-1];
2424 	}
2425 	dir[m].tdir_tag=tag;
2426 	dir[m].tdir_type=datatype;
2427 	dir[m].tdir_count=count;
2428 	dir[m].tdir_offset.toff_long8 = 0;
2429 	if (datalength<=((tif->tif_flags&TIFF_BIGTIFF)?0x8U:0x4U))
2430 		_TIFFmemcpy(&dir[m].tdir_offset,data,datalength);
2431 	else
2432 	{
2433 		uint64 na,nb;
2434 		na=tif->tif_dataoff;
2435 		nb=na+datalength;
2436 		if (!(tif->tif_flags&TIFF_BIGTIFF))
2437 			nb=(uint32)nb;
2438 		if ((nb<na)||(nb<datalength))
2439 		{
2440 			TIFFErrorExt(tif->tif_clientdata,module,"Maximum TIFF file size exceeded");
2441 			return(0);
2442 		}
2443 		if (!SeekOK(tif,na))
2444 		{
2445 			TIFFErrorExt(tif->tif_clientdata,module,"IO error writing tag data");
2446 			return(0);
2447 		}
2448 		assert(datalength<0x80000000UL);
2449 		if (!WriteOK(tif,data,(tmsize_t)datalength))
2450 		{
2451 			TIFFErrorExt(tif->tif_clientdata,module,"IO error writing tag data");
2452 			return(0);
2453 		}
2454 		tif->tif_dataoff=nb;
2455 		if (tif->tif_dataoff&1)
2456 			tif->tif_dataoff++;
2457 		if (!(tif->tif_flags&TIFF_BIGTIFF))
2458 		{
2459 			uint32 o;
2460 			o=(uint32)na;
2461 			if (tif->tif_flags&TIFF_SWAB)
2462 				TIFFSwabLong(&o);
2463 			_TIFFmemcpy(&dir[m].tdir_offset,&o,4);
2464 		}
2465 		else
2466 		{
2467 			dir[m].tdir_offset.toff_long8 = na;
2468 			if (tif->tif_flags&TIFF_SWAB)
2469 				TIFFSwabLong8(&dir[m].tdir_offset.toff_long8);
2470 		}
2471 	}
2472 	(*ndir)++;
2473 	return(1);
2474 }
2475 
2476 /*
2477  * Link the current directory into the directory chain for the file.
2478  */
2479 static int
2480 TIFFLinkDirectory(TIFF* tif)
2481 {
2482 	static const char module[] = "TIFFLinkDirectory";
2483 
2484 	tif->tif_diroff = (TIFFSeekFile(tif,0,SEEK_END)+1) & (~((toff_t)1));
2485 
2486 	/*
2487 	 * Handle SubIFDs
2488 	 */
2489 	if (tif->tif_flags & TIFF_INSUBIFD)
2490 	{
2491 		if (!(tif->tif_flags&TIFF_BIGTIFF))
2492 		{
2493 			uint32 m;
2494 			m = (uint32)tif->tif_diroff;
2495 			if (tif->tif_flags & TIFF_SWAB)
2496 				TIFFSwabLong(&m);
2497 			(void) TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET);
2498 			if (!WriteOK(tif, &m, 4)) {
2499 				TIFFErrorExt(tif->tif_clientdata, module,
2500 				     "Error writing SubIFD directory link");
2501 				return (0);
2502 			}
2503 			/*
2504 			 * Advance to the next SubIFD or, if this is
2505 			 * the last one configured, revert back to the
2506 			 * normal directory linkage.
2507 			 */
2508 			if (--tif->tif_nsubifd)
2509 				tif->tif_subifdoff += 4;
2510 			else
2511 				tif->tif_flags &= ~TIFF_INSUBIFD;
2512 			return (1);
2513 		}
2514 		else
2515 		{
2516 			uint64 m;
2517 			m = tif->tif_diroff;
2518 			if (tif->tif_flags & TIFF_SWAB)
2519 				TIFFSwabLong8(&m);
2520 			(void) TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET);
2521 			if (!WriteOK(tif, &m, 8)) {
2522 				TIFFErrorExt(tif->tif_clientdata, module,
2523 				     "Error writing SubIFD directory link");
2524 				return (0);
2525 			}
2526 			/*
2527 			 * Advance to the next SubIFD or, if this is
2528 			 * the last one configured, revert back to the
2529 			 * normal directory linkage.
2530 			 */
2531 			if (--tif->tif_nsubifd)
2532 				tif->tif_subifdoff += 8;
2533 			else
2534 				tif->tif_flags &= ~TIFF_INSUBIFD;
2535 			return (1);
2536 		}
2537 	}
2538 
2539 	if (!(tif->tif_flags&TIFF_BIGTIFF))
2540 	{
2541 		uint32 m;
2542 		uint32 nextdir;
2543 		m = (uint32)(tif->tif_diroff);
2544 		if (tif->tif_flags & TIFF_SWAB)
2545 			TIFFSwabLong(&m);
2546 		if (tif->tif_header.classic.tiff_diroff == 0) {
2547 			/*
2548 			 * First directory, overwrite offset in header.
2549 			 */
2550 			tif->tif_header.classic.tiff_diroff = (uint32) tif->tif_diroff;
2551 			(void) TIFFSeekFile(tif,4, SEEK_SET);
2552 			if (!WriteOK(tif, &m, 4)) {
2553 				TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
2554 					     "Error writing TIFF header");
2555 				return (0);
2556 			}
2557 			return (1);
2558 		}
2559 		/*
2560 		 * Not the first directory, search to the last and append.
2561 		 */
2562 		nextdir = tif->tif_header.classic.tiff_diroff;
2563 		while(1) {
2564 			uint16 dircount;
2565 			uint32 nextnextdir;
2566 
2567 			if (!SeekOK(tif, nextdir) ||
2568 			    !ReadOK(tif, &dircount, 2)) {
2569 				TIFFErrorExt(tif->tif_clientdata, module,
2570 					     "Error fetching directory count");
2571 				return (0);
2572 			}
2573 			if (tif->tif_flags & TIFF_SWAB)
2574 				TIFFSwabShort(&dircount);
2575 			(void) TIFFSeekFile(tif,
2576 			    nextdir+2+dircount*12, SEEK_SET);
2577 			if (!ReadOK(tif, &nextnextdir, 4)) {
2578 				TIFFErrorExt(tif->tif_clientdata, module,
2579 					     "Error fetching directory link");
2580 				return (0);
2581 			}
2582 			if (tif->tif_flags & TIFF_SWAB)
2583 				TIFFSwabLong(&nextnextdir);
2584 			if (nextnextdir==0)
2585 			{
2586 				(void) TIFFSeekFile(tif,
2587 				    nextdir+2+dircount*12, SEEK_SET);
2588 				if (!WriteOK(tif, &m, 4)) {
2589 					TIFFErrorExt(tif->tif_clientdata, module,
2590 					     "Error writing directory link");
2591 					return (0);
2592 				}
2593 				break;
2594 			}
2595 			nextdir=nextnextdir;
2596 		}
2597 	}
2598 	else
2599 	{
2600 		uint64 m;
2601 		uint64 nextdir;
2602 		m = tif->tif_diroff;
2603 		if (tif->tif_flags & TIFF_SWAB)
2604 			TIFFSwabLong8(&m);
2605 		if (tif->tif_header.big.tiff_diroff == 0) {
2606 			/*
2607 			 * First directory, overwrite offset in header.
2608 			 */
2609 			tif->tif_header.big.tiff_diroff = tif->tif_diroff;
2610 			(void) TIFFSeekFile(tif,8, SEEK_SET);
2611 			if (!WriteOK(tif, &m, 8)) {
2612 				TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
2613 					     "Error writing TIFF header");
2614 				return (0);
2615 			}
2616 			return (1);
2617 		}
2618 		/*
2619 		 * Not the first directory, search to the last and append.
2620 		 */
2621 		nextdir = tif->tif_header.big.tiff_diroff;
2622 		while(1) {
2623 			uint64 dircount64;
2624 			uint16 dircount;
2625 			uint64 nextnextdir;
2626 
2627 			if (!SeekOK(tif, nextdir) ||
2628 			    !ReadOK(tif, &dircount64, 8)) {
2629 				TIFFErrorExt(tif->tif_clientdata, module,
2630 					     "Error fetching directory count");
2631 				return (0);
2632 			}
2633 			if (tif->tif_flags & TIFF_SWAB)
2634 				TIFFSwabLong8(&dircount64);
2635 			if (dircount64>0xFFFF)
2636 			{
2637 				TIFFErrorExt(tif->tif_clientdata, module,
2638 					     "Sanity check on tag count failed, likely corrupt TIFF");
2639 				return (0);
2640 			}
2641 			dircount=(uint16)dircount64;
2642 			(void) TIFFSeekFile(tif,
2643 			    nextdir+8+dircount*20, SEEK_SET);
2644 			if (!ReadOK(tif, &nextnextdir, 8)) {
2645 				TIFFErrorExt(tif->tif_clientdata, module,
2646 					     "Error fetching directory link");
2647 				return (0);
2648 			}
2649 			if (tif->tif_flags & TIFF_SWAB)
2650 				TIFFSwabLong8(&nextnextdir);
2651 			if (nextnextdir==0)
2652 			{
2653 				(void) TIFFSeekFile(tif,
2654 				    nextdir+8+dircount*20, SEEK_SET);
2655 				if (!WriteOK(tif, &m, 8)) {
2656 					TIFFErrorExt(tif->tif_clientdata, module,
2657 					     "Error writing directory link");
2658 					return (0);
2659 				}
2660 				break;
2661 			}
2662 			nextdir=nextnextdir;
2663 		}
2664 	}
2665 	return (1);
2666 }
2667 
2668 /************************************************************************/
2669 /*                          TIFFRewriteField()                          */
2670 /*                                                                      */
2671 /*      Rewrite a field in the directory on disk without regard to      */
2672 /*      updating the TIFF directory structure in memory.  Currently     */
2673 /*      only supported for field that already exist in the on-disk      */
2674 /*      directory.  Mainly used for updating stripoffset /              */
2675 /*      stripbytecount values after the directory is already on         */
2676 /*      disk.                                                           */
2677 /*                                                                      */
2678 /*      Returns zero on failure, and one on success.                    */
2679 /************************************************************************/
2680 
2681 int
2682 _TIFFRewriteField(TIFF* tif, uint16 tag, TIFFDataType in_datatype,
2683                   tmsize_t count, void* data)
2684 {
2685     static const char module[] = "TIFFResetField";
2686     /* const TIFFField* fip = NULL; */
2687     uint16 dircount;
2688     tmsize_t dirsize;
2689     uint8 direntry_raw[20];
2690     uint16 entry_tag = 0;
2691     uint16 entry_type = 0;
2692     uint64 entry_count = 0;
2693     uint64 entry_offset = 0;
2694     int    value_in_entry = 0;
2695     uint64 read_offset;
2696     uint8 *buf_to_write = NULL;
2697     TIFFDataType datatype;
2698 
2699 /* -------------------------------------------------------------------- */
2700 /*      Find field definition.                                          */
2701 /* -------------------------------------------------------------------- */
2702     /*fip =*/ TIFFFindField(tif, tag, TIFF_ANY);
2703 
2704 /* -------------------------------------------------------------------- */
2705 /*      Do some checking this is a straight forward case.               */
2706 /* -------------------------------------------------------------------- */
2707     if( isMapped(tif) )
2708     {
2709         TIFFErrorExt( tif->tif_clientdata, module,
2710                       "Memory mapped files not currently supported for this operation." );
2711         return 0;
2712     }
2713 
2714     if( tif->tif_diroff == 0 )
2715     {
2716         TIFFErrorExt( tif->tif_clientdata, module,
2717                       "Attempt to reset field on directory not already on disk." );
2718         return 0;
2719     }
2720 
2721 /* -------------------------------------------------------------------- */
2722 /*      Read the directory entry count.                                 */
2723 /* -------------------------------------------------------------------- */
2724     if (!SeekOK(tif, tif->tif_diroff)) {
2725         TIFFErrorExt(tif->tif_clientdata, module,
2726                      "%s: Seek error accessing TIFF directory",
2727                      tif->tif_name);
2728         return 0;
2729     }
2730 
2731     read_offset = tif->tif_diroff;
2732 
2733     if (!(tif->tif_flags&TIFF_BIGTIFF))
2734     {
2735         if (!ReadOK(tif, &dircount, sizeof (uint16))) {
2736             TIFFErrorExt(tif->tif_clientdata, module,
2737                          "%s: Can not read TIFF directory count",
2738                          tif->tif_name);
2739             return 0;
2740         }
2741         if (tif->tif_flags & TIFF_SWAB)
2742             TIFFSwabShort(&dircount);
2743         dirsize = 12;
2744         read_offset += 2;
2745     } else {
2746         uint64 dircount64;
2747         if (!ReadOK(tif, &dircount64, sizeof (uint64))) {
2748             TIFFErrorExt(tif->tif_clientdata, module,
2749                          "%s: Can not read TIFF directory count",
2750                          tif->tif_name);
2751             return 0;
2752         }
2753         if (tif->tif_flags & TIFF_SWAB)
2754             TIFFSwabLong8(&dircount64);
2755         dircount = (uint16)dircount64;
2756         dirsize = 20;
2757         read_offset += 8;
2758     }
2759 
2760 /* -------------------------------------------------------------------- */
2761 /*      Read through directory to find target tag.                      */
2762 /* -------------------------------------------------------------------- */
2763     while( dircount > 0 )
2764     {
2765         if (!ReadOK(tif, direntry_raw, dirsize)) {
2766             TIFFErrorExt(tif->tif_clientdata, module,
2767                          "%s: Can not read TIFF directory entry.",
2768                          tif->tif_name);
2769             return 0;
2770         }
2771 
2772         memcpy( &entry_tag, direntry_raw + 0, sizeof(uint16) );
2773         if (tif->tif_flags&TIFF_SWAB)
2774             TIFFSwabShort( &entry_tag );
2775 
2776         if( entry_tag == tag )
2777             break;
2778 
2779         read_offset += dirsize;
2780     }
2781 
2782     if( entry_tag != tag )
2783     {
2784         TIFFErrorExt(tif->tif_clientdata, module,
2785                      "%s: Could not find tag %d.",
2786                      tif->tif_name, tag );
2787         return 0;
2788     }
2789 
2790 /* -------------------------------------------------------------------- */
2791 /*      Extract the type, count and offset for this entry.              */
2792 /* -------------------------------------------------------------------- */
2793     memcpy( &entry_type, direntry_raw + 2, sizeof(uint16) );
2794     if (tif->tif_flags&TIFF_SWAB)
2795         TIFFSwabShort( &entry_type );
2796 
2797     if (!(tif->tif_flags&TIFF_BIGTIFF))
2798     {
2799         uint32 value;
2800 
2801         memcpy( &value, direntry_raw + 4, sizeof(uint32) );
2802         if (tif->tif_flags&TIFF_SWAB)
2803             TIFFSwabLong( &value );
2804         entry_count = value;
2805 
2806         memcpy( &value, direntry_raw + 8, sizeof(uint32) );
2807         if (tif->tif_flags&TIFF_SWAB)
2808             TIFFSwabLong( &value );
2809         entry_offset = value;
2810     }
2811     else
2812     {
2813         memcpy( &entry_count, direntry_raw + 4, sizeof(uint64) );
2814         if (tif->tif_flags&TIFF_SWAB)
2815             TIFFSwabLong8( &entry_count );
2816 
2817         memcpy( &entry_offset, direntry_raw + 12, sizeof(uint64) );
2818         if (tif->tif_flags&TIFF_SWAB)
2819             TIFFSwabLong8( &entry_offset );
2820     }
2821 
2822 /* -------------------------------------------------------------------- */
2823 /*      What data type do we want to write this as?                     */
2824 /* -------------------------------------------------------------------- */
2825     if( TIFFDataWidth(in_datatype) == 8 && !(tif->tif_flags&TIFF_BIGTIFF) )
2826     {
2827         if( in_datatype == TIFF_LONG8 )
2828             datatype = TIFF_LONG;
2829         else if( in_datatype == TIFF_SLONG8 )
2830             datatype = TIFF_SLONG;
2831         else if( in_datatype == TIFF_IFD8 )
2832             datatype = TIFF_IFD;
2833         else
2834             datatype = in_datatype;
2835     }
2836     else
2837         datatype = in_datatype;
2838 
2839 /* -------------------------------------------------------------------- */
2840 /*      Prepare buffer of actual data to write.  This includes          */
2841 /*      swabbing as needed.                                             */
2842 /* -------------------------------------------------------------------- */
2843     buf_to_write =
2844 	    (uint8 *)_TIFFCheckMalloc(tif, count, TIFFDataWidth(datatype),
2845 				      "for field buffer.");
2846     if (!buf_to_write)
2847         return 0;
2848 
2849     if( datatype == in_datatype )
2850         memcpy( buf_to_write, data, count * TIFFDataWidth(datatype) );
2851     else if( datatype == TIFF_SLONG && in_datatype == TIFF_SLONG8 )
2852     {
2853 	tmsize_t i;
2854 
2855         for( i = 0; i < count; i++ )
2856         {
2857             ((int32 *) buf_to_write)[i] =
2858                 (int32) ((int64 *) data)[i];
2859             if( (int64) ((int32 *) buf_to_write)[i] != ((int64 *) data)[i] )
2860             {
2861                 _TIFFfree( buf_to_write );
2862                 TIFFErrorExt( tif->tif_clientdata, module,
2863                               "Value exceeds 32bit range of output type." );
2864                 return 0;
2865             }
2866         }
2867     }
2868     else if( (datatype == TIFF_LONG && in_datatype == TIFF_LONG8)
2869              || (datatype == TIFF_IFD && in_datatype == TIFF_IFD8) )
2870     {
2871 	tmsize_t i;
2872 
2873         for( i = 0; i < count; i++ )
2874         {
2875             ((uint32 *) buf_to_write)[i] =
2876                 (uint32) ((uint64 *) data)[i];
2877             if( (uint64) ((uint32 *) buf_to_write)[i] != ((uint64 *) data)[i] )
2878             {
2879                 _TIFFfree( buf_to_write );
2880                 TIFFErrorExt( tif->tif_clientdata, module,
2881                               "Value exceeds 32bit range of output type." );
2882                 return 0;
2883             }
2884         }
2885     }
2886 
2887     if( TIFFDataWidth(datatype) > 1 && (tif->tif_flags&TIFF_SWAB) )
2888     {
2889         if( TIFFDataWidth(datatype) == 2 )
2890             TIFFSwabArrayOfShort( (uint16 *) buf_to_write, count );
2891         else if( TIFFDataWidth(datatype) == 4 )
2892             TIFFSwabArrayOfLong( (uint32 *) buf_to_write, count );
2893         else if( TIFFDataWidth(datatype) == 8 )
2894             TIFFSwabArrayOfLong8( (uint64 *) buf_to_write, count );
2895     }
2896 
2897 /* -------------------------------------------------------------------- */
2898 /*      Is this a value that fits into the directory entry?             */
2899 /* -------------------------------------------------------------------- */
2900     if (!(tif->tif_flags&TIFF_BIGTIFF))
2901     {
2902         if( TIFFDataWidth(datatype) * count <= 4 )
2903         {
2904             entry_offset = read_offset + 8;
2905             value_in_entry = 1;
2906         }
2907     }
2908     else
2909     {
2910         if( TIFFDataWidth(datatype) * count <= 8 )
2911         {
2912             entry_offset = read_offset + 12;
2913             value_in_entry = 1;
2914         }
2915     }
2916 
2917 /* -------------------------------------------------------------------- */
2918 /*      If the tag type, and count match, then we just write it out     */
2919 /*      over the old values without altering the directory entry at     */
2920 /*      all.                                                            */
2921 /* -------------------------------------------------------------------- */
2922     if( entry_count == (uint64)count && entry_type == (uint16) datatype )
2923     {
2924         if (!SeekOK(tif, entry_offset)) {
2925             _TIFFfree( buf_to_write );
2926             TIFFErrorExt(tif->tif_clientdata, module,
2927                          "%s: Seek error accessing TIFF directory",
2928                          tif->tif_name);
2929             return 0;
2930         }
2931         if (!WriteOK(tif, buf_to_write, count*TIFFDataWidth(datatype))) {
2932             _TIFFfree( buf_to_write );
2933             TIFFErrorExt(tif->tif_clientdata, module,
2934                          "Error writing directory link");
2935             return (0);
2936         }
2937 
2938         _TIFFfree( buf_to_write );
2939         return 1;
2940     }
2941 
2942 /* -------------------------------------------------------------------- */
2943 /*      Otherwise, we write the new tag data at the end of the file.    */
2944 /* -------------------------------------------------------------------- */
2945     if( !value_in_entry )
2946     {
2947         entry_offset = TIFFSeekFile(tif,0,SEEK_END);
2948 
2949         if (!WriteOK(tif, buf_to_write, count*TIFFDataWidth(datatype))) {
2950             _TIFFfree( buf_to_write );
2951             TIFFErrorExt(tif->tif_clientdata, module,
2952                          "Error writing directory link");
2953             return (0);
2954         }
2955     }
2956     else
2957     {
2958         memcpy( &entry_offset, buf_to_write, count*TIFFDataWidth(datatype));
2959     }
2960 
2961     _TIFFfree( buf_to_write );
2962     buf_to_write = 0;
2963 
2964 /* -------------------------------------------------------------------- */
2965 /*      Adjust the directory entry.                                     */
2966 /* -------------------------------------------------------------------- */
2967     entry_type = datatype;
2968     memcpy( direntry_raw + 2, &entry_type, sizeof(uint16) );
2969     if (tif->tif_flags&TIFF_SWAB)
2970         TIFFSwabShort( (uint16 *) (direntry_raw + 2) );
2971 
2972     if (!(tif->tif_flags&TIFF_BIGTIFF))
2973     {
2974         uint32 value;
2975 
2976         value = (uint32) entry_count;
2977         memcpy( direntry_raw + 4, &value, sizeof(uint32) );
2978         if (tif->tif_flags&TIFF_SWAB)
2979             TIFFSwabLong( (uint32 *) (direntry_raw + 4) );
2980 
2981         value = (uint32) entry_offset;
2982         memcpy( direntry_raw + 8, &value, sizeof(uint32) );
2983         if (tif->tif_flags&TIFF_SWAB)
2984             TIFFSwabLong( (uint32 *) (direntry_raw + 8) );
2985     }
2986     else
2987     {
2988         memcpy( direntry_raw + 4, &entry_count, sizeof(uint64) );
2989         if (tif->tif_flags&TIFF_SWAB)
2990             TIFFSwabLong8( (uint64 *) (direntry_raw + 4) );
2991 
2992         memcpy( direntry_raw + 12, &entry_offset, sizeof(uint64) );
2993         if (tif->tif_flags&TIFF_SWAB)
2994             TIFFSwabLong8( (uint64 *) (direntry_raw + 12) );
2995     }
2996 
2997 /* -------------------------------------------------------------------- */
2998 /*      Write the directory entry out to disk.                          */
2999 /* -------------------------------------------------------------------- */
3000     if (!SeekOK(tif, read_offset )) {
3001         TIFFErrorExt(tif->tif_clientdata, module,
3002                      "%s: Seek error accessing TIFF directory",
3003                      tif->tif_name);
3004         return 0;
3005     }
3006 
3007     if (!WriteOK(tif, direntry_raw,dirsize))
3008     {
3009         TIFFErrorExt(tif->tif_clientdata, module,
3010                      "%s: Can not write TIFF directory entry.",
3011                      tif->tif_name);
3012         return 0;
3013     }
3014 
3015     return 1;
3016 }
3017 /* vim: set ts=8 sts=8 sw=8 noet: */
3018 /*
3019  * Local Variables:
3020  * mode: c
3021  * c-basic-offset: 8
3022  * fill-column: 78
3023  * End:
3024  */
3025