add read loops to heif and ppm as well

We were not looping on vips_source_read() in these loaders, so they
could fail when reading from very slow pipes.

See https://github.com/kleisauke/net-vips/issues/101
This commit is contained in:
John Cupitt 2020-11-12 12:11:35 +00:00
parent c0102c5814
commit ff450497ff
2 changed files with 22 additions and 10 deletions

View File

@ -963,11 +963,15 @@ vips_foreign_load_heif_read( void *data, size_t size, void *userdata )
{ {
VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) userdata; VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) userdata;
gint64 result; while( size > 0 ) {
gint64 result;
result = vips_source_read( heif->source, data, size ); result = vips_source_read( heif->source, data, size );
if( result < 0 ) if( result <= 0 )
return( -1 ); return( -1 );
size -= result;
}
return( 0 ); return( 0 );
} }

View File

@ -458,13 +458,21 @@ vips_foreign_load_ppm_generate_binary( VipsRegion *or,
for( y = 0; y < r->height; y++ ) { for( y = 0; y < r->height; y++ ) {
VipsPel *q = VIPS_REGION_ADDR( or, 0, r->top + y ); VipsPel *q = VIPS_REGION_ADDR( or, 0, r->top + y );
size_t bytes_read; size_t n_bytes;
bytes_read = vips_source_read( ppm->source, q, sizeof_line ); n_bytes = sizeof_line;
if( bytes_read != sizeof_line ) { while( n_bytes > 0 ) {
vips_error( class->nickname, size_t bytes_read;
"%s", _( "file truncated" ) );
return( -1 ); bytes_read = vips_source_read( ppm->source,
q, sizeof_line );
if( bytes_read == 0 ) {
vips_error( class->nickname,
"%s", _( "file truncated" ) );
return( -1 );
}
n_bytes -= bytes_read;
} }
} }