better handling of short files in vips7 compat
the sniffer could read beyond the end of the file sometimes
This commit is contained in:
parent
7d3a7e9c29
commit
9ef8b55218
@ -176,7 +176,7 @@ im_isvips( const char *filename )
|
|||||||
{
|
{
|
||||||
unsigned char buf[4];
|
unsigned char buf[4];
|
||||||
|
|
||||||
if( im__get_bytes( filename, buf, 4 ) ) {
|
if( im__get_bytes( filename, buf, 4 ) == 4 ) {
|
||||||
if( buf[0] == 0x08 && buf[1] == 0xf2 &&
|
if( buf[0] == 0x08 && buf[1] == 0xf2 &&
|
||||||
buf[2] == 0xa6 && buf[3] == 0xb6 )
|
buf[2] == 0xa6 && buf[3] == 0xb6 )
|
||||||
/* SPARC-order VIPS image.
|
/* SPARC-order VIPS image.
|
||||||
@ -212,7 +212,7 @@ vips_flags( const char *filename )
|
|||||||
|
|
||||||
flags = VIPS_FORMAT_PARTIAL;
|
flags = VIPS_FORMAT_PARTIAL;
|
||||||
|
|
||||||
if( im__get_bytes( filename, buf, 4 ) &&
|
if( im__get_bytes( filename, buf, 4 ) == 4 &&
|
||||||
buf[0] == 0x08 &&
|
buf[0] == 0x08 &&
|
||||||
buf[1] == 0xf2 &&
|
buf[1] == 0xf2 &&
|
||||||
buf[2] == 0xa6 &&
|
buf[2] == 0xa6 &&
|
||||||
|
@ -751,15 +751,13 @@ G_DEFINE_TYPE( VipsForeignLoadMagick7File, vips_foreign_load_magick7_file,
|
|||||||
static gboolean
|
static gboolean
|
||||||
ismagick7( const char *filename )
|
ismagick7( const char *filename )
|
||||||
{
|
{
|
||||||
/* Fetch the first 100 bytes. Hopefully that'll be enough.
|
/* Fetch up to the first 100 bytes. Hopefully that'll be enough.
|
||||||
*/
|
*/
|
||||||
unsigned char buf[100];
|
unsigned char buf[100];
|
||||||
|
int len;
|
||||||
|
|
||||||
/* Files shorter than 100 bytes will leave nonsense at the end of buf,
|
return( (len = vips__get_bytes( filename, buf, 100 )) > 10 &&
|
||||||
* but it shouldn't matter.
|
magick_ismagick( buf, len ) );
|
||||||
*/
|
|
||||||
return( vips__get_bytes( filename, buf, 100 ) &&
|
|
||||||
magick_ismagick( buf, 100 ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -173,15 +173,13 @@ G_DEFINE_TYPE( VipsForeignLoadMagickFile, vips_foreign_load_magick_file,
|
|||||||
static gboolean
|
static gboolean
|
||||||
ismagick( const char *filename )
|
ismagick( const char *filename )
|
||||||
{
|
{
|
||||||
/* Fetch the first 100 bytes. Hopefully that'll be enough.
|
/* Fetch up to the first 100 bytes. Hopefully that'll be enough.
|
||||||
*/
|
*/
|
||||||
unsigned char buf[100];
|
unsigned char buf[100];
|
||||||
|
int len;
|
||||||
|
|
||||||
/* Files shorter than 100 bytes will leave nonsense at the end of buf,
|
return( (len = vips__get_bytes( filename, buf, 100 )) > 10 &&
|
||||||
* but it shouldn't matter.
|
magick_ismagick( buf, len ) );
|
||||||
*/
|
|
||||||
return( vips__get_bytes( filename, buf, 100 ) &&
|
|
||||||
magick_ismagick( buf, 100 ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Unfortunately, libMagick does not support header-only reads very well. See
|
/* Unfortunately, libMagick does not support header-only reads very well. See
|
||||||
|
@ -266,8 +266,8 @@ char *vips__file_read( FILE *fp, const char *name, size_t *length_out );
|
|||||||
char *vips__file_read_name( const char *name, const char *fallback_dir,
|
char *vips__file_read_name( const char *name, const char *fallback_dir,
|
||||||
size_t *length_out );
|
size_t *length_out );
|
||||||
int vips__file_write( void *data, size_t size, size_t nmemb, FILE *stream );
|
int vips__file_write( void *data, size_t size, size_t nmemb, FILE *stream );
|
||||||
guint64 vips__get_bytes( const char *filename,
|
gint64 vips__get_bytes( const char *filename,
|
||||||
unsigned char buf[], guint64 len );
|
unsigned char buf[], gint64 len );
|
||||||
int vips__fgetc( FILE *fp );
|
int vips__fgetc( FILE *fp );
|
||||||
|
|
||||||
GValue *vips__gvalue_ref_string_new( const char *text );
|
GValue *vips__gvalue_ref_string_new( const char *text );
|
||||||
|
@ -874,13 +874,13 @@ vips__file_write( void *data, size_t size, size_t nmemb, FILE *stream )
|
|||||||
* types, so we must read binary.
|
* types, so we must read binary.
|
||||||
*
|
*
|
||||||
* Return the number of bytes actually read (the file might be shorter than
|
* Return the number of bytes actually read (the file might be shorter than
|
||||||
* len), or 0 for error.
|
* len), or -1 for error.
|
||||||
*/
|
*/
|
||||||
guint64
|
gint64
|
||||||
vips__get_bytes( const char *filename, unsigned char buf[], guint64 len )
|
vips__get_bytes( const char *filename, unsigned char buf[], gint64 len )
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
guint64 bytes_read;
|
gint64 bytes_read;
|
||||||
|
|
||||||
/* File may not even exist (for tmp images for example!)
|
/* File may not even exist (for tmp images for example!)
|
||||||
* so no hasty messages. And the file might be truncated, so no error
|
* so no hasty messages. And the file might be truncated, so no error
|
||||||
|
Loading…
Reference in New Issue
Block a user