close early for tiffload

This commit is contained in:
John Cupitt 2018-08-16 16:00:14 +01:00
parent b836749b75
commit 0b4cef06b7
2 changed files with 69 additions and 59 deletions

View File

@ -98,6 +98,8 @@
* - set interlaced=1 for interlaced images
* 10/4/18
* - strict round down on shrink-on-load
* 16/8/18
* - shut down the input file as soon as we can [kleisauke]
*/
/*

View File

@ -181,6 +181,8 @@
* - add n-pages metadata item
* 21/7/18
* - check for non-byte-multiple bits_per_sample [HongxuChen]
* 16/8/18
* - shut down the input file as soon as we can [kleisauke]
*/
/*
@ -455,6 +457,64 @@ get_orientation( TIFF *tiff )
return( orientation );
}
/* Can be called many times.
*/
static void
rtiff_free( Rtiff *rtiff )
{
VIPS_FREEF( TIFFClose, rtiff->tiff );
}
static void
rtiff_close_cb( VipsObject *object, Rtiff *rtiff )
{
rtiff_free( rtiff );
}
static Rtiff *
rtiff_new( VipsImage *out, int page, int n, gboolean autorotate )
{
Rtiff *rtiff;
if( !(rtiff = VIPS_NEW( out, Rtiff )) )
return( NULL );
rtiff->filename = NULL;
rtiff->out = out;
rtiff->page = page;
rtiff->n = n;
rtiff->autorotate = autorotate;
rtiff->tiff = NULL;
rtiff->n_pages = 0;
rtiff->current_page = -1;
rtiff->sfn = NULL;
rtiff->client = NULL;
rtiff->memcpy = FALSE;
rtiff->plane_buf = NULL;
rtiff->contig_buf = NULL;
g_signal_connect( out, "close",
G_CALLBACK( rtiff_close_cb ), rtiff );
if( rtiff->page < 0 || rtiff->page > 1000000 ) {
vips_error( "tiff2vips", _( "bad page number %d" ),
rtiff->page );
return( NULL );
}
/* We allow n == -1, meaning all pages. It gets swapped for a real n
* value when we open the TIFF.
*/
if( rtiff->n != -1 &&
(rtiff->n < 1 || rtiff->n > 1000000) ) {
vips_error( "tiff2vips", _( "bad number of pages %d" ),
rtiff->n );
return( NULL );
}
return( rtiff );
}
static int
rtiff_strip_read( Rtiff *rtiff, int strip, tdata_t buf )
{
@ -1880,6 +1940,11 @@ rtiff_stripwise_generate( VipsRegion *or,
y += hit.height;
}
/* Shut down the input file as soon as we can.
*/
if( y >= or->im->Ysize )
rtiff_free( rtiff );
VIPS_GATE_STOP( "rtiff_stripwise_generate: work" );
return( 0 );
@ -1986,64 +2051,6 @@ rtiff_read_stripwise( Rtiff *rtiff, VipsImage *out )
return( 0 );
}
/* Can be called many times.
*/
static void
rtiff_free( Rtiff *rtiff )
{
VIPS_FREEF( TIFFClose, rtiff->tiff );
}
static void
rtiff_close( VipsObject *object, Rtiff *rtiff )
{
rtiff_free( rtiff );
}
static Rtiff *
rtiff_new( VipsImage *out, int page, int n, gboolean autorotate )
{
Rtiff *rtiff;
if( !(rtiff = VIPS_NEW( out, Rtiff )) )
return( NULL );
rtiff->filename = NULL;
rtiff->out = out;
rtiff->page = page;
rtiff->n = n;
rtiff->autorotate = autorotate;
rtiff->tiff = NULL;
rtiff->n_pages = 0;
rtiff->current_page = -1;
rtiff->sfn = NULL;
rtiff->client = NULL;
rtiff->memcpy = FALSE;
rtiff->plane_buf = NULL;
rtiff->contig_buf = NULL;
g_signal_connect( out, "close",
G_CALLBACK( rtiff_close ), rtiff );
if( rtiff->page < 0 || rtiff->page > 1000000 ) {
vips_error( "tiff2vips", _( "bad page number %d" ),
rtiff->page );
return( NULL );
}
/* We allow n == -1, meaning all pages. It gets swapped for a real n
* value when we open the TIFF.
*/
if( rtiff->n != -1 &&
(rtiff->n < 1 || rtiff->n > 1000000) ) {
vips_error( "tiff2vips", _( "bad number of pages %d" ),
rtiff->n );
return( NULL );
}
return( rtiff );
}
/* Load from a tiff dir into one of our tiff header structs.
*/
static int
@ -2341,7 +2348,8 @@ vips__tiff_read_header( const char *filename, VipsImage *out,
vips__tiff_init();
if( !(rtiff = rtiff_new_filename( filename, out, page, n, autorotate )) )
if( !(rtiff =
rtiff_new_filename( filename, out, page, n, autorotate )) )
return( -1 );
if( rtiff_set_header( rtiff, out ) )