Store a list of opened IFD to prevent looping as per bug
http://bugzilla.remotesensing.org/show_bug.cgi?id=383
This commit is contained in:
parent
bb7ac0701f
commit
136507d95a
@ -1,4 +1,4 @@
|
||||
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_dir.c,v 1.29 2003-07-08 16:40:46 warmerda Exp $ */
|
||||
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_dir.c,v 1.30 2003-09-25 08:36:21 dron Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
@ -1302,6 +1302,11 @@ TIFFSetDirectory(TIFF* tif, tdir_t dirn)
|
||||
* tif_curdir after successfully reading the directory.
|
||||
*/
|
||||
tif->tif_curdir = (dirn - n) - 1;
|
||||
/*
|
||||
* Reset tif_dirnumber counter nad start new list of seen directories.
|
||||
* We need this in order to prevent IFD loops.
|
||||
*/
|
||||
tif->tif_dirnumber = 0;
|
||||
return (TIFFReadDirectory(tif));
|
||||
}
|
||||
|
||||
@ -1315,6 +1320,11 @@ int
|
||||
TIFFSetSubDirectory(TIFF* tif, uint32 diroff)
|
||||
{
|
||||
tif->tif_nextdiroff = diroff;
|
||||
/*
|
||||
* Reset tif_dirnumber counter nad start new list of seen directories.
|
||||
* We need this in order to prevent IFD loops.
|
||||
*/
|
||||
tif->tif_dirnumber = 0;
|
||||
return (TIFFReadDirectory(tif));
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_dirread.c,v 1.22 2003-09-25 08:02:46 dron Exp $ */
|
||||
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_dirread.c,v 1.23 2003-09-25 08:36:21 dron Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
@ -103,20 +103,20 @@ TIFFReadDirectory(TIFF* tif)
|
||||
* with looped directory pointers. We will maintain a list of already
|
||||
* seen directories and check every IFD offset against this list.
|
||||
*/
|
||||
for (n = 0; n < tif->tif_dircount; n++) {
|
||||
for (n = 0; n < tif->tif_dirnumber; n++) {
|
||||
if (tif->tif_dirlist[n] == tif->tif_diroff)
|
||||
return (0);
|
||||
}
|
||||
tif->tif_dircount++;
|
||||
tif->tif_dirnumber++;
|
||||
tif->tif_dirlist = _TIFFrealloc(tif->tif_dirlist,
|
||||
tif->tif_dircount * sizeof(toff_t));
|
||||
tif->tif_dirnumber * sizeof(toff_t));
|
||||
if (!tif->tif_dirlist) {
|
||||
TIFFError(module,
|
||||
"%.1000s: Failed to allocate space for IFD list",
|
||||
tif->tif_name);
|
||||
return (0);
|
||||
}
|
||||
tif->tif_dirlist[tif->tif_dircount - 1] = tif->tif_diroff;
|
||||
tif->tif_dirlist[tif->tif_dirnumber - 1] = tif->tif_diroff;
|
||||
|
||||
/*
|
||||
* Cleanup any previous compression state.
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_open.c,v 1.10 2003-09-25 08:02:46 dron Exp $ */
|
||||
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_open.c,v 1.11 2003-09-25 08:36:21 dron Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
@ -314,7 +314,7 @@ TIFFClientOpen(
|
||||
goto bad;
|
||||
tif->tif_diroff = 0;
|
||||
tif->tif_dirlist = NULL;
|
||||
tif->tif_dircount = 0;
|
||||
tif->tif_dirnumber = 0;
|
||||
return (tif);
|
||||
}
|
||||
/*
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tiffiop.h,v 1.6 2003-09-25 08:02:46 dron Exp $ */
|
||||
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tiffiop.h,v 1.7 2003-09-25 08:36:21 dron Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
@ -94,7 +94,7 @@ struct tiff {
|
||||
toff_t tif_nextdiroff; /* file offset of following directory */
|
||||
toff_t* tif_dirlist; /* list of offsets to already seen */
|
||||
/* directories to prevent IFD looping */
|
||||
uint16 tif_dircount; /* number of already seen directories */
|
||||
uint16 tif_dirnumber; /* number of already seen directories */
|
||||
TIFFDirectory tif_dir; /* internal rep of current directory */
|
||||
TIFFHeader tif_header; /* file's header block */
|
||||
const int* tif_typeshift; /* data type shift counts */
|
||||
|
Loading…
Reference in New Issue
Block a user