[libpng16] Fix new leak when text compression is disabled.
This commit is contained in:
parent
865e14fd32
commit
134c5761fa
@ -3308,6 +3308,11 @@ make_transform_image(png_store* PNG_CONST ps, png_byte PNG_CONST colour_type,
|
|||||||
PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
|
PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
|
||||||
|
|
||||||
#ifdef PNG_TEXT_SUPPORTED
|
#ifdef PNG_TEXT_SUPPORTED
|
||||||
|
# if (defined PNG_READ_zTXt_SUPPORTED) && (defined PNG_WRITE_zTXt_SUPPORTED)
|
||||||
|
# define TEXT_COMPRESSION PNG_TEXT_COMPRESSION_zTXt
|
||||||
|
# else
|
||||||
|
# define TEXT_COMPRESSION PNG_TEXT_COMPRESSION_NONE
|
||||||
|
# endif
|
||||||
{
|
{
|
||||||
static char key[] = "image name"; /* must be writeable */
|
static char key[] = "image name"; /* must be writeable */
|
||||||
size_t pos;
|
size_t pos;
|
||||||
@ -3317,7 +3322,7 @@ make_transform_image(png_store* PNG_CONST ps, png_byte PNG_CONST colour_type,
|
|||||||
/* Use a compressed text string to test the correct interaction of text
|
/* Use a compressed text string to test the correct interaction of text
|
||||||
* compression and IDAT compression.
|
* compression and IDAT compression.
|
||||||
*/
|
*/
|
||||||
text.compression = PNG_TEXT_COMPRESSION_zTXt;
|
text.compression = TEXT_COMPRESSION;
|
||||||
text.key = key;
|
text.key = key;
|
||||||
/* Yuck: the text must be writable! */
|
/* Yuck: the text must be writable! */
|
||||||
pos = safecat(copy, sizeof copy, 0, ps->wname);
|
pos = safecat(copy, sizeof copy, 0, ps->wname);
|
||||||
@ -3375,7 +3380,7 @@ make_transform_image(png_store* PNG_CONST ps, png_byte PNG_CONST colour_type,
|
|||||||
/* Use a compressed text string to test the correct interaction of text
|
/* Use a compressed text string to test the correct interaction of text
|
||||||
* compression and IDAT compression.
|
* compression and IDAT compression.
|
||||||
*/
|
*/
|
||||||
text.compression = PNG_TEXT_COMPRESSION_zTXt;
|
text.compression = TEXT_COMPRESSION;
|
||||||
text.key = key;
|
text.key = key;
|
||||||
text.text = comment;
|
text.text = comment;
|
||||||
text.text_length = (sizeof comment)-1;
|
text.text_length = (sizeof comment)-1;
|
||||||
@ -3546,7 +3551,7 @@ make_size_image(png_store* PNG_CONST ps, png_byte PNG_CONST colour_type,
|
|||||||
/* Use a compressed text string to test the correct interaction of text
|
/* Use a compressed text string to test the correct interaction of text
|
||||||
* compression and IDAT compression.
|
* compression and IDAT compression.
|
||||||
*/
|
*/
|
||||||
text.compression = PNG_TEXT_COMPRESSION_zTXt;
|
text.compression = TEXT_COMPRESSION;
|
||||||
text.key = key;
|
text.key = key;
|
||||||
/* Yuck: the text must be writable! */
|
/* Yuck: the text must be writable! */
|
||||||
pos = safecat(copy, sizeof copy, 0, ps->wname);
|
pos = safecat(copy, sizeof copy, 0, ps->wname);
|
||||||
@ -3646,7 +3651,7 @@ make_size_image(png_store* PNG_CONST ps, png_byte PNG_CONST colour_type,
|
|||||||
/* Use a compressed text string to test the correct interaction of text
|
/* Use a compressed text string to test the correct interaction of text
|
||||||
* compression and IDAT compression.
|
* compression and IDAT compression.
|
||||||
*/
|
*/
|
||||||
text.compression = PNG_TEXT_COMPRESSION_zTXt;
|
text.compression = TEXT_COMPRESSION;
|
||||||
text.key = key;
|
text.key = key;
|
||||||
text.text = comment;
|
text.text = comment;
|
||||||
text.text_length = (sizeof comment)-1;
|
text.text_length = (sizeof comment)-1;
|
||||||
@ -4624,11 +4629,11 @@ standard_check_text(png_const_structp pp, png_const_textp tp,
|
|||||||
pos = safecat(msg, sizeof msg, pos, ": ");
|
pos = safecat(msg, sizeof msg, pos, ": ");
|
||||||
ok = pos;
|
ok = pos;
|
||||||
|
|
||||||
if (tp->compression != PNG_TEXT_COMPRESSION_zTXt)
|
if (tp->compression != TEXT_COMPRESSION)
|
||||||
{
|
{
|
||||||
char buf[64];
|
char buf[64];
|
||||||
|
|
||||||
sprintf(buf, "compression [%d->%d], ", PNG_TEXT_COMPRESSION_zTXt,
|
sprintf(buf, "compression [%d->%d], ", TEXT_COMPRESSION,
|
||||||
tp->compression);
|
tp->compression);
|
||||||
pos = safecat(msg, sizeof msg, pos, buf);
|
pos = safecat(msg, sizeof msg, pos, buf);
|
||||||
}
|
}
|
||||||
|
2
pngset.c
2
pngset.c
@ -1297,7 +1297,7 @@ png_set_compression_buffer_size(png_structrp png_ptr, png_size_t size)
|
|||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
#ifdef PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
|
# ifdef PNG_WRITE_SUPPORTED
|
||||||
if (!(png_ptr->mode & PNG_IS_READ_STRUCT))
|
if (!(png_ptr->mode & PNG_IS_READ_STRUCT))
|
||||||
{
|
{
|
||||||
if (png_ptr->zowner != 0)
|
if (png_ptr->zowner != 0)
|
||||||
|
@ -872,9 +872,7 @@ png_write_destroy(png_structrp png_ptr)
|
|||||||
deflateEnd(&png_ptr->zstream);
|
deflateEnd(&png_ptr->zstream);
|
||||||
|
|
||||||
/* Free our memory. png_free checks NULL for us. */
|
/* Free our memory. png_free checks NULL for us. */
|
||||||
#ifdef PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
|
|
||||||
png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list);
|
png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list);
|
||||||
#endif
|
|
||||||
png_free(png_ptr, png_ptr->row_buf);
|
png_free(png_ptr, png_ptr->row_buf);
|
||||||
#ifdef PNG_WRITE_FILTER_SUPPORTED
|
#ifdef PNG_WRITE_FILTER_SUPPORTED
|
||||||
png_free(png_ptr, png_ptr->prev_row);
|
png_free(png_ptr, png_ptr->prev_row);
|
||||||
|
47
pngwutil.c
47
pngwutil.c
@ -452,6 +452,27 @@ png_deflate_claim(png_structrp png_ptr, png_uint_32 owner,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Clean up (or trim) a linked list of compression buffers. */
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_free_buffer_list(png_structrp png_ptr, png_compression_bufferp *listp)
|
||||||
|
{
|
||||||
|
png_compression_bufferp list = *listp;
|
||||||
|
|
||||||
|
if (list != NULL)
|
||||||
|
{
|
||||||
|
*listp = NULL;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
png_compression_bufferp next = list->next;
|
||||||
|
|
||||||
|
png_free(png_ptr, list);
|
||||||
|
list = next;
|
||||||
|
}
|
||||||
|
while (list != NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
|
#ifdef PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
|
||||||
/* This pair of functions encapsulates the operation of (a) compressing a
|
/* This pair of functions encapsulates the operation of (a) compressing a
|
||||||
* text string, and (b) issuing it later as a series of chunk data writes.
|
* text string, and (b) issuing it later as a series of chunk data writes.
|
||||||
@ -480,26 +501,6 @@ png_text_compress_init(compression_state *comp, png_const_bytep input,
|
|||||||
comp->output_len = 0;
|
comp->output_len = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void /* PRIVATE */
|
|
||||||
png_free_buffer_list(png_structrp png_ptr, png_compression_bufferp *listp)
|
|
||||||
{
|
|
||||||
png_compression_bufferp list = *listp;
|
|
||||||
|
|
||||||
if (list != NULL)
|
|
||||||
{
|
|
||||||
*listp = NULL;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
png_compression_bufferp next = list->next;
|
|
||||||
|
|
||||||
png_free(png_ptr, list);
|
|
||||||
list = next;
|
|
||||||
}
|
|
||||||
while (list != NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Compress the data in the compression state input */
|
/* Compress the data in the compression state input */
|
||||||
static int
|
static int
|
||||||
png_text_compress(png_structrp png_ptr, png_uint_32 chunk_name,
|
png_text_compress(png_structrp png_ptr, png_uint_32 chunk_name,
|
||||||
@ -1025,6 +1026,8 @@ png_compress_IDAT(png_structrp png_ptr, png_const_bytep input,
|
|||||||
{
|
{
|
||||||
/* First time. Ensure we have a temporary buffer for compression and
|
/* First time. Ensure we have a temporary buffer for compression and
|
||||||
* trim the buffer list if it has more than one entry to free memory.
|
* trim the buffer list if it has more than one entry to free memory.
|
||||||
|
* If 'WRITE_COMPRESSED_TEXT' is not set the list will never have been
|
||||||
|
* created at this point, but the check here is quick and safe.
|
||||||
*/
|
*/
|
||||||
if (png_ptr->zbuffer_list == NULL)
|
if (png_ptr->zbuffer_list == NULL)
|
||||||
{
|
{
|
||||||
@ -1033,10 +1036,8 @@ png_compress_IDAT(png_structrp png_ptr, png_const_bytep input,
|
|||||||
png_ptr->zbuffer_list->next = NULL;
|
png_ptr->zbuffer_list->next = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
|
|
||||||
else
|
else
|
||||||
png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list->next);
|
png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list->next);
|
||||||
#endif
|
|
||||||
|
|
||||||
/* It is a terminal error if we can't claim the zstream. */
|
/* It is a terminal error if we can't claim the zstream. */
|
||||||
if (png_deflate_claim(png_ptr, png_IDAT, png_image_size(png_ptr)) != Z_OK)
|
if (png_deflate_claim(png_ptr, png_IDAT, png_image_size(png_ptr)) != Z_OK)
|
||||||
@ -1640,7 +1641,7 @@ png_write_zTXt(png_structrp png_ptr, png_const_charp key, png_const_charp text,
|
|||||||
compression_state comp;
|
compression_state comp;
|
||||||
|
|
||||||
png_debug(1, "in png_write_zTXt");
|
png_debug(1, "in png_write_zTXt");
|
||||||
PNG_UNUSED(text_len); /* Always use strlen */
|
PNG_UNUSED(text_len) /* Always use strlen */
|
||||||
|
|
||||||
if (compression == PNG_TEXT_COMPRESSION_NONE)
|
if (compression == PNG_TEXT_COMPRESSION_NONE)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user