1 /* $Id: tif_dir.c,v 1.113 2012-06-14 20:32:53 fwarmerdam 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 Tag Get & Set Routines.
31  * (and also some miscellaneous stuff)
32  */
33 #include "tiffiop.h"
34 
35 /*
36  * These are used in the backwards compatibility code...
37  */
38 #define DATATYPE_VOID		0       /* !untyped data */
39 #define DATATYPE_INT		1       /* !signed integer data */
40 #define DATATYPE_UINT		2       /* !unsigned integer data */
41 #define DATATYPE_IEEEFP		3       /* !IEEE floating point data */
42 
43 static void
setByteArray(void ** vpp,void * vp,size_t nmemb,size_t elem_size)44 setByteArray(void** vpp, void* vp, size_t nmemb, size_t elem_size)
45 {
46     if (*vpp)
47         _TIFFfree(*vpp), *vpp = 0;
48     if (vp) {
49         tmsize_t bytes = (tmsize_t)(nmemb * elem_size);
50         if (elem_size && bytes / elem_size == nmemb)
51             *vpp = (void*) _TIFFmalloc(bytes);
52         if (*vpp)
53             _TIFFmemcpy(*vpp, vp, bytes);
54     }
55 }
_TIFFsetByteArray(void ** vpp,void * vp,uint32 n)56 void _TIFFsetByteArray(void** vpp, void* vp, uint32 n)
57     { setByteArray(vpp, vp, n, 1); }
_TIFFsetString(char ** cpp,char * cp)58 void _TIFFsetString(char** cpp, char* cp)
59     { setByteArray((void**) cpp, (void*) cp, strlen(cp)+1, 1); }
_TIFFsetNString(char ** cpp,char * cp,uint32 n)60 void _TIFFsetNString(char** cpp, char* cp, uint32 n)
61     { setByteArray((void**) cpp, (void*) cp, n, 1); }
_TIFFsetShortArray(uint16 ** wpp,uint16 * wp,uint32 n)62 void _TIFFsetShortArray(uint16** wpp, uint16* wp, uint32 n)
63     { setByteArray((void**) wpp, (void*) wp, n, sizeof (uint16)); }
_TIFFsetLongArray(uint32 ** lpp,uint32 * lp,uint32 n)64 void _TIFFsetLongArray(uint32** lpp, uint32* lp, uint32 n)
65     { setByteArray((void**) lpp, (void*) lp, n, sizeof (uint32)); }
_TIFFsetLong8Array(uint64 ** lpp,uint64 * lp,uint32 n)66 void _TIFFsetLong8Array(uint64** lpp, uint64* lp, uint32 n)
67     { setByteArray((void**) lpp, (void*) lp, n, sizeof (uint64)); }
_TIFFsetFloatArray(float ** fpp,float * fp,uint32 n)68 void _TIFFsetFloatArray(float** fpp, float* fp, uint32 n)
69     { setByteArray((void**) fpp, (void*) fp, n, sizeof (float)); }
_TIFFsetDoubleArray(double ** dpp,double * dp,uint32 n)70 void _TIFFsetDoubleArray(double** dpp, double* dp, uint32 n)
71     { setByteArray((void**) dpp, (void*) dp, n, sizeof (double)); }
72 
73 static void
setDoubleArrayOneValue(double ** vpp,double value,size_t nmemb)74 setDoubleArrayOneValue(double** vpp, double value, size_t nmemb)
75 {
76     if (*vpp)
77         _TIFFfree(*vpp);
78     *vpp = _TIFFmalloc(nmemb*sizeof(double));
79     if (*vpp)
80     {
81         while (nmemb--)
82             ((double*)*vpp)[nmemb] = value;
83     }
84 }
85 
86 /*
87  * Install extra samples information.
88  */
89 static int
setExtraSamples(TIFFDirectory * td,va_list ap,uint32 * v)90 setExtraSamples(TIFFDirectory* td, va_list ap, uint32* v)
91 {
92 /* XXX: Unassociated alpha data == 999 is a known Corel Draw bug, see below */
93 #define EXTRASAMPLE_COREL_UNASSALPHA 999
94 
95     uint16* va;
96     uint32 i;
97 
98     *v = (uint16) va_arg(ap, uint16_vap);
99     if ((uint16) *v > td->td_samplesperpixel)
100         return 0;
101     va = va_arg(ap, uint16*);
102     if (*v > 0 && va == NULL)		/* typically missing param */
103         return 0;
104     for (i = 0; i < *v; i++) {
105         if (va[i] > EXTRASAMPLE_UNASSALPHA) {
106             /*
107              * XXX: Corel Draw is known to produce incorrect
108              * ExtraSamples tags which must be patched here if we
109              * want to be able to open some of the damaged TIFF
110              * files:
111              */
112             if (va[i] == EXTRASAMPLE_COREL_UNASSALPHA)
113                 va[i] = EXTRASAMPLE_UNASSALPHA;
114             else
115                 return 0;
116         }
117     }
118     td->td_extrasamples = (uint16) *v;
119     _TIFFsetShortArray(&td->td_sampleinfo, va, td->td_extrasamples);
120     return 1;
121 
122 #undef EXTRASAMPLE_COREL_UNASSALPHA
123 }
124 
125 /*
126  * Confirm we have "samplesperpixel" ink names separated by \0.  Returns
127  * zero if the ink names are not as expected.
128  */
129 static uint32
checkInkNamesString(TIFF * tif,uint32 slen,const char * s)130 checkInkNamesString(TIFF* tif, uint32 slen, const char* s)
131 {
132     TIFFDirectory* td = &tif->tif_dir;
133     uint16 i = td->td_samplesperpixel;
134 
135     if (slen > 0) {
136         const char* ep = s+slen;
137         const char* cp = s;
138         for (; i > 0; i--) {
139             for (; cp < ep && *cp != '\0'; cp++) {}
140             if (cp >= ep)
141                 goto bad;
142             cp++;				/* skip \0 */
143         }
144         return ((uint32)(cp-s));
145     }
146 bad:
147     TIFFErrorExt(tif->tif_clientdata, "TIFFSetField",
148         "%s: Invalid InkNames value; expecting %d names, found %d",
149         tif->tif_name,
150         td->td_samplesperpixel,
151         td->td_samplesperpixel-i);
152     return (0);
153 }
154 
155 static int
_TIFFVSetField(TIFF * tif,uint32 tag,va_list ap)156 _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
157 {
158     static const char module[] = "_TIFFVSetField";
159 
160     TIFFDirectory* td = &tif->tif_dir;
161     int status = 1;
162     uint32 v32, i, v;
163     char* s;
164     const TIFFField *fip = TIFFFindField(tif, tag, TIFF_ANY);
165     uint32 standard_tag = tag;
166 
167     /*
168      * We want to force the custom code to be used for custom
169      * fields even if the tag happens to match a well known
170      * one - important for reinterpreted handling of standard
171      * tag values in custom directories (ie. EXIF)
172      */
173     if (fip->field_bit == FIELD_CUSTOM) {
174         standard_tag = 0;
175     }
176 
177     switch (standard_tag) {
178     case TIFFTAG_SUBFILETYPE:
179         td->td_subfiletype = (uint32) va_arg(ap, uint32);
180         break;
181     case TIFFTAG_IMAGEWIDTH:
182         td->td_imagewidth = (uint32) va_arg(ap, uint32);
183         break;
184     case TIFFTAG_IMAGELENGTH:
185         td->td_imagelength = (uint32) va_arg(ap, uint32);
186         break;
187     case TIFFTAG_BITSPERSAMPLE:
188         td->td_bitspersample = (uint16) va_arg(ap, uint16_vap);
189         /*
190          * If the data require post-decoding processing to byte-swap
191          * samples, set it up here.  Note that since tags are required
192          * to be ordered, compression code can override this behaviour
193          * in the setup method if it wants to roll the post decoding
194          * work in with its normal work.
195          */
196         if (tif->tif_flags & TIFF_SWAB) {
197             if (td->td_bitspersample == 8)
198                 tif->tif_postdecode = _TIFFNoPostDecode;
199             else if (td->td_bitspersample == 16)
200                 tif->tif_postdecode = _TIFFSwab16BitData;
201             else if (td->td_bitspersample == 24)
202                 tif->tif_postdecode = _TIFFSwab24BitData;
203             else if (td->td_bitspersample == 32)
204                 tif->tif_postdecode = _TIFFSwab32BitData;
205             else if (td->td_bitspersample == 64)
206                 tif->tif_postdecode = _TIFFSwab64BitData;
207             else if (td->td_bitspersample == 128) /* two 64's */
208                 tif->tif_postdecode = _TIFFSwab64BitData;
209         }
210         break;
211     case TIFFTAG_COMPRESSION:
212         v = (uint16) va_arg(ap, uint16_vap);
213         /*
214          * If we're changing the compression scheme, the notify the
215          * previous module so that it can cleanup any state it's
216          * setup.
217          */
218         if (TIFFFieldSet(tif, FIELD_COMPRESSION)) {
219             if ((uint32)td->td_compression == v)
220                 break;
221             (*tif->tif_cleanup)(tif);
222             tif->tif_flags &= ~TIFF_CODERSETUP;
223         }
224         /*
225          * Setup new compression routine state.
226          */
227         if( (status = TIFFSetCompressionScheme(tif, v)) != 0 )
228             td->td_compression = (uint16) v;
229         else
230             status = 0;
231         break;
232     case TIFFTAG_PHOTOMETRIC:
233         td->td_photometric = (uint16) va_arg(ap, uint16_vap);
234         break;
235     case TIFFTAG_THRESHHOLDING:
236         td->td_threshholding = (uint16) va_arg(ap, uint16_vap);
237         break;
238     case TIFFTAG_FILLORDER:
239         v = (uint16) va_arg(ap, uint16_vap);
240         if (v != FILLORDER_LSB2MSB && v != FILLORDER_MSB2LSB)
241             goto badvalue;
242         td->td_fillorder = (uint16) v;
243         break;
244     case TIFFTAG_ORIENTATION:
245         v = (uint16) va_arg(ap, uint16_vap);
246         if (v < ORIENTATION_TOPLEFT || ORIENTATION_LEFTBOT < v)
247             goto badvalue;
248         else
249             td->td_orientation = (uint16) v;
250         break;
251     case TIFFTAG_SAMPLESPERPIXEL:
252         v = (uint16) va_arg(ap, uint16_vap);
253         if (v == 0)
254             goto badvalue;
255         td->td_samplesperpixel = (uint16) v;
256         break;
257     case TIFFTAG_ROWSPERSTRIP:
258         v32 = (uint32) va_arg(ap, uint32);
259         if (v32 == 0)
260             goto badvalue32;
261         td->td_rowsperstrip = v32;
262         if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS)) {
263             td->td_tilelength = v32;
264             td->td_tilewidth = td->td_imagewidth;
265         }
266         break;
267     case TIFFTAG_MINSAMPLEVALUE:
268         td->td_minsamplevalue = (uint16) va_arg(ap, uint16_vap);
269         break;
270     case TIFFTAG_MAXSAMPLEVALUE:
271         td->td_maxsamplevalue = (uint16) va_arg(ap, uint16_vap);
272         break;
273     case TIFFTAG_SMINSAMPLEVALUE:
274         if (tif->tif_flags & TIFF_PERSAMPLE)
275             _TIFFsetDoubleArray(&td->td_sminsamplevalue, va_arg(ap, double*), td->td_samplesperpixel);
276         else
277             setDoubleArrayOneValue(&td->td_sminsamplevalue, va_arg(ap, double), td->td_samplesperpixel);
278         break;
279     case TIFFTAG_SMAXSAMPLEVALUE:
280         if (tif->tif_flags & TIFF_PERSAMPLE)
281             _TIFFsetDoubleArray(&td->td_smaxsamplevalue, va_arg(ap, double*), td->td_samplesperpixel);
282         else
283             setDoubleArrayOneValue(&td->td_smaxsamplevalue, va_arg(ap, double), td->td_samplesperpixel);
284         break;
285     case TIFFTAG_XRESOLUTION:
286         td->td_xresolution = (float) va_arg(ap, double);
287         break;
288     case TIFFTAG_YRESOLUTION:
289         td->td_yresolution = (float) va_arg(ap, double);
290         break;
291     case TIFFTAG_PLANARCONFIG:
292         v = (uint16) va_arg(ap, uint16_vap);
293         if (v != PLANARCONFIG_CONTIG && v != PLANARCONFIG_SEPARATE)
294             goto badvalue;
295         td->td_planarconfig = (uint16) v;
296         break;
297     case TIFFTAG_XPOSITION:
298         td->td_xposition = (float) va_arg(ap, double);
299         break;
300     case TIFFTAG_YPOSITION:
301         td->td_yposition = (float) va_arg(ap, double);
302         break;
303     case TIFFTAG_RESOLUTIONUNIT:
304         v = (uint16) va_arg(ap, uint16_vap);
305         if (v < RESUNIT_NONE || RESUNIT_CENTIMETER < v)
306             goto badvalue;
307         td->td_resolutionunit = (uint16) v;
308         break;
309     case TIFFTAG_PAGENUMBER:
310         td->td_pagenumber[0] = (uint16) va_arg(ap, uint16_vap);
311         td->td_pagenumber[1] = (uint16) va_arg(ap, uint16_vap);
312         break;
313     case TIFFTAG_HALFTONEHINTS:
314         td->td_halftonehints[0] = (uint16) va_arg(ap, uint16_vap);
315         td->td_halftonehints[1] = (uint16) va_arg(ap, uint16_vap);
316         break;
317     case TIFFTAG_COLORMAP:
318         v32 = (uint32)(1L<<td->td_bitspersample);
319         _TIFFsetShortArray(&td->td_colormap[0], va_arg(ap, uint16*), v32);
320         _TIFFsetShortArray(&td->td_colormap[1], va_arg(ap, uint16*), v32);
321         _TIFFsetShortArray(&td->td_colormap[2], va_arg(ap, uint16*), v32);
322         break;
323     case TIFFTAG_EXTRASAMPLES:
324         if (!setExtraSamples(td, ap, &v))
325             goto badvalue;
326         break;
327     case TIFFTAG_MATTEING:
328         td->td_extrasamples =  (((uint16) va_arg(ap, uint16_vap)) != 0);
329         if (td->td_extrasamples) {
330             uint16 sv = EXTRASAMPLE_ASSOCALPHA;
331             _TIFFsetShortArray(&td->td_sampleinfo, &sv, 1);
332         }
333         break;
334     case TIFFTAG_TILEWIDTH:
335         v32 = (uint32) va_arg(ap, uint32);
336         if (v32 % 16) {
337             if (tif->tif_mode != O_RDONLY)
338                 goto badvalue32;
339             TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
340                 "Nonstandard tile width %d, convert file", v32);
341         }
342         td->td_tilewidth = v32;
343         tif->tif_flags |= TIFF_ISTILED;
344         break;
345     case TIFFTAG_TILELENGTH:
346         v32 = (uint32) va_arg(ap, uint32);
347         if (v32 % 16) {
348             if (tif->tif_mode != O_RDONLY)
349                 goto badvalue32;
350             TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
351                 "Nonstandard tile length %d, convert file", v32);
352         }
353         td->td_tilelength = v32;
354         tif->tif_flags |= TIFF_ISTILED;
355         break;
356     case TIFFTAG_TILEDEPTH:
357         v32 = (uint32) va_arg(ap, uint32);
358         if (v32 == 0)
359             goto badvalue32;
360         td->td_tiledepth = v32;
361         break;
362     case TIFFTAG_DATATYPE:
363         v = (uint16) va_arg(ap, uint16_vap);
364         switch (v) {
365         case DATATYPE_VOID:	v = SAMPLEFORMAT_VOID;	break;
366         case DATATYPE_INT:	v = SAMPLEFORMAT_INT;	break;
367         case DATATYPE_UINT:	v = SAMPLEFORMAT_UINT;	break;
368         case DATATYPE_IEEEFP:	v = SAMPLEFORMAT_IEEEFP;break;
369         default:		goto badvalue;
370         }
371         td->td_sampleformat = (uint16) v;
372         break;
373     case TIFFTAG_SAMPLEFORMAT:
374         v = (uint16) va_arg(ap, uint16_vap);
375         if (v < SAMPLEFORMAT_UINT || SAMPLEFORMAT_COMPLEXIEEEFP < v)
376             goto badvalue;
377         td->td_sampleformat = (uint16) v;
378 
379         /*  Try to fix up the SWAB function for complex data. */
380         if( td->td_sampleformat == SAMPLEFORMAT_COMPLEXINT
381             && td->td_bitspersample == 32
382             && tif->tif_postdecode == _TIFFSwab32BitData )
383             tif->tif_postdecode = _TIFFSwab16BitData;
384         else if( (td->td_sampleformat == SAMPLEFORMAT_COMPLEXINT
385               || td->td_sampleformat == SAMPLEFORMAT_COMPLEXIEEEFP)
386              && td->td_bitspersample == 64
387              && tif->tif_postdecode == _TIFFSwab64BitData )
388             tif->tif_postdecode = _TIFFSwab32BitData;
389         break;
390     case TIFFTAG_IMAGEDEPTH:
391         td->td_imagedepth = (uint32) va_arg(ap, uint32);
392         break;
393     case TIFFTAG_SUBIFD:
394         if ((tif->tif_flags & TIFF_INSUBIFD) == 0) {
395             td->td_nsubifd = (uint16) va_arg(ap, uint16_vap);
396             _TIFFsetLong8Array(&td->td_subifd, (uint64*) va_arg(ap, uint64*),
397                 (long) td->td_nsubifd);
398         } else {
399             TIFFErrorExt(tif->tif_clientdata, module,
400                      "%s: Sorry, cannot nest SubIFDs",
401                      tif->tif_name);
402             status = 0;
403         }
404         break;
405     case TIFFTAG_YCBCRPOSITIONING:
406         td->td_ycbcrpositioning = (uint16) va_arg(ap, uint16_vap);
407         break;
408     case TIFFTAG_YCBCRSUBSAMPLING:
409         td->td_ycbcrsubsampling[0] = (uint16) va_arg(ap, uint16_vap);
410         td->td_ycbcrsubsampling[1] = (uint16) va_arg(ap, uint16_vap);
411         break;
412     case TIFFTAG_TRANSFERFUNCTION:
413         v = (td->td_samplesperpixel - td->td_extrasamples) > 1 ? 3 : 1;
414         for (i = 0; i < v; i++)
415             _TIFFsetShortArray(&td->td_transferfunction[i],
416                 va_arg(ap, uint16*), 1L<<td->td_bitspersample);
417         break;
418     case TIFFTAG_REFERENCEBLACKWHITE:
419         /* XXX should check for null range */
420         _TIFFsetFloatArray(&td->td_refblackwhite, va_arg(ap, float*), 6);
421         break;
422     case TIFFTAG_INKNAMES:
423         v = (uint16) va_arg(ap, uint16_vap);
424         s = va_arg(ap, char*);
425         v = checkInkNamesString(tif, v, s);
426         status = v > 0;
427         if( v > 0 ) {
428             _TIFFsetNString(&td->td_inknames, s, v);
429             td->td_inknameslen = v;
430         }
431         break;
432     case TIFFTAG_PERSAMPLE:
433         v = (uint16) va_arg(ap, uint16_vap);
434         if( v == PERSAMPLE_MULTI )
435             tif->tif_flags |= TIFF_PERSAMPLE;
436         else
437             tif->tif_flags &= ~TIFF_PERSAMPLE;
438         break;
439     default: {
440         TIFFTagValue *tv;
441         int tv_size, iCustom;
442 
443         /*
444          * This can happen if multiple images are open with different
445          * codecs which have private tags.  The global tag information
446          * table may then have tags that are valid for one file but not
447          * the other. If the client tries to set a tag that is not valid
448          * for the image's codec then we'll arrive here.  This
449          * happens, for example, when tiffcp is used to convert between
450          * compression schemes and codec-specific tags are blindly copied.
451          */
452         if(fip == NULL || fip->field_bit != FIELD_CUSTOM) {
453             TIFFErrorExt(tif->tif_clientdata, module,
454                 "%s: Invalid %stag \"%s\" (not supported by codec)",
455                 tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "",
456                 fip ? fip->field_name : "Unknown");
457             status = 0;
458             break;
459         }
460 
461         /*
462          * Find the existing entry for this custom value.
463          */
464         tv = NULL;
465         for (iCustom = 0; iCustom < td->td_customValueCount; iCustom++) {
466             if (td->td_customValues[iCustom].info->field_tag == tag) {
467                 tv = td->td_customValues + iCustom;
468                 if (tv->value != NULL) {
469                     _TIFFfree(tv->value);
470                     tv->value = NULL;
471                 }
472                 break;
473             }
474         }
475 
476         /*
477          * Grow the custom list if the entry was not found.
478          */
479         if(tv == NULL) {
480             TIFFTagValue *new_customValues;
481 
482             td->td_customValueCount++;
483             new_customValues = (TIFFTagValue *)
484                 _TIFFrealloc(td->td_customValues,
485                 sizeof(TIFFTagValue) * td->td_customValueCount);
486             if (!new_customValues) {
487                 TIFFErrorExt(tif->tif_clientdata, module,
488                     "%s: Failed to allocate space for list of custom values",
489                     tif->tif_name);
490                 status = 0;
491                 goto end;
492             }
493 
494             td->td_customValues = new_customValues;
495 
496             tv = td->td_customValues + (td->td_customValueCount - 1);
497             tv->info = fip;
498             tv->value = NULL;
499             tv->count = 0;
500         }
501 
502         /*
503          * Set custom value ... save a copy of the custom tag value.
504          */
505         tv_size = _TIFFDataSize(fip->field_type);
506         if (tv_size == 0) {
507             status = 0;
508             TIFFErrorExt(tif->tif_clientdata, module,
509                 "%s: Bad field type %d for \"%s\"",
510                 tif->tif_name, fip->field_type,
511                 fip->field_name);
512             goto end;
513         }
514 
515         if (fip->field_type == TIFF_ASCII)
516         {
517             uint32 ma;
518             char* mb;
519             if (fip->field_passcount)
520             {
521                 assert(fip->field_writecount==TIFF_VARIABLE2);
522                 ma=(uint32)va_arg(ap,uint32);
523                 mb=(char*)va_arg(ap,char*);
524             }
525             else
526             {
527                 mb=(char*)va_arg(ap,char*);
528                 ma=(uint32)(strlen(mb)+1);
529             }
530             tv->count=ma;
531             setByteArray(&tv->value,mb,ma,1);
532         }
533         else
534         {
535             if (fip->field_passcount) {
536                 if (fip->field_writecount == TIFF_VARIABLE2)
537                     tv->count = (uint32) va_arg(ap, uint32);
538                 else
539                     tv->count = (int) va_arg(ap, int);
540             } else if (fip->field_writecount == TIFF_VARIABLE
541                || fip->field_writecount == TIFF_VARIABLE2)
542                 tv->count = 1;
543             else if (fip->field_writecount == TIFF_SPP)
544                 tv->count = td->td_samplesperpixel;
545             else
546                 tv->count = fip->field_writecount;
547 
548             if (tv->count == 0) {
549                 status = 0;
550                 TIFFErrorExt(tif->tif_clientdata, module,
551                          "%s: Null count for \"%s\" (type "
552                          "%d, writecount %d, passcount %d)",
553                          tif->tif_name,
554                          fip->field_name,
555                          fip->field_type,
556                          fip->field_writecount,
557                          fip->field_passcount);
558                 goto end;
559             }
560 
561             tv->value = _TIFFCheckMalloc(tif, tv->count, tv_size,
562                 "custom tag binary object");
563             if (!tv->value) {
564                 status = 0;
565                 goto end;
566             }
567 
568             if (fip->field_tag == TIFFTAG_DOTRANGE
569                 && strcmp(fip->field_name,"DotRange") == 0) {
570                 /* TODO: This is an evil exception and should not have been
571                    handled this way ... likely best if we move it into
572                    the directory structure with an explicit field in
573                    libtiff 4.1 and assign it a FIELD_ value */
574                 uint16 v[2];
575                 v[0] = (uint16)va_arg(ap, int);
576                 v[1] = (uint16)va_arg(ap, int);
577                 _TIFFmemcpy(tv->value, &v, 4);
578             }
579 
580             else if (fip->field_passcount
581                   || fip->field_writecount == TIFF_VARIABLE
582                   || fip->field_writecount == TIFF_VARIABLE2
583                   || fip->field_writecount == TIFF_SPP
584                   || tv->count > 1) {
585                 _TIFFmemcpy(tv->value, va_arg(ap, void *),
586                     tv->count * tv_size);
587             } else {
588                 char *val = (char *)tv->value;
589                 assert( tv->count == 1 );
590 
591                 switch (fip->field_type) {
592                 case TIFF_BYTE:
593                 case TIFF_UNDEFINED:
594                     {
595                         uint8 v = (uint8)va_arg(ap, int);
596                         _TIFFmemcpy(val, &v, tv_size);
597                     }
598                     break;
599                 case TIFF_SBYTE:
600                     {
601                         int8 v = (int8)va_arg(ap, int);
602                         _TIFFmemcpy(val, &v, tv_size);
603                     }
604                     break;
605                 case TIFF_SHORT:
606                     {
607                         uint16 v = (uint16)va_arg(ap, int);
608                         _TIFFmemcpy(val, &v, tv_size);
609                     }
610                     break;
611                 case TIFF_SSHORT:
612                     {
613                         int16 v = (int16)va_arg(ap, int);
614                         _TIFFmemcpy(val, &v, tv_size);
615                     }
616                     break;
617                 case TIFF_LONG:
618                 case TIFF_IFD:
619                     {
620                         uint32 v = va_arg(ap, uint32);
621                         _TIFFmemcpy(val, &v, tv_size);
622                     }
623                     break;
624                 case TIFF_SLONG:
625                     {
626                         int32 v = va_arg(ap, int32);
627                         _TIFFmemcpy(val, &v, tv_size);
628                     }
629                     break;
630                 case TIFF_LONG8:
631                 case TIFF_IFD8:
632                     {
633                         uint64 v = va_arg(ap, uint64);
634                         _TIFFmemcpy(val, &v, tv_size);
635                     }
636                     break;
637                 case TIFF_SLONG8:
638                     {
639                         int64 v = va_arg(ap, int64);
640                         _TIFFmemcpy(val, &v, tv_size);
641                     }
642                     break;
643                 case TIFF_RATIONAL:
644                 case TIFF_SRATIONAL:
645                 case TIFF_FLOAT:
646                     {
647                         float v = (float)va_arg(ap, double);
648                         _TIFFmemcpy(val, &v, tv_size);
649                     }
650                     break;
651                 case TIFF_DOUBLE:
652                     {
653                         double v = va_arg(ap, double);
654                         _TIFFmemcpy(val, &v, tv_size);
655                     }
656                     break;
657                 default:
658                     _TIFFmemset(val, 0, tv_size);
659                     status = 0;
660                     break;
661                 }
662             }
663         }
664     }
665     }
666     if (status) {
667         const TIFFField* fip=TIFFFieldWithTag(tif,tag);
668         if (fip)
669             TIFFSetFieldBit(tif, fip->field_bit);
670         tif->tif_flags |= TIFF_DIRTYDIRECT;
671     }
672 
673 end:
674     va_end(ap);
675     return (status);
676 badvalue:
677         {
678         const TIFFField* fip=TIFFFieldWithTag(tif,tag);
679         TIFFErrorExt(tif->tif_clientdata, module,
680              "%s: Bad value %u for \"%s\" tag",
681              tif->tif_name, v,
682              fip ? fip->field_name : "Unknown");
683         va_end(ap);
684         }
685     return (0);
686 badvalue32:
687         {
688         const TIFFField* fip=TIFFFieldWithTag(tif,tag);
689         TIFFErrorExt(tif->tif_clientdata, module,
690              "%s: Bad value %u for \"%s\" tag",
691              tif->tif_name, v32,
692              fip ? fip->field_name : "Unknown");
693         va_end(ap);
694         }
695     return (0);
696 }
697 
698 /*
699  * Return 1/0 according to whether or not
700  * it is permissible to set the tag's value.
701  * Note that we allow ImageLength to be changed
702  * so that we can append and extend to images.
703  * Any other tag may not be altered once writing
704  * has commenced, unless its value has no effect
705  * on the format of the data that is written.
706  */
707 static int
OkToChangeTag(TIFF * tif,uint32 tag)708 OkToChangeTag(TIFF* tif, uint32 tag)
709 {
710     const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY);
711     if (!fip) {			/* unknown tag */
712         TIFFErrorExt(tif->tif_clientdata, "TIFFSetField", "%s: Unknown %stag %u",
713             tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "", tag);
714         return (0);
715     }
716     if (tag != TIFFTAG_IMAGELENGTH && (tif->tif_flags & TIFF_BEENWRITING) &&
717         !fip->field_oktochange) {
718         /*
719          * Consult info table to see if tag can be changed
720          * after we've started writing.  We only allow changes
721          * to those tags that don't/shouldn't affect the
722          * compression and/or format of the data.
723          */
724         TIFFErrorExt(tif->tif_clientdata, "TIFFSetField",
725             "%s: Cannot modify tag \"%s\" while writing",
726             tif->tif_name, fip->field_name);
727         return (0);
728     }
729     return (1);
730 }
731 
732 /*
733  * Record the value of a field in the
734  * internal directory structure.  The
735  * field will be written to the file
736  * when/if the directory structure is
737  * updated.
738  */
739 int
TIFFSetField(TIFF * tif,uint32 tag,...)740 TIFFSetField(TIFF* tif, uint32 tag, ...)
741 {
742     va_list ap;
743     int status;
744 
745     va_start(ap, tag);
746     status = TIFFVSetField(tif, tag, ap);
747     va_end(ap);
748     return (status);
749 }
750 
751 /*
752  * Clear the contents of the field in the internal structure.
753  */
754 int
TIFFUnsetField(TIFF * tif,uint32 tag)755 TIFFUnsetField(TIFF* tif, uint32 tag)
756 {
757     const TIFFField *fip =  TIFFFieldWithTag(tif, tag);
758     TIFFDirectory* td = &tif->tif_dir;
759 
760     if( !fip )
761         return 0;
762 
763     if( fip->field_bit != FIELD_CUSTOM )
764         TIFFClrFieldBit(tif, fip->field_bit);
765     else
766     {
767         TIFFTagValue *tv = NULL;
768         int i;
769 
770         for (i = 0; i < td->td_customValueCount; i++) {
771 
772             tv = td->td_customValues + i;
773             if( tv->info->field_tag == tag )
774                 break;
775         }
776 
777         if( i < td->td_customValueCount )
778         {
779             _TIFFfree(tv->value);
780             for( ; i < td->td_customValueCount-1; i++) {
781                 td->td_customValues[i] = td->td_customValues[i+1];
782             }
783             td->td_customValueCount--;
784         }
785     }
786 
787     tif->tif_flags |= TIFF_DIRTYDIRECT;
788 
789     return (1);
790 }
791 
792 /*
793  * Like TIFFSetField, but taking a varargs
794  * parameter list.  This routine is useful
795  * for building higher-level interfaces on
796  * top of the library.
797  */
798 int
TIFFVSetField(TIFF * tif,uint32 tag,va_list ap)799 TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
800 {
801     return OkToChangeTag(tif, tag) ?
802         (*tif->tif_tagmethods.vsetfield)(tif, tag, ap) : 0;
803 }
804 
805 static int
_TIFFVGetField(TIFF * tif,uint32 tag,va_list ap)806 _TIFFVGetField(TIFF* tif, uint32 tag, va_list ap)
807 {
808     TIFFDirectory* td = &tif->tif_dir;
809     int ret_val = 1;
810     uint32 standard_tag = tag;
811     const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY);
812 
813     /*
814      * We want to force the custom code to be used for custom
815      * fields even if the tag happens to match a well known
816      * one - important for reinterpreted handling of standard
817      * tag values in custom directories (ie. EXIF)
818      */
819     if (fip->field_bit == FIELD_CUSTOM) {
820         standard_tag = 0;
821     }
822 
823     switch (standard_tag) {
824         case TIFFTAG_SUBFILETYPE:
825             *va_arg(ap, uint32*) = td->td_subfiletype;
826             break;
827         case TIFFTAG_IMAGEWIDTH:
828             *va_arg(ap, uint32*) = td->td_imagewidth;
829             break;
830         case TIFFTAG_IMAGELENGTH:
831             *va_arg(ap, uint32*) = td->td_imagelength;
832             break;
833         case TIFFTAG_BITSPERSAMPLE:
834             *va_arg(ap, uint16*) = td->td_bitspersample;
835             break;
836         case TIFFTAG_COMPRESSION:
837             *va_arg(ap, uint16*) = td->td_compression;
838             break;
839         case TIFFTAG_PHOTOMETRIC:
840             *va_arg(ap, uint16*) = td->td_photometric;
841             break;
842         case TIFFTAG_THRESHHOLDING:
843             *va_arg(ap, uint16*) = td->td_threshholding;
844             break;
845         case TIFFTAG_FILLORDER:
846             *va_arg(ap, uint16*) = td->td_fillorder;
847             break;
848         case TIFFTAG_ORIENTATION:
849             *va_arg(ap, uint16*) = td->td_orientation;
850             break;
851         case TIFFTAG_SAMPLESPERPIXEL:
852             *va_arg(ap, uint16*) = td->td_samplesperpixel;
853             break;
854         case TIFFTAG_ROWSPERSTRIP:
855             *va_arg(ap, uint32*) = td->td_rowsperstrip;
856             break;
857         case TIFFTAG_MINSAMPLEVALUE:
858             *va_arg(ap, uint16*) = td->td_minsamplevalue;
859             break;
860         case TIFFTAG_MAXSAMPLEVALUE:
861             *va_arg(ap, uint16*) = td->td_maxsamplevalue;
862             break;
863         case TIFFTAG_SMINSAMPLEVALUE:
864             if (tif->tif_flags & TIFF_PERSAMPLE)
865                 *va_arg(ap, double**) = td->td_sminsamplevalue;
866             else
867             {
868                 /* libtiff historially treats this as a single value. */
869                 uint16 i;
870                 double v = td->td_sminsamplevalue[0];
871                 for (i=1; i < td->td_samplesperpixel; ++i)
872                     if( td->td_sminsamplevalue[i] < v )
873                         v = td->td_sminsamplevalue[i];
874                 *va_arg(ap, double*) = v;
875             }
876             break;
877         case TIFFTAG_SMAXSAMPLEVALUE:
878             if (tif->tif_flags & TIFF_PERSAMPLE)
879                 *va_arg(ap, double**) = td->td_smaxsamplevalue;
880             else
881             {
882                 /* libtiff historially treats this as a single value. */
883                 uint16 i;
884                 double v = td->td_smaxsamplevalue[0];
885                 for (i=1; i < td->td_samplesperpixel; ++i)
886                     if( td->td_smaxsamplevalue[i] > v )
887                         v = td->td_smaxsamplevalue[i];
888                 *va_arg(ap, double*) = v;
889             }
890             break;
891         case TIFFTAG_XRESOLUTION:
892             *va_arg(ap, float*) = td->td_xresolution;
893             break;
894         case TIFFTAG_YRESOLUTION:
895             *va_arg(ap, float*) = td->td_yresolution;
896             break;
897         case TIFFTAG_PLANARCONFIG:
898             *va_arg(ap, uint16*) = td->td_planarconfig;
899             break;
900         case TIFFTAG_XPOSITION:
901             *va_arg(ap, float*) = td->td_xposition;
902             break;
903         case TIFFTAG_YPOSITION:
904             *va_arg(ap, float*) = td->td_yposition;
905             break;
906         case TIFFTAG_RESOLUTIONUNIT:
907             *va_arg(ap, uint16*) = td->td_resolutionunit;
908             break;
909         case TIFFTAG_PAGENUMBER:
910             *va_arg(ap, uint16*) = td->td_pagenumber[0];
911             *va_arg(ap, uint16*) = td->td_pagenumber[1];
912             break;
913         case TIFFTAG_HALFTONEHINTS:
914             *va_arg(ap, uint16*) = td->td_halftonehints[0];
915             *va_arg(ap, uint16*) = td->td_halftonehints[1];
916             break;
917         case TIFFTAG_COLORMAP:
918             *va_arg(ap, uint16**) = td->td_colormap[0];
919             *va_arg(ap, uint16**) = td->td_colormap[1];
920             *va_arg(ap, uint16**) = td->td_colormap[2];
921             break;
922         case TIFFTAG_STRIPOFFSETS:
923         case TIFFTAG_TILEOFFSETS:
924             _TIFFFillStriles( tif );
925             *va_arg(ap, uint64**) = td->td_stripoffset;
926             break;
927         case TIFFTAG_STRIPBYTECOUNTS:
928         case TIFFTAG_TILEBYTECOUNTS:
929             _TIFFFillStriles( tif );
930             *va_arg(ap, uint64**) = td->td_stripbytecount;
931             break;
932         case TIFFTAG_MATTEING:
933             *va_arg(ap, uint16*) =
934                 (td->td_extrasamples == 1 &&
935                 td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA);
936             break;
937         case TIFFTAG_EXTRASAMPLES:
938             *va_arg(ap, uint16*) = td->td_extrasamples;
939             *va_arg(ap, uint16**) = td->td_sampleinfo;
940             break;
941         case TIFFTAG_TILEWIDTH:
942             *va_arg(ap, uint32*) = td->td_tilewidth;
943             break;
944         case TIFFTAG_TILELENGTH:
945             *va_arg(ap, uint32*) = td->td_tilelength;
946             break;
947         case TIFFTAG_TILEDEPTH:
948             *va_arg(ap, uint32*) = td->td_tiledepth;
949             break;
950         case TIFFTAG_DATATYPE:
951             switch (td->td_sampleformat) {
952                 case SAMPLEFORMAT_UINT:
953                     *va_arg(ap, uint16*) = DATATYPE_UINT;
954                     break;
955                 case SAMPLEFORMAT_INT:
956                     *va_arg(ap, uint16*) = DATATYPE_INT;
957                     break;
958                 case SAMPLEFORMAT_IEEEFP:
959                     *va_arg(ap, uint16*) = DATATYPE_IEEEFP;
960                     break;
961                 case SAMPLEFORMAT_VOID:
962                     *va_arg(ap, uint16*) = DATATYPE_VOID;
963                     break;
964             }
965             break;
966         case TIFFTAG_SAMPLEFORMAT:
967             *va_arg(ap, uint16*) = td->td_sampleformat;
968             break;
969         case TIFFTAG_IMAGEDEPTH:
970             *va_arg(ap, uint32*) = td->td_imagedepth;
971             break;
972         case TIFFTAG_SUBIFD:
973             *va_arg(ap, uint16*) = td->td_nsubifd;
974             *va_arg(ap, uint64**) = td->td_subifd;
975             break;
976         case TIFFTAG_YCBCRPOSITIONING:
977             *va_arg(ap, uint16*) = td->td_ycbcrpositioning;
978             break;
979         case TIFFTAG_YCBCRSUBSAMPLING:
980             *va_arg(ap, uint16*) = td->td_ycbcrsubsampling[0];
981             *va_arg(ap, uint16*) = td->td_ycbcrsubsampling[1];
982             break;
983         case TIFFTAG_TRANSFERFUNCTION:
984             *va_arg(ap, uint16**) = td->td_transferfunction[0];
985             if (td->td_samplesperpixel - td->td_extrasamples > 1) {
986                 *va_arg(ap, uint16**) = td->td_transferfunction[1];
987                 *va_arg(ap, uint16**) = td->td_transferfunction[2];
988             }
989             break;
990         case TIFFTAG_REFERENCEBLACKWHITE:
991             *va_arg(ap, float**) = td->td_refblackwhite;
992             break;
993         case TIFFTAG_INKNAMES:
994             *va_arg(ap, char**) = td->td_inknames;
995             break;
996         default:
997             {
998                 int i;
999 
1000                 /*
1001                  * This can happen if multiple images are open
1002                  * with different codecs which have private
1003                  * tags.  The global tag information table may
1004                  * then have tags that are valid for one file
1005                  * but not the other. If the client tries to
1006                  * get a tag that is not valid for the image's
1007                  * codec then we'll arrive here.
1008                  */
1009                 if( fip == NULL || fip->field_bit != FIELD_CUSTOM )
1010                 {
1011                     TIFFErrorExt(tif->tif_clientdata, "_TIFFVGetField",
1012                         "%s: Invalid %stag \"%s\" "
1013                         "(not supported by codec)",
1014                         tif->tif_name,
1015                         isPseudoTag(tag) ? "pseudo-" : "",
1016                         fip ? fip->field_name : "Unknown");
1017                     ret_val = 0;
1018                     break;
1019                 }
1020 
1021                 /*
1022                  * Do we have a custom value?
1023                  */
1024                 ret_val = 0;
1025                 for (i = 0; i < td->td_customValueCount; i++) {
1026                     TIFFTagValue *tv = td->td_customValues + i;
1027 
1028                     if (tv->info->field_tag != tag)
1029                         continue;
1030 
1031                     if (fip->field_passcount) {
1032                         if (fip->field_readcount == TIFF_VARIABLE2)
1033                             *va_arg(ap, uint32*) = (uint32)tv->count;
1034                         else  /* Assume TIFF_VARIABLE */
1035                             *va_arg(ap, uint16*) = (uint16)tv->count;
1036                         *va_arg(ap, void **) = tv->value;
1037                         ret_val = 1;
1038                     } else if (fip->field_tag == TIFFTAG_DOTRANGE
1039                            && strcmp(fip->field_name,"DotRange") == 0) {
1040                         /* TODO: This is an evil exception and should not have been
1041                            handled this way ... likely best if we move it into
1042                            the directory structure with an explicit field in
1043                            libtiff 4.1 and assign it a FIELD_ value */
1044                         *va_arg(ap, uint16*) = ((uint16 *)tv->value)[0];
1045                         *va_arg(ap, uint16*) = ((uint16 *)tv->value)[1];
1046                         ret_val = 1;
1047                     } else {
1048                         if (fip->field_type == TIFF_ASCII
1049                             || fip->field_readcount == TIFF_VARIABLE
1050                             || fip->field_readcount == TIFF_VARIABLE2
1051                             || fip->field_readcount == TIFF_SPP
1052                             || tv->count > 1) {
1053                             *va_arg(ap, void **) = tv->value;
1054                             ret_val = 1;
1055                         } else {
1056                             char *val = (char *)tv->value;
1057                             assert( tv->count == 1 );
1058                             switch (fip->field_type) {
1059                             case TIFF_BYTE:
1060                             case TIFF_UNDEFINED:
1061                                 *va_arg(ap, uint8*) =
1062                                     *(uint8 *)val;
1063                                 ret_val = 1;
1064                                 break;
1065                             case TIFF_SBYTE:
1066                                 *va_arg(ap, int8*) =
1067                                     *(int8 *)val;
1068                                 ret_val = 1;
1069                                 break;
1070                             case TIFF_SHORT:
1071                                 *va_arg(ap, uint16*) =
1072                                     *(uint16 *)val;
1073                                 ret_val = 1;
1074                                 break;
1075                             case TIFF_SSHORT:
1076                                 *va_arg(ap, int16*) =
1077                                     *(int16 *)val;
1078                                 ret_val = 1;
1079                                 break;
1080                             case TIFF_LONG:
1081                             case TIFF_IFD:
1082                                 *va_arg(ap, uint32*) =
1083                                     *(uint32 *)val;
1084                                 ret_val = 1;
1085                                 break;
1086                             case TIFF_SLONG:
1087                                 *va_arg(ap, int32*) =
1088                                     *(int32 *)val;
1089                                 ret_val = 1;
1090                                 break;
1091                             case TIFF_LONG8:
1092                             case TIFF_IFD8:
1093                                 *va_arg(ap, uint64*) =
1094                                     *(uint64 *)val;
1095                                 ret_val = 1;
1096                                 break;
1097                             case TIFF_SLONG8:
1098                                 *va_arg(ap, int64*) =
1099                                     *(int64 *)val;
1100                                 ret_val = 1;
1101                                 break;
1102                             case TIFF_RATIONAL:
1103                             case TIFF_SRATIONAL:
1104                             case TIFF_FLOAT:
1105                                 *va_arg(ap, float*) =
1106                                     *(float *)val;
1107                                 ret_val = 1;
1108                                 break;
1109                             case TIFF_DOUBLE:
1110                                 *va_arg(ap, double*) =
1111                                     *(double *)val;
1112                                 ret_val = 1;
1113                                 break;
1114                             default:
1115                                 ret_val = 0;
1116                                 break;
1117                             }
1118                         }
1119                     }
1120                     break;
1121                 }
1122             }
1123     }
1124     return(ret_val);
1125 }
1126 
1127 /*
1128  * Return the value of a field in the
1129  * internal directory structure.
1130  */
1131 int
TIFFGetField(TIFF * tif,uint32 tag,...)1132 TIFFGetField(TIFF* tif, uint32 tag, ...)
1133 {
1134     int status;
1135     va_list ap;
1136 
1137     va_start(ap, tag);
1138     status = TIFFVGetField(tif, tag, ap);
1139     va_end(ap);
1140     return (status);
1141 }
1142 
1143 /*
1144  * Like TIFFGetField, but taking a varargs
1145  * parameter list.  This routine is useful
1146  * for building higher-level interfaces on
1147  * top of the library.
1148  */
1149 int
TIFFVGetField(TIFF * tif,uint32 tag,va_list ap)1150 TIFFVGetField(TIFF* tif, uint32 tag, va_list ap)
1151 {
1152     const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY);
1153     return (fip && (isPseudoTag(tag) || TIFFFieldSet(tif, fip->field_bit)) ?
1154         (*tif->tif_tagmethods.vgetfield)(tif, tag, ap) : 0);
1155 }
1156 
1157 #define	CleanupField(member) {		\
1158     if (td->member) {			\
1159     _TIFFfree(td->member);		\
1160     td->member = 0;			\
1161     }					\
1162 }
1163 
1164 /*
1165  * Release storage associated with a directory.
1166  */
1167 void
TIFFFreeDirectory(TIFF * tif)1168 TIFFFreeDirectory(TIFF* tif)
1169 {
1170     TIFFDirectory *td = &tif->tif_dir;
1171     int            i;
1172 
1173     _TIFFmemset(td->td_fieldsset, 0, FIELD_SETLONGS);
1174     CleanupField(td_sminsamplevalue);
1175     CleanupField(td_smaxsamplevalue);
1176     CleanupField(td_colormap[0]);
1177     CleanupField(td_colormap[1]);
1178     CleanupField(td_colormap[2]);
1179     CleanupField(td_sampleinfo);
1180     CleanupField(td_subifd);
1181     CleanupField(td_inknames);
1182     CleanupField(td_refblackwhite);
1183     CleanupField(td_transferfunction[0]);
1184     CleanupField(td_transferfunction[1]);
1185     CleanupField(td_transferfunction[2]);
1186     CleanupField(td_stripoffset);
1187     CleanupField(td_stripbytecount);
1188     TIFFClrFieldBit(tif, FIELD_YCBCRSUBSAMPLING);
1189     TIFFClrFieldBit(tif, FIELD_YCBCRPOSITIONING);
1190 
1191     /* Cleanup custom tag values */
1192     for( i = 0; i < td->td_customValueCount; i++ ) {
1193         if (td->td_customValues[i].value)
1194             _TIFFfree(td->td_customValues[i].value);
1195     }
1196 
1197     td->td_customValueCount = 0;
1198     CleanupField(td_customValues);
1199 
1200 #if defined(DEFER_STRILE_LOAD)
1201         _TIFFmemset( &(td->td_stripoffset_entry), 0, sizeof(TIFFDirEntry));
1202         _TIFFmemset( &(td->td_stripbytecount_entry), 0, sizeof(TIFFDirEntry));
1203 #endif
1204 }
1205 #undef CleanupField
1206 
1207 /*
1208  * Client Tag extension support (from Niles Ritter).
1209  */
1210 static TIFFExtendProc _TIFFextender = (TIFFExtendProc) NULL;
1211 
1212 TIFFExtendProc
TIFFSetTagExtender(TIFFExtendProc extender)1213 TIFFSetTagExtender(TIFFExtendProc extender)
1214 {
1215     TIFFExtendProc prev = _TIFFextender;
1216     _TIFFextender = extender;
1217     return (prev);
1218 }
1219 
1220 /*
1221  * Setup for a new directory.  Should we automatically call
1222  * TIFFWriteDirectory() if the current one is dirty?
1223  *
1224  * The newly created directory will not exist on the file till
1225  * TIFFWriteDirectory(), TIFFFlush() or TIFFClose() is called.
1226  */
1227 int
TIFFCreateDirectory(TIFF * tif)1228 TIFFCreateDirectory(TIFF* tif)
1229 {
1230     TIFFDefaultDirectory(tif);
1231     tif->tif_diroff = 0;
1232     tif->tif_nextdiroff = 0;
1233     tif->tif_curoff = 0;
1234     tif->tif_row = (uint32) -1;
1235     tif->tif_curstrip = (uint32) -1;
1236 
1237     return 0;
1238 }
1239 
1240 int
TIFFCreateCustomDirectory(TIFF * tif,const TIFFFieldArray * infoarray)1241 TIFFCreateCustomDirectory(TIFF* tif, const TIFFFieldArray* infoarray)
1242 {
1243     TIFFDefaultDirectory(tif);
1244 
1245     /*
1246      * Reset the field definitions to match the application provided list.
1247      * Hopefully TIFFDefaultDirectory() won't have done anything irreversable
1248      * based on it's assumption this is an image directory.
1249      */
1250     _TIFFSetupFields(tif, infoarray);
1251 
1252     tif->tif_diroff = 0;
1253     tif->tif_nextdiroff = 0;
1254     tif->tif_curoff = 0;
1255     tif->tif_row = (uint32) -1;
1256     tif->tif_curstrip = (uint32) -1;
1257 
1258     return 0;
1259 }
1260 
1261 int
TIFFCreateEXIFDirectory(TIFF * tif)1262 TIFFCreateEXIFDirectory(TIFF* tif)
1263 {
1264     const TIFFFieldArray* exifFieldArray;
1265     exifFieldArray = _TIFFGetExifFields();
1266     return TIFFCreateCustomDirectory(tif, exifFieldArray);
1267 }
1268 
1269 /*
1270  * Setup a default directory structure.
1271  */
1272 int
TIFFDefaultDirectory(TIFF * tif)1273 TIFFDefaultDirectory(TIFF* tif)
1274 {
1275     register TIFFDirectory* td = &tif->tif_dir;
1276     const TIFFFieldArray* tiffFieldArray;
1277 
1278     tiffFieldArray = _TIFFGetFields();
1279     _TIFFSetupFields(tif, tiffFieldArray);
1280 
1281     _TIFFmemset(td, 0, sizeof (*td));
1282     td->td_fillorder = FILLORDER_MSB2LSB;
1283     td->td_bitspersample = 1;
1284     td->td_threshholding = THRESHHOLD_BILEVEL;
1285     td->td_orientation = ORIENTATION_TOPLEFT;
1286     td->td_samplesperpixel = 1;
1287     td->td_rowsperstrip = (uint32) -1;
1288     td->td_tilewidth = 0;
1289     td->td_tilelength = 0;
1290     td->td_tiledepth = 1;
1291     td->td_stripbytecountsorted = 1; /* Our own arrays always sorted. */
1292     td->td_resolutionunit = RESUNIT_INCH;
1293     td->td_sampleformat = SAMPLEFORMAT_UINT;
1294     td->td_imagedepth = 1;
1295     td->td_ycbcrsubsampling[0] = 2;
1296     td->td_ycbcrsubsampling[1] = 2;
1297     td->td_ycbcrpositioning = YCBCRPOSITION_CENTERED;
1298     tif->tif_postdecode = _TIFFNoPostDecode;
1299     tif->tif_foundfield = NULL;
1300     tif->tif_tagmethods.vsetfield = _TIFFVSetField;
1301     tif->tif_tagmethods.vgetfield = _TIFFVGetField;
1302     tif->tif_tagmethods.printdir = NULL;
1303     /*
1304      *  Give client code a chance to install their own
1305      *  tag extensions & methods, prior to compression overloads.
1306      */
1307     if (_TIFFextender)
1308         (*_TIFFextender)(tif);
1309     (void) TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
1310     /*
1311      * NB: The directory is marked dirty as a result of setting
1312      * up the default compression scheme.  However, this really
1313      * isn't correct -- we want TIFF_DIRTYDIRECT to be set only
1314      * if the user does something.  We could just do the setup
1315      * by hand, but it seems better to use the normal mechanism
1316      * (i.e. TIFFSetField).
1317      */
1318     tif->tif_flags &= ~TIFF_DIRTYDIRECT;
1319 
1320     /*
1321      * As per http://bugzilla.remotesensing.org/show_bug.cgi?id=19
1322      * we clear the ISTILED flag when setting up a new directory.
1323      * Should we also be clearing stuff like INSUBIFD?
1324      */
1325     tif->tif_flags &= ~TIFF_ISTILED;
1326 
1327     return (1);
1328 }
1329 
1330 static int
TIFFAdvanceDirectory(TIFF * tif,uint64 * nextdir,uint64 * off)1331 TIFFAdvanceDirectory(TIFF* tif, uint64* nextdir, uint64* off)
1332 {
1333     static const char module[] = "TIFFAdvanceDirectory";
1334     if (isMapped(tif))
1335     {
1336         uint64 poff=*nextdir;
1337         if (!(tif->tif_flags&TIFF_BIGTIFF))
1338         {
1339             tmsize_t poffa,poffb,poffc,poffd;
1340             uint16 dircount;
1341             uint32 nextdir32;
1342             poffa=(tmsize_t)poff;
1343             poffb=poffa+sizeof(uint16);
1344             if (((uint64)poffa!=poff)||(poffb<poffa)||(poffb<(tmsize_t)sizeof(uint16))||(poffb>tif->tif_size))
1345             {
1346                 TIFFErrorExt(tif->tif_clientdata,module,"Error fetching directory count");
1347                 return(0);
1348             }
1349             _TIFFmemcpy(&dircount,tif->tif_base+poffa,sizeof(uint16));
1350             if (tif->tif_flags&TIFF_SWAB)
1351                 TIFFSwabShort(&dircount);
1352             poffc=poffb+dircount*12;
1353             poffd=poffc+sizeof(uint32);
1354             if ((poffc<poffb)||(poffc<dircount*12)||(poffd<poffc)||(poffd<(tmsize_t)sizeof(uint32))||(poffd>tif->tif_size))
1355             {
1356                 TIFFErrorExt(tif->tif_clientdata,module,"Error fetching directory link");
1357                 return(0);
1358             }
1359             if (off!=NULL)
1360                 *off=(uint64)poffc;
1361             _TIFFmemcpy(&nextdir32,tif->tif_base+poffc,sizeof(uint32));
1362             if (tif->tif_flags&TIFF_SWAB)
1363                 TIFFSwabLong(&nextdir32);
1364             *nextdir=nextdir32;
1365         }
1366         else
1367         {
1368             tmsize_t poffa,poffb,poffc,poffd;
1369             uint64 dircount64;
1370             uint16 dircount16;
1371             poffa=(tmsize_t)poff;
1372             poffb=poffa+sizeof(uint64);
1373             if (((uint64)poffa!=poff)||(poffb<poffa)||(poffb<(tmsize_t)sizeof(uint64))||(poffb>tif->tif_size))
1374             {
1375                 TIFFErrorExt(tif->tif_clientdata,module,"Error fetching directory count");
1376                 return(0);
1377             }
1378             _TIFFmemcpy(&dircount64,tif->tif_base+poffa,sizeof(uint64));
1379             if (tif->tif_flags&TIFF_SWAB)
1380                 TIFFSwabLong8(&dircount64);
1381             if (dircount64>0xFFFF)
1382             {
1383                 TIFFErrorExt(tif->tif_clientdata,module,"Sanity check on directory count failed");
1384                 return(0);
1385             }
1386             dircount16=(uint16)dircount64;
1387             poffc=poffb+dircount16*20;
1388             poffd=poffc+sizeof(uint64);
1389             if ((poffc<poffb)||(poffc<dircount16*20)||(poffd<poffc)||(poffd<(tmsize_t)sizeof(uint64))||(poffd>tif->tif_size))
1390             {
1391                 TIFFErrorExt(tif->tif_clientdata,module,"Error fetching directory link");
1392                 return(0);
1393             }
1394             if (off!=NULL)
1395                 *off=(uint64)poffc;
1396             _TIFFmemcpy(nextdir,tif->tif_base+poffc,sizeof(uint64));
1397             if (tif->tif_flags&TIFF_SWAB)
1398                 TIFFSwabLong8(nextdir);
1399         }
1400         return(1);
1401     }
1402     else
1403     {
1404         if (!(tif->tif_flags&TIFF_BIGTIFF))
1405         {
1406             uint16 dircount;
1407             uint32 nextdir32;
1408             if (!SeekOK(tif, *nextdir) ||
1409                 !ReadOK(tif, &dircount, sizeof (uint16))) {
1410                 TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory count",
1411                     tif->tif_name);
1412                 return (0);
1413             }
1414             if (tif->tif_flags & TIFF_SWAB)
1415                 TIFFSwabShort(&dircount);
1416             if (off != NULL)
1417                 *off = TIFFSeekFile(tif,
1418                     dircount*12, SEEK_CUR);
1419             else
1420                 (void) TIFFSeekFile(tif,
1421                     dircount*12, SEEK_CUR);
1422             if (!ReadOK(tif, &nextdir32, sizeof (uint32))) {
1423                 TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory link",
1424                     tif->tif_name);
1425                 return (0);
1426             }
1427             if (tif->tif_flags & TIFF_SWAB)
1428                 TIFFSwabLong(&nextdir32);
1429             *nextdir=nextdir32;
1430         }
1431         else
1432         {
1433             uint64 dircount64;
1434             uint16 dircount16;
1435             if (!SeekOK(tif, *nextdir) ||
1436                 !ReadOK(tif, &dircount64, sizeof (uint64))) {
1437                 TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory count",
1438                     tif->tif_name);
1439                 return (0);
1440             }
1441             if (tif->tif_flags & TIFF_SWAB)
1442                 TIFFSwabLong8(&dircount64);
1443             if (dircount64>0xFFFF)
1444             {
1445                 TIFFErrorExt(tif->tif_clientdata, module, "Error fetching directory count");
1446                 return(0);
1447             }
1448             dircount16 = (uint16)dircount64;
1449             if (off != NULL)
1450                 *off = TIFFSeekFile(tif,
1451                     dircount16*20, SEEK_CUR);
1452             else
1453                 (void) TIFFSeekFile(tif,
1454                     dircount16*20, SEEK_CUR);
1455             if (!ReadOK(tif, nextdir, sizeof (uint64))) {
1456                 TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory link",
1457                     tif->tif_name);
1458                 return (0);
1459             }
1460             if (tif->tif_flags & TIFF_SWAB)
1461                 TIFFSwabLong8(nextdir);
1462         }
1463         return (1);
1464     }
1465 }
1466 
1467 /*
1468  * Count the number of directories in a file.
1469  */
1470 uint16
TIFFNumberOfDirectories(TIFF * tif)1471 TIFFNumberOfDirectories(TIFF* tif)
1472 {
1473     uint64 nextdir;
1474     uint16 n;
1475     if (!(tif->tif_flags&TIFF_BIGTIFF))
1476         nextdir = tif->tif_header.classic.tiff_diroff;
1477     else
1478         nextdir = tif->tif_header.big.tiff_diroff;
1479     n = 0;
1480     while (nextdir != 0 && TIFFAdvanceDirectory(tif, &nextdir, NULL))
1481         n++;
1482     return (n);
1483 }
1484 
1485 /*
1486  * Set the n-th directory as the current directory.
1487  * NB: Directories are numbered starting at 0.
1488  */
1489 int
TIFFSetDirectory(TIFF * tif,uint16 dirn)1490 TIFFSetDirectory(TIFF* tif, uint16 dirn)
1491 {
1492     uint64 nextdir;
1493     uint16 n;
1494 
1495     if (!(tif->tif_flags&TIFF_BIGTIFF))
1496         nextdir = tif->tif_header.classic.tiff_diroff;
1497     else
1498         nextdir = tif->tif_header.big.tiff_diroff;
1499     for (n = dirn; n > 0 && nextdir != 0; n--)
1500         if (!TIFFAdvanceDirectory(tif, &nextdir, NULL))
1501             return (0);
1502     tif->tif_nextdiroff = nextdir;
1503     /*
1504      * Set curdir to the actual directory index.  The
1505      * -1 is because TIFFReadDirectory will increment
1506      * tif_curdir after successfully reading the directory.
1507      */
1508     tif->tif_curdir = (dirn - n) - 1;
1509     /*
1510      * Reset tif_dirnumber counter and start new list of seen directories.
1511      * We need this to prevent IFD loops.
1512      */
1513     tif->tif_dirnumber = 0;
1514     return (TIFFReadDirectory(tif));
1515 }
1516 
1517 /*
1518  * Set the current directory to be the directory
1519  * located at the specified file offset.  This interface
1520  * is used mainly to access directories linked with
1521  * the SubIFD tag (e.g. thumbnail images).
1522  */
1523 int
TIFFSetSubDirectory(TIFF * tif,uint64 diroff)1524 TIFFSetSubDirectory(TIFF* tif, uint64 diroff)
1525 {
1526     tif->tif_nextdiroff = diroff;
1527     /*
1528      * Reset tif_dirnumber counter and start new list of seen directories.
1529      * We need this to prevent IFD loops.
1530      */
1531     tif->tif_dirnumber = 0;
1532     return (TIFFReadDirectory(tif));
1533 }
1534 
1535 /*
1536  * Return file offset of the current directory.
1537  */
1538 uint64
TIFFCurrentDirOffset(TIFF * tif)1539 TIFFCurrentDirOffset(TIFF* tif)
1540 {
1541     return (tif->tif_diroff);
1542 }
1543 
1544 /*
1545  * Return an indication of whether or not we are
1546  * at the last directory in the file.
1547  */
1548 int
TIFFLastDirectory(TIFF * tif)1549 TIFFLastDirectory(TIFF* tif)
1550 {
1551     return (tif->tif_nextdiroff == 0);
1552 }
1553 
1554 /*
1555  * Unlink the specified directory from the directory chain.
1556  */
1557 int
TIFFUnlinkDirectory(TIFF * tif,uint16 dirn)1558 TIFFUnlinkDirectory(TIFF* tif, uint16 dirn)
1559 {
1560     static const char module[] = "TIFFUnlinkDirectory";
1561     uint64 nextdir;
1562     uint64 off;
1563     uint16 n;
1564 
1565     if (tif->tif_mode == O_RDONLY) {
1566         TIFFErrorExt(tif->tif_clientdata, module,
1567                              "Can not unlink directory in read-only file");
1568         return (0);
1569     }
1570     /*
1571      * Go to the directory before the one we want
1572      * to unlink and nab the offset of the link
1573      * field we'll need to patch.
1574      */
1575     if (!(tif->tif_flags&TIFF_BIGTIFF))
1576     {
1577         nextdir = tif->tif_header.classic.tiff_diroff;
1578         off = 4;
1579     }
1580     else
1581     {
1582         nextdir = tif->tif_header.big.tiff_diroff;
1583         off = 8;
1584     }
1585     for (n = dirn-1; n > 0; n--) {
1586         if (nextdir == 0) {
1587             TIFFErrorExt(tif->tif_clientdata, module, "Directory %d does not exist", dirn);
1588             return (0);
1589         }
1590         if (!TIFFAdvanceDirectory(tif, &nextdir, &off))
1591             return (0);
1592     }
1593     /*
1594      * Advance to the directory to be unlinked and fetch
1595      * the offset of the directory that follows.
1596      */
1597     if (!TIFFAdvanceDirectory(tif, &nextdir, NULL))
1598         return (0);
1599     /*
1600      * Go back and patch the link field of the preceding
1601      * directory to point to the offset of the directory
1602      * that follows.
1603      */
1604     (void) TIFFSeekFile(tif, off, SEEK_SET);
1605     if (!(tif->tif_flags&TIFF_BIGTIFF))
1606     {
1607         uint32 nextdir32;
1608         nextdir32=(uint32)nextdir;
1609         assert((uint64)nextdir32==nextdir);
1610         if (tif->tif_flags & TIFF_SWAB)
1611             TIFFSwabLong(&nextdir32);
1612         if (!WriteOK(tif, &nextdir32, sizeof (uint32))) {
1613             TIFFErrorExt(tif->tif_clientdata, module, "Error writing directory link");
1614             return (0);
1615         }
1616     }
1617     else
1618     {
1619         if (tif->tif_flags & TIFF_SWAB)
1620             TIFFSwabLong8(&nextdir);
1621         if (!WriteOK(tif, &nextdir, sizeof (uint64))) {
1622             TIFFErrorExt(tif->tif_clientdata, module, "Error writing directory link");
1623             return (0);
1624         }
1625     }
1626     /*
1627      * Leave directory state setup safely.  We don't have
1628      * facilities for doing inserting and removing directories,
1629      * so it's safest to just invalidate everything.  This
1630      * means that the caller can only append to the directory
1631      * chain.
1632      */
1633     (*tif->tif_cleanup)(tif);
1634     if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) {
1635         _TIFFfree(tif->tif_rawdata);
1636         tif->tif_rawdata = NULL;
1637         tif->tif_rawcc = 0;
1638                 tif->tif_rawdataoff = 0;
1639                 tif->tif_rawdataloaded = 0;
1640     }
1641     tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP|TIFF_POSTENCODE|TIFF_BUF4WRITE);
1642     TIFFFreeDirectory(tif);
1643     TIFFDefaultDirectory(tif);
1644     tif->tif_diroff = 0;			/* force link on next write */
1645     tif->tif_nextdiroff = 0;		/* next write must be at end */
1646     tif->tif_curoff = 0;
1647     tif->tif_row = (uint32) -1;
1648     tif->tif_curstrip = (uint32) -1;
1649     return (1);
1650 }
1651 
1652 /* vim: set ts=8 sts=8 sw=8 noet: */
1653 /*
1654  * Local Variables:
1655  * mode: c
1656  * c-basic-offset: 8
1657  * fill-column: 78
1658  * End:
1659  */
1660