2004.10.15 20:09 "Re: [Tiff] WIN32 _TIFFrealloc() bug?", by Frank Warmerdam
When opening an image on WIN32, libtiff-3.6.1 does:
GlobalSize(NULL)
_TIFFrealloc(void * 0x00000000, long 4) line 237
TIFFReadDirectory(tiff * 0x001b5ec8) line 112 + 25 bytes
TIFFClientOpen(const char * 0x009d4934, const char * 0x009d4920, thandle_t__ * 0x00000000, long (thandle_t__ *, void *, long)* 0x00627caa +_tiffFileReadProc(thandle_t__ *, void *, long), long (thandle_t__ *, void *, long)* 0x00627cd1 _tiffFileWriteProc(thandle_t__ *, void *, long), unsigned long (thandle_t__ *, unsigned long, int)* ...) line 367 + 9 bytes
iTIFFOpen(char * 0x009d4920) line 669 + 51 bytes
Ville,
In CVS the _TIFFRealloc implementation in tif_win32.c has been changed to the following as others have reported the same issue. I imagine this new implementation is in the latest libtiff 3.7.0 beta as well, which I would encourage you to try out. There are a number of known (and fixed) issues with the libtiff 3.6.1 and earlier releases.
tdata_t
_TIFFrealloc(tdata_t p, tsize_t s)
{
void* pvTmp;
tsize_t old;
if(p == NULL)
return ((tdata_t)GlobalAlloc(GMEM_FIXED, s));
old = GlobalSize(p);
if (old>=s) {
if ((pvTmp = GlobalAlloc(GMEM_FIXED, s)) != NULL) {
CopyMemory(pvTmp, p, s);
GlobalFree(p);
}
} else {
if ((pvTmp = GlobalAlloc(GMEM_FIXED, s)) != NULL) {
CopyMemory(pvTmp, p, old);
GlobalFree(p);
}
}
return ((tdata_t)pvTmp);
}
Best regards,
---------------------------------------+--------------------------------------
I set the clouds in motion - turn up | Frank Warmerdam, warmerdam@pobox.com
light and sound - activate the windows | http://pobox.com/~warmerdam
and watch the world go round - Rush | Geospatial Programmer for Rent