mirror of
https://git.code.sf.net/p/libpng/code.git
synced 2025-07-10 18:04:09 +02:00
[libpng17] Clean up USER_LIMITS feature, removing members from png_struct
when not required.
This commit is contained in:
committed by
Glenn Randers-Pehrson
parent
240ac287eb
commit
eac85878bf
2
ANNOUNCE
2
ANNOUNCE
@@ -53,6 +53,8 @@ Version 1.7.0alpha01 [December 15, 2012]
|
|||||||
in png.h have been made more clear. Minor fixes to
|
in png.h have been made more clear. Minor fixes to
|
||||||
contrib/libtests/timepng.c and some of the png_*_tRNS logic, including
|
contrib/libtests/timepng.c and some of the png_*_tRNS logic, including
|
||||||
more error detection in png_set_tRNS.
|
more error detection in png_set_tRNS.
|
||||||
|
Clean up USER_LIMITS feature, removing members from png_struct when not
|
||||||
|
required.
|
||||||
|
|
||||||
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
||||||
(subscription required; visit
|
(subscription required; visit
|
||||||
|
|||||||
2
CHANGES
2
CHANGES
@@ -4338,6 +4338,8 @@ Version 1.7.0alpha01 [December 15, 2012]
|
|||||||
in png.h have been made more clear. Minor fixes to
|
in png.h have been made more clear. Minor fixes to
|
||||||
contrib/libtests/timepng.c and some of the png_*_tRNS logic, including
|
contrib/libtests/timepng.c and some of the png_*_tRNS logic, including
|
||||||
more error detection in png_set_tRNS.
|
more error detection in png_set_tRNS.
|
||||||
|
Clean up USER_LIMITS feature, removing members from png_struct when not
|
||||||
|
required.
|
||||||
|
|
||||||
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
||||||
(subscription required; visit
|
(subscription required; visit
|
||||||
|
|||||||
17
png.c
17
png.c
@@ -236,6 +236,23 @@ png_create_png_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
|
|||||||
*/
|
*/
|
||||||
memset(&create_struct, 0, (sizeof create_struct));
|
memset(&create_struct, 0, (sizeof create_struct));
|
||||||
|
|
||||||
|
/* These limits are only used on read at present, and if READ is not turned
|
||||||
|
* on neither will USER_LIMITS be. The width/height and chunk malloc limits
|
||||||
|
* are constants, so if they cannot be set they don't get defined in
|
||||||
|
* png_struct, the user_chunk_cache limits is a down-counter, when it reaches
|
||||||
|
* 1 no more chunks will be handled. 0 means unlimited, consequently the
|
||||||
|
* limit is 1 more than the number of chunks that will be handled.
|
||||||
|
*/
|
||||||
|
# ifdef PNG_SET_USER_LIMITS_SUPPORTED
|
||||||
|
create_struct.user_width_max = PNG_USER_WIDTH_MAX;
|
||||||
|
create_struct.user_height_max = PNG_USER_HEIGHT_MAX;
|
||||||
|
create_struct.user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX;
|
||||||
|
# endif
|
||||||
|
# ifdef PNG_USER_LIMITS_SUPPORTED
|
||||||
|
/* Must exist even if the initial value is constant */
|
||||||
|
create_struct.user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX;
|
||||||
|
# endif
|
||||||
|
|
||||||
/* Added at libpng-1.2.6 */
|
/* Added at libpng-1.2.6 */
|
||||||
# ifdef PNG_USER_LIMITS_SUPPORTED
|
# ifdef PNG_USER_LIMITS_SUPPORTED
|
||||||
create_struct.user_width_max = PNG_USER_WIDTH_MAX;
|
create_struct.user_width_max = PNG_USER_WIDTH_MAX;
|
||||||
|
|||||||
15
pngrutil.c
15
pngrutil.c
@@ -562,7 +562,7 @@ png_decompress_chunk(png_structrp png_ptr,
|
|||||||
*/
|
*/
|
||||||
png_alloc_size_t limit = PNG_SIZE_MAX;
|
png_alloc_size_t limit = PNG_SIZE_MAX;
|
||||||
|
|
||||||
# ifdef PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED
|
# ifdef PNG_SET_USER_LIMITS_SUPPOPRTED
|
||||||
if (png_ptr->user_chunk_malloc_max > 0 &&
|
if (png_ptr->user_chunk_malloc_max > 0 &&
|
||||||
png_ptr->user_chunk_malloc_max < limit)
|
png_ptr->user_chunk_malloc_max < limit)
|
||||||
limit = png_ptr->user_chunk_malloc_max;
|
limit = png_ptr->user_chunk_malloc_max;
|
||||||
@@ -1582,7 +1582,8 @@ png_handle_sPLT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
|||||||
|
|
||||||
if (--png_ptr->user_chunk_cache_max == 1)
|
if (--png_ptr->user_chunk_cache_max == 1)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr, "No space in chunk cache for sPLT");
|
/* Warn the first time */
|
||||||
|
png_chunk_benign_error(png_ptr, "chunk cache full");
|
||||||
png_crc_finish(png_ptr, length);
|
png_crc_finish(png_ptr, length);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2372,7 +2373,7 @@ png_handle_tEXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
|||||||
if (--png_ptr->user_chunk_cache_max == 1)
|
if (--png_ptr->user_chunk_cache_max == 1)
|
||||||
{
|
{
|
||||||
png_crc_finish(png_ptr, length);
|
png_crc_finish(png_ptr, length);
|
||||||
png_chunk_benign_error(png_ptr, "no space in chunk cache");
|
png_chunk_benign_error(png_ptr, "chunk cache full");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2451,7 +2452,7 @@ png_handle_zTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
|||||||
if (--png_ptr->user_chunk_cache_max == 1)
|
if (--png_ptr->user_chunk_cache_max == 1)
|
||||||
{
|
{
|
||||||
png_crc_finish(png_ptr, length);
|
png_crc_finish(png_ptr, length);
|
||||||
png_chunk_benign_error(png_ptr, "no space in chunk cache");
|
png_chunk_benign_error(png_ptr, "chunk cache full");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2560,7 +2561,7 @@ png_handle_iTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
|||||||
if (--png_ptr->user_chunk_cache_max == 1)
|
if (--png_ptr->user_chunk_cache_max == 1)
|
||||||
{
|
{
|
||||||
png_crc_finish(png_ptr, length);
|
png_crc_finish(png_ptr, length);
|
||||||
png_chunk_benign_error(png_ptr, "no space in chunk cache");
|
png_chunk_benign_error(png_ptr, "chunk cache full");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2700,7 +2701,7 @@ png_cache_unknown_chunk(png_structrp png_ptr, png_uint_32 length)
|
|||||||
png_ptr->unknown_chunk.data = NULL;
|
png_ptr->unknown_chunk.data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED
|
# ifdef PNG_SET_USER_LIMITS_SUPPOPRTED
|
||||||
if (png_ptr->user_chunk_malloc_max > 0 &&
|
if (png_ptr->user_chunk_malloc_max > 0 &&
|
||||||
png_ptr->user_chunk_malloc_max < limit)
|
png_ptr->user_chunk_malloc_max < limit)
|
||||||
limit = png_ptr->user_chunk_malloc_max;
|
limit = png_ptr->user_chunk_malloc_max;
|
||||||
@@ -2895,7 +2896,7 @@ png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr,
|
|||||||
{
|
{
|
||||||
case 2:
|
case 2:
|
||||||
png_ptr->user_chunk_cache_max = 1;
|
png_ptr->user_chunk_cache_max = 1;
|
||||||
png_chunk_benign_error(png_ptr, "no space in chunk cache");
|
png_chunk_benign_error(png_ptr, "chunk cache full");
|
||||||
/* FALL THROUGH */
|
/* FALL THROUGH */
|
||||||
case 1:
|
case 1:
|
||||||
/* NOTE: prior to 1.6.0 this case resulted in an unknown critical
|
/* NOTE: prior to 1.6.0 this case resulted in an unknown critical
|
||||||
|
|||||||
28
pngset.c
28
pngset.c
@@ -1524,24 +1524,19 @@ png_set_user_limits (png_structrp png_ptr, png_uint_32 user_width_max,
|
|||||||
* rejected by png_set_IHDR(). To accept any PNG datastream
|
* rejected by png_set_IHDR(). To accept any PNG datastream
|
||||||
* regardless of dimensions, set both limits to 0x7ffffffL.
|
* regardless of dimensions, set both limits to 0x7ffffffL.
|
||||||
*/
|
*/
|
||||||
if (png_ptr == NULL)
|
if (png_ptr != NULL)
|
||||||
return;
|
{
|
||||||
|
png_ptr->user_width_max = user_width_max;
|
||||||
png_ptr->user_width_max = user_width_max;
|
png_ptr->user_height_max = user_height_max;
|
||||||
png_ptr->user_height_max = user_height_max;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This function was added to libpng 1.4.0 */
|
/* This function was added to libpng 1.4.0 */
|
||||||
void PNGAPI
|
void PNGAPI
|
||||||
png_set_chunk_cache_max (png_structrp png_ptr, png_uint_32 user_chunk_cache_max)
|
png_set_chunk_cache_max (png_structrp png_ptr, png_uint_32 user_chunk_cache_max)
|
||||||
{
|
{
|
||||||
# ifdef PNG_READ_SUPPORTED
|
if (png_ptr != NULL)
|
||||||
if (png_ptr)
|
png_ptr->user_chunk_cache_max = user_chunk_cache_max;
|
||||||
png_ptr->user_chunk_cache_max = user_chunk_cache_max;
|
|
||||||
# else
|
|
||||||
PNG_UNUSED(png_ptr)
|
|
||||||
PNG_UNUSED(user_chunk_cache_max)
|
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This function was added to libpng 1.4.1 */
|
/* This function was added to libpng 1.4.1 */
|
||||||
@@ -1549,13 +1544,8 @@ void PNGAPI
|
|||||||
png_set_chunk_malloc_max (png_structrp png_ptr,
|
png_set_chunk_malloc_max (png_structrp png_ptr,
|
||||||
png_alloc_size_t user_chunk_malloc_max)
|
png_alloc_size_t user_chunk_malloc_max)
|
||||||
{
|
{
|
||||||
# ifdef PNG_READ_SUPPORTED
|
if (png_ptr != NULL)
|
||||||
if (png_ptr)
|
png_ptr->user_chunk_malloc_max = user_chunk_malloc_max;
|
||||||
png_ptr->user_chunk_malloc_max = user_chunk_malloc_max;
|
|
||||||
# else
|
|
||||||
PNG_UNUSED(png_ptr)
|
|
||||||
PNG_UNUSED(user_chunk_malloc_max)
|
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */
|
#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */
|
||||||
|
|
||||||
|
|||||||
17
pngstruct.h
17
pngstruct.h
@@ -243,18 +243,21 @@ struct png_struct_def
|
|||||||
#endif
|
#endif
|
||||||
#endif /* PNG_READ_SUPPORTED */
|
#endif /* PNG_READ_SUPPORTED */
|
||||||
|
|
||||||
#ifdef PNG_USER_LIMITS_SUPPORTED
|
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
|
||||||
/* The limits only affect read from libpng 1.7 */
|
png_uint_32 user_width_max; /* Maximum width on read */
|
||||||
/* Total memory that a zTXt, sPLT, iTXt, iCCP, or unknown chunk
|
png_uint_32 user_height_max; /* Maximum height on read */
|
||||||
* can occupy when decompressed. 0 means unlimited.
|
/* Total memory that a single zTXt, sPLT, iTXt, iCCP, or unknown chunk
|
||||||
|
* can occupy when decompressed. 0 means unlimited. This field is a counter
|
||||||
|
* - it is decremented as memory is allocated.
|
||||||
*/
|
*/
|
||||||
png_alloc_size_t user_chunk_malloc_max;
|
png_alloc_size_t user_chunk_malloc_max;
|
||||||
|
#endif
|
||||||
|
#ifdef PNG_USER_LIMITS_SUPPORTED
|
||||||
/* limit on total *number* of sPLT, text and unknown chunks that can be
|
/* limit on total *number* of sPLT, text and unknown chunks that can be
|
||||||
* stored. 0 means unlimited.
|
* stored. 0 means unlimited. This field is a counter - it is decremented
|
||||||
|
* as chunks are encountered.
|
||||||
*/
|
*/
|
||||||
png_uint_32 user_chunk_cache_max;
|
png_uint_32 user_chunk_cache_max;
|
||||||
png_uint_32 user_width_max;
|
|
||||||
png_uint_32 user_height_max;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The progressive reader gets passed data and calls application handling
|
/* The progressive reader gets passed data and calls application handling
|
||||||
|
|||||||
@@ -276,40 +276,28 @@ option USER_MEM
|
|||||||
|
|
||||||
option IO_STATE
|
option IO_STATE
|
||||||
|
|
||||||
# This is only for PowerPC big-endian and 680x0 systems
|
# Libpng limits: limit the size of images and data on read.
|
||||||
# some testing, not enabled by default.
|
#
|
||||||
# NO LONGER USED
|
# If this option is disabled all the limit checking code will be disabled:
|
||||||
|
|
||||||
#option READ_BIG_ENDIAN disabled
|
|
||||||
|
|
||||||
# Allow users to control limits on what the READ code will
|
|
||||||
# read:
|
|
||||||
|
|
||||||
# Added at libpng-1.2.43; adds limit fields to png_struct,
|
|
||||||
# allows some usages of these fields, from 1.7.0 only limits read
|
|
||||||
|
|
||||||
option USER_LIMITS requires READ
|
option USER_LIMITS requires READ
|
||||||
|
|
||||||
# Added at libpng-1.2.6; adds setting APIs, allows additional
|
# If the following settings are *not* set libpng will not limit the size of
|
||||||
# usage of this field (UTSL)
|
|
||||||
|
|
||||||
option SET_USER_LIMITS requires USER_LIMITS
|
|
||||||
|
|
||||||
# Feature added at libpng-1.4.0, this flag added at 1.4.1
|
|
||||||
option SET_USER_LIMITS enables SET_CHUNK_CACHE_LIMIT
|
|
||||||
# Feature added at libpng-1.4.1, this flag added at 1.4.1
|
|
||||||
|
|
||||||
option SET_USER_LIMITS enables SET_CHUNK_MALLOC_LIMIT
|
|
||||||
|
|
||||||
# Libpng limits.
|
|
||||||
#
|
|
||||||
# If these settings are *not* set libpng will not limit the size of
|
|
||||||
# images or the size of data in ancilliary chunks. This does lead to
|
# images or the size of data in ancilliary chunks. This does lead to
|
||||||
# security issues if PNG files come from untrusted sources.
|
# security issues if PNG files come from untrusted sources. Settings have the
|
||||||
|
# following interpretations:
|
||||||
|
#
|
||||||
|
# USER_WIDTH_MAX: maximum width of an image that will be read
|
||||||
|
# USER_HEIGHT_MAX: maximum height
|
||||||
|
# USER_CHUNK_MALLOC_MAX: maximum in-memory (decompressed) size of a single chunk
|
||||||
|
# USER_CHUNK_CACHE_MAX: maximum number of chunks to be cached
|
||||||
|
#
|
||||||
|
# Only chunks that are variable in number are counted towards the
|
||||||
|
# USER_CHUNK_CACHE_MAX limit
|
||||||
setting USER_WIDTH_MAX
|
setting USER_WIDTH_MAX
|
||||||
setting USER_HEIGHT_MAX
|
setting USER_HEIGHT_MAX
|
||||||
setting USER_CHUNK_CACHE_MAX
|
|
||||||
setting USER_CHUNK_MALLOC_MAX
|
setting USER_CHUNK_MALLOC_MAX
|
||||||
|
setting USER_CHUNK_CACHE_MAX
|
||||||
|
|
||||||
# To default all these settings to values that are large but probably
|
# To default all these settings to values that are large but probably
|
||||||
# safe turn the SAFE_LIMITS option on; this will cause the value in
|
# safe turn the SAFE_LIMITS option on; this will cause the value in
|
||||||
@@ -318,6 +306,10 @@ setting USER_CHUNK_MALLOC_MAX
|
|||||||
option SAFE_LIMITS enables USER_LIMITS disabled
|
option SAFE_LIMITS enables USER_LIMITS disabled
|
||||||
= SAFE_LIMITS SAFE_LIMITS
|
= SAFE_LIMITS SAFE_LIMITS
|
||||||
|
|
||||||
|
# If this option is enabled APIs to set the above limits at run time are added;
|
||||||
|
# without these the hardwired (compile time) limits will be used.
|
||||||
|
option SET_USER_LIMITS requires USER_LIMITS
|
||||||
|
|
||||||
# All of the following options relate to code capabilities for
|
# All of the following options relate to code capabilities for
|
||||||
# processing image data before creating a PNG or after reading one.
|
# processing image data before creating a PNG or after reading one.
|
||||||
# You can remove these capabilities safely and still be PNG
|
# You can remove these capabilities safely and still be PNG
|
||||||
|
|||||||
Reference in New Issue
Block a user