better behaviour for truncated PNG files
truncated PNG files failed with an error, even if --fail was not set ... instead, just warn, and only error out if fail is on see https://github.com/jcupitt/libvips/issues/629
This commit is contained in:
parent
6fffc3f47f
commit
d5a706e47e
@ -1,3 +1,6 @@
|
|||||||
|
25/3/17 started 8.5.2
|
||||||
|
- better behaviour for truncated PNG files, thanks Yury
|
||||||
|
|
||||||
25/3/17 started 8.5.1
|
25/3/17 started 8.5.1
|
||||||
- init more classes earlier, thanks David
|
- init more classes earlier, thanks David
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
# also update the version number in the m4 macros below
|
# also update the version number in the m4 macros below
|
||||||
|
|
||||||
AC_INIT([vips], [8.5.1], [vipsip@jiscmail.ac.uk])
|
AC_INIT([vips], [8.5.2], [vipsip@jiscmail.ac.uk])
|
||||||
# required for gobject-introspection
|
# required for gobject-introspection
|
||||||
AC_PREREQ(2.62)
|
AC_PREREQ(2.62)
|
||||||
|
|
||||||
@ -18,7 +18,7 @@ AC_CONFIG_MACRO_DIR([m4])
|
|||||||
# user-visible library versioning
|
# user-visible library versioning
|
||||||
m4_define([vips_major_version], [8])
|
m4_define([vips_major_version], [8])
|
||||||
m4_define([vips_minor_version], [5])
|
m4_define([vips_minor_version], [5])
|
||||||
m4_define([vips_micro_version], [1])
|
m4_define([vips_micro_version], [2])
|
||||||
m4_define([vips_version],
|
m4_define([vips_version],
|
||||||
[vips_major_version.vips_minor_version.vips_micro_version])
|
[vips_major_version.vips_minor_version.vips_micro_version])
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ VIPS_VERSION_STRING=$VIPS_VERSION-`date`
|
|||||||
# binary interface changes not backwards compatible?: reset age to 0
|
# binary interface changes not backwards compatible?: reset age to 0
|
||||||
|
|
||||||
LIBRARY_CURRENT=49
|
LIBRARY_CURRENT=49
|
||||||
LIBRARY_REVISION=1
|
LIBRARY_REVISION=2
|
||||||
LIBRARY_AGE=7
|
LIBRARY_AGE=7
|
||||||
|
|
||||||
# patched into include/vips/version.h
|
# patched into include/vips/version.h
|
||||||
|
@ -87,7 +87,7 @@ png2vips( const char *name, IMAGE *out, gboolean header_only )
|
|||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if( vips__png_read( filename, out ) )
|
if( vips__png_read( filename, out, TRUE ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -177,15 +177,15 @@ int vips__jpeg_read_buffer( const void *buf, size_t len, VipsImage *out,
|
|||||||
gboolean header_only, int shrink, int fail, gboolean autorotate );
|
gboolean header_only, int shrink, int fail, gboolean autorotate );
|
||||||
|
|
||||||
int vips__png_header( const char *name, VipsImage *out );
|
int vips__png_header( const char *name, VipsImage *out );
|
||||||
int vips__png_read( const char *name, VipsImage *out );
|
int vips__png_read( const char *name, VipsImage *out, gboolean fail );
|
||||||
gboolean vips__png_ispng_buffer( const void *buf, size_t len );
|
gboolean vips__png_ispng_buffer( const void *buf, size_t len );
|
||||||
int vips__png_ispng( const char *filename );
|
int vips__png_ispng( const char *filename );
|
||||||
gboolean vips__png_isinterlaced( const char *filename );
|
gboolean vips__png_isinterlaced( const char *filename );
|
||||||
gboolean vips__png_isinterlaced_buffer( const void *buffer, size_t length );
|
gboolean vips__png_isinterlaced_buffer( const void *buffer, size_t length );
|
||||||
extern const char *vips__png_suffs[];
|
extern const char *vips__png_suffs[];
|
||||||
int vips__png_read_buffer( const void *buffer, size_t length, VipsImage *out );
|
int vips__png_read_buffer( const void *buffer, size_t length, VipsImage *out,
|
||||||
int vips__png_header_buffer( const void *buffer, size_t length,
|
gboolean fail );
|
||||||
VipsImage *out );
|
int vips__png_header_buffer( const void *buffer, size_t length, VipsImage *out );
|
||||||
|
|
||||||
int vips__png_write( VipsImage *in, const char *filename,
|
int vips__png_write( VipsImage *in, const char *filename,
|
||||||
int compress, int interlace, const char *profile,
|
int compress, int interlace, const char *profile,
|
||||||
|
@ -106,7 +106,7 @@ vips_foreign_load_png_load( VipsForeignLoad *load )
|
|||||||
{
|
{
|
||||||
VipsForeignLoadPng *png = (VipsForeignLoadPng *) load;
|
VipsForeignLoadPng *png = (VipsForeignLoadPng *) load;
|
||||||
|
|
||||||
if( vips__png_read( png->filename, load->real ) )
|
if( vips__png_read( png->filename, load->real, load->fail ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
@ -201,7 +201,7 @@ vips_foreign_load_png_buffer_load( VipsForeignLoad *load )
|
|||||||
VipsForeignLoadPngBuffer *buffer = (VipsForeignLoadPngBuffer *) load;
|
VipsForeignLoadPngBuffer *buffer = (VipsForeignLoadPngBuffer *) load;
|
||||||
|
|
||||||
if( vips__png_read_buffer( buffer->buf->data, buffer->buf->length,
|
if( vips__png_read_buffer( buffer->buf->data, buffer->buf->length,
|
||||||
load->real ) )
|
load->real, load->fail ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
|
@ -61,6 +61,8 @@
|
|||||||
* - invalidate operation on read error
|
* - invalidate operation on read error
|
||||||
* 27/2/17
|
* 27/2/17
|
||||||
* - use dbuf for buffer output
|
* - use dbuf for buffer output
|
||||||
|
* 30/3/17
|
||||||
|
* - better behaviour for truncated png files, thanks Yury
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -125,8 +127,8 @@ user_error_function( png_structp png_ptr, png_const_charp error_msg )
|
|||||||
|
|
||||||
/* This function must not return or the default error handler will be
|
/* This function must not return or the default error handler will be
|
||||||
* invoked.
|
* invoked.
|
||||||
*/
|
|
||||||
longjmp( png_jmpbuf( png_ptr ), -1 );
|
longjmp( png_jmpbuf( png_ptr ), -1 );
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -140,6 +142,7 @@ user_warning_function( png_structp png_ptr, png_const_charp warning_msg )
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
char *name;
|
char *name;
|
||||||
VipsImage *out;
|
VipsImage *out;
|
||||||
|
gboolean fail;
|
||||||
|
|
||||||
int y_pos;
|
int y_pos;
|
||||||
png_structp pPng;
|
png_structp pPng;
|
||||||
@ -176,7 +179,7 @@ read_close_cb( VipsImage *out, Read *read )
|
|||||||
}
|
}
|
||||||
|
|
||||||
static Read *
|
static Read *
|
||||||
read_new( VipsImage *out )
|
read_new( VipsImage *out, gboolean fail )
|
||||||
{
|
{
|
||||||
Read *read;
|
Read *read;
|
||||||
|
|
||||||
@ -184,6 +187,7 @@ read_new( VipsImage *out )
|
|||||||
return( NULL );
|
return( NULL );
|
||||||
|
|
||||||
read->name = NULL;
|
read->name = NULL;
|
||||||
|
read->fail = fail;
|
||||||
read->out = out;
|
read->out = out;
|
||||||
read->y_pos = 0;
|
read->y_pos = 0;
|
||||||
read->pPng = NULL;
|
read->pPng = NULL;
|
||||||
@ -221,11 +225,11 @@ read_new( VipsImage *out )
|
|||||||
}
|
}
|
||||||
|
|
||||||
static Read *
|
static Read *
|
||||||
read_new_filename( VipsImage *out, const char *name )
|
read_new_filename( VipsImage *out, const char *name, gboolean fail )
|
||||||
{
|
{
|
||||||
Read *read;
|
Read *read;
|
||||||
|
|
||||||
if( !(read = read_new( out )) )
|
if( !(read = read_new( out, fail )) )
|
||||||
return( NULL );
|
return( NULL );
|
||||||
|
|
||||||
read->name = vips_strdup( VIPS_OBJECT( out ), name );
|
read->name = vips_strdup( VIPS_OBJECT( out ), name );
|
||||||
@ -437,7 +441,7 @@ vips__png_header( const char *name, VipsImage *out )
|
|||||||
{
|
{
|
||||||
Read *read;
|
Read *read;
|
||||||
|
|
||||||
if( !(read = read_new_filename( out, name )) ||
|
if( !(read = read_new_filename( out, name, TRUE )) ||
|
||||||
png2vips_header( read, out ) )
|
png2vips_header( read, out ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
@ -539,10 +543,15 @@ png2vips_generate( VipsRegion *or,
|
|||||||
read->y_pos += 1;
|
read->y_pos += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Turn errors back on. png_read_end() can trigger them too.
|
/* Turn errors back on. png_read_end() can trigger them too, for
|
||||||
|
* example for a truncated file.
|
||||||
*/
|
*/
|
||||||
if( setjmp( png_jmpbuf( read->pPng ) ) )
|
if( setjmp( png_jmpbuf( read->pPng ) ) ) {
|
||||||
return( -1 );
|
if( read->fail )
|
||||||
|
return( -1 );
|
||||||
|
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
/* We need to shut down the reader immediately at the end of read or
|
/* We need to shut down the reader immediately at the end of read or
|
||||||
* we won't detach ready for the next image.
|
* we won't detach ready for the next image.
|
||||||
@ -566,7 +575,7 @@ vips__png_isinterlaced( const char *filename )
|
|||||||
int interlace_type;
|
int interlace_type;
|
||||||
|
|
||||||
image = vips_image_new();
|
image = vips_image_new();
|
||||||
if( !(read = read_new_filename( image, filename )) ) {
|
if( !(read = read_new_filename( image, filename, TRUE )) ) {
|
||||||
g_object_unref( image );
|
g_object_unref( image );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
@ -610,7 +619,7 @@ png2vips_image( Read *read, VipsImage *out )
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
vips__png_read( const char *filename, VipsImage *out )
|
vips__png_read( const char *filename, VipsImage *out, gboolean fail )
|
||||||
{
|
{
|
||||||
Read *read;
|
Read *read;
|
||||||
|
|
||||||
@ -618,7 +627,7 @@ vips__png_read( const char *filename, VipsImage *out )
|
|||||||
printf( "vips__png_read: reading \"%s\"\n", filename );
|
printf( "vips__png_read: reading \"%s\"\n", filename );
|
||||||
#endif /*DEBUG*/
|
#endif /*DEBUG*/
|
||||||
|
|
||||||
if( !(read = read_new_filename( out, filename )) ||
|
if( !(read = read_new_filename( out, filename, fail )) ||
|
||||||
png2vips_image( read, out ) )
|
png2vips_image( read, out ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
@ -665,11 +674,12 @@ vips_png_read_buffer( png_structp pPng, png_bytep data, png_size_t length )
|
|||||||
}
|
}
|
||||||
|
|
||||||
static Read *
|
static Read *
|
||||||
read_new_buffer( VipsImage *out, const void *buffer, size_t length )
|
read_new_buffer( VipsImage *out, const void *buffer, size_t length,
|
||||||
|
gboolean fail )
|
||||||
{
|
{
|
||||||
Read *read;
|
Read *read;
|
||||||
|
|
||||||
if( !(read = read_new( out )) )
|
if( !(read = read_new( out, fail )) )
|
||||||
return( NULL );
|
return( NULL );
|
||||||
|
|
||||||
read->length = length;
|
read->length = length;
|
||||||
@ -695,7 +705,7 @@ vips__png_header_buffer( const void *buffer, size_t length, VipsImage *out )
|
|||||||
{
|
{
|
||||||
Read *read;
|
Read *read;
|
||||||
|
|
||||||
if( !(read = read_new_buffer( out, buffer, length )) ||
|
if( !(read = read_new_buffer( out, buffer, length, TRUE )) ||
|
||||||
png2vips_header( read, out ) )
|
png2vips_header( read, out ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
@ -703,11 +713,12 @@ vips__png_header_buffer( const void *buffer, size_t length, VipsImage *out )
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
vips__png_read_buffer( const void *buffer, size_t length, VipsImage *out )
|
vips__png_read_buffer( const void *buffer, size_t length, VipsImage *out,
|
||||||
|
gboolean fail )
|
||||||
{
|
{
|
||||||
Read *read;
|
Read *read;
|
||||||
|
|
||||||
if( !(read = read_new_buffer( out, buffer, length )) ||
|
if( !(read = read_new_buffer( out, buffer, length, fail )) ||
|
||||||
png2vips_image( read, out ) )
|
png2vips_image( read, out ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
@ -726,7 +737,7 @@ vips__png_isinterlaced_buffer( const void *buffer, size_t length )
|
|||||||
|
|
||||||
image = vips_image_new();
|
image = vips_image_new();
|
||||||
|
|
||||||
if( !(read = read_new_buffer( image, buffer, length )) ) {
|
if( !(read = read_new_buffer( image, buffer, length, TRUE )) ) {
|
||||||
g_object_unref( image );
|
g_object_unref( image );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user