fix memleak in jpegsave_buffer with some errors

under some error conditions, jpegsave_buffer could forget to release a
half-built image
This commit is contained in:
John Cupitt 2019-04-19 15:01:20 +01:00
parent c98da89ac9
commit 7aa46b258a
1 changed files with 7 additions and 2 deletions

View File

@ -221,6 +221,7 @@ write_new( VipsImage *in )
write->in = in;
write->row_pointer = NULL;
write->cinfo.err = jpeg_std_error( &write->eman.pub );
write->cinfo.dest = NULL;
write->eman.pub.error_exit = vips__new_error_exit;
write->eman.pub.output_message = vips__new_output_message;
write->eman.fp = NULL;
@ -652,7 +653,7 @@ write_vips( Write *write, int qfac, const char *profile,
if( setjmp( write->eman.jmp ) )
return( -1 );
/* This should obly be called on a successful write.
/* This should only be called on a successful write.
*/
jpeg_finish_compress( &write->cinfo );
@ -766,9 +767,12 @@ init_destination( j_compress_ptr cinfo )
static void
buf_destroy( j_compress_ptr cinfo )
{
printf( "buf_destroy:\n" );
if( cinfo->dest ) {
OutputBuffer *buf = (OutputBuffer *) cinfo->dest;
printf( "buf_destroy: destroying\n" );
vips_dbuf_destroy( &buf->dbuf );
}
}
@ -848,8 +852,9 @@ vips__jpeg_write_buffer( VipsImage *in,
/* Make jpeg compression object.
*/
if( setjmp( write->eman.jmp ) ) {
/* Here for longjmp() from new_error_exit() during setup.
/* Here for longjmp() during write_vips().
*/
buf_destroy( &write->cinfo );
write_destroy( write );
return( -1 );