[libpng16] Work around gcc 3.x and Microsoft Visual Studio 2010 complaints.
Both object to the split initialization of num_chunks.
diff --git a/ANNOUNCE b/ANNOUNCE
index b6306ac..1ed729b 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -439,6 +439,8 @@
png_strlen(), png_memset(), png_memcpy(), and png_memcmp() macros.
Removed the png_sizeof(), png_strlen(), png_memset(), png_memcpy(), and
png_memcmp() macros.
+ Work around gcc 3.x and Microsoft Visual Studio 2010 complaints. Both object
+ to the split initialization of num_chunks.
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
(subscription required; visit
diff --git a/CHANGES b/CHANGES
index dcec435..cbebc26 100644
--- a/CHANGES
+++ b/CHANGES
@@ -4190,6 +4190,8 @@
png_strlen(), png_memset(), png_memcpy(), and png_memcmp() macros.
Removed the png_sizeof(), png_strlen(), png_memset(), png_memcpy(), and
png_memcmp() macros.
+ Work around gcc 3.x and Microsoft Visual Studio 2010 complaints. Both object
+ to the split initialization of num_chunks.
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
(subscription required; visit
diff --git a/pngset.c b/pngset.c
index a7240f4..40c7d39 100644
--- a/pngset.c
+++ b/pngset.c
@@ -1161,14 +1161,39 @@
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
void PNGAPI
-png_set_keep_unknown_chunks(png_structrp png_ptr, int keep,
+png_set_keep_unknown_chunks(png_structrp png_ptr, int keepIn,
png_const_bytep chunk_list, int num_chunksIn)
{
png_bytep new_list, p;
+ png_byte keep;
unsigned int i, num_chunks, old_num_chunks;
if (png_ptr == NULL)
return;
+ switch (keepIn)
+ {
+ case PNG_HANDLE_CHUNK_AS_DEFAULT:
+ keep = PNG_HANDLE_CHUNK_AS_DEFAULT;
+ break;
+
+ case PNG_HANDLE_CHUNK_NEVER:
+ keep = PNG_HANDLE_CHUNK_NEVER;
+ break;
+
+ case PNG_HANDLE_CHUNK_IF_SAFE:
+ keep = PNG_HANDLE_CHUNK_IF_SAFE;
+ break;
+
+ case PNG_HANDLE_CHUNK_ALWAYS:
+ keep = PNG_HANDLE_CHUNK_ALWAYS;
+ break;
+
+
+ default:
+ png_app_error(png_ptr, "png_set_keep_unknown_chunks: invalid keep");
+ return;
+ }
+
if (num_chunksIn <= 0)
{
if (keep == PNG_HANDLE_CHUNK_ALWAYS || keep == PNG_HANDLE_CHUNK_IF_SAFE)
@@ -1188,41 +1213,52 @@
}
if (num_chunksIn < 0)
- {
- /* Ignore all unknown chunks and all chunks recognized by
- * libpng except for IHDR, PLTE, tRNS, IDAT, and IEND
- */
- static PNG_CONST png_byte chunks_to_ignore[] = {
- 98, 75, 71, 68, '\0', /* bKGD */
- 99, 72, 82, 77, '\0', /* cHRM */
- 103, 65, 77, 65, '\0', /* gAMA */
- 104, 73, 83, 84, '\0', /* hIST */
- 105, 67, 67, 80, '\0', /* iCCP */
- 105, 84, 88, 116, '\0', /* iTXt */
- 111, 70, 70, 115, '\0', /* oFFs */
- 112, 67, 65, 76, '\0', /* pCAL */
- 112, 72, 89, 115, '\0', /* pHYs */
- 115, 66, 73, 84, '\0', /* sBIT */
- 115, 67, 65, 76, '\0', /* sCAL */
- 115, 80, 76, 84, '\0', /* sPLT */
- 115, 84, 69, 82, '\0', /* sTER */
- 115, 82, 71, 66, '\0', /* sRGB */
- 116, 69, 88, 116, '\0', /* tEXt */
- 116, 73, 77, 69, '\0', /* tIME */
- 122, 84, 88, 116, '\0' /* zTXt */
- };
+ {
+ /* Ignore all unknown chunks and all chunks recognized by
+ * libpng except for IHDR, PLTE, tRNS, IDAT, and IEND
+ */
+ static PNG_CONST png_byte chunks_to_ignore[] = {
+ 98, 75, 71, 68, '\0', /* bKGD */
+ 99, 72, 82, 77, '\0', /* cHRM */
+ 103, 65, 77, 65, '\0', /* gAMA */
+ 104, 73, 83, 84, '\0', /* hIST */
+ 105, 67, 67, 80, '\0', /* iCCP */
+ 105, 84, 88, 116, '\0', /* iTXt */
+ 111, 70, 70, 115, '\0', /* oFFs */
+ 112, 67, 65, 76, '\0', /* pCAL */
+ 112, 72, 89, 115, '\0', /* pHYs */
+ 115, 66, 73, 84, '\0', /* sBIT */
+ 115, 67, 65, 76, '\0', /* sCAL */
+ 115, 80, 76, 84, '\0', /* sPLT */
+ 115, 84, 69, 82, '\0', /* sTER */
+ 115, 82, 71, 66, '\0', /* sRGB */
+ 116, 69, 88, 116, '\0', /* tEXt */
+ 116, 73, 77, 69, '\0', /* tIME */
+ 122, 84, 88, 116, '\0' /* zTXt */
+ };
- chunk_list = chunks_to_ignore;
- num_chunks = (unsigned int)(sizeof chunks_to_ignore)/5;
- }
+ chunk_list = chunks_to_ignore;
+ num_chunks = (sizeof chunks_to_ignore)/5;
+ }
- if (chunk_list == NULL)
- return;
+ else /* num_chunksIn > 0 */
+ {
+ if (chunk_list == NULL)
+ return;
- if (num_chunksIn > 0)
- num_chunks = (unsigned int)num_chunksIn;
+ num_chunks = num_chunksIn;
+ }
old_num_chunks = png_ptr->num_chunk_list;
+
+ /* Since num_chunks is always restricted to UINT_MAX/5 this can't overflow.
+ */
+ if (num_chunks + old_num_chunks > UINT_MAX/5)
+ {
+ png_app_error(png_ptr, "png_set_keep_unknown_chunks: too many chunks");
+ return;
+ }
+
new_list = png_voidcast(png_bytep, png_malloc(png_ptr,
5 * (num_chunks + old_num_chunks)));
@@ -1233,11 +1269,10 @@
png_ptr->chunk_list=NULL;
}
- memcpy(new_list + 5*old_num_chunks, chunk_list,
- 5*(unsigned int)num_chunks);
+ memcpy(new_list + 5*old_num_chunks, chunk_list, 5*num_chunks);
for (p = new_list + 5*old_num_chunks + 4, i = 0; i<num_chunks; i++, p += 5)
- *p=(png_byte)keep;
+ *p=keep;
png_ptr->num_chunk_list = old_num_chunks + num_chunks;
png_ptr->chunk_list = new_list;
@@ -1306,14 +1341,14 @@
"Compression buffer size cannot be changed because it is in use");
return;
}
-
+
if (size > ZLIB_IO_MAX)
{
png_warning(png_ptr,
"Compression buffer size limited to system maximum");
size = ZLIB_IO_MAX; /* must fit */
}
-
+
else if (size < 6)
{
/* Deflate will potentially go into an infinite loop on a SYNC_FLUSH
@@ -1323,7 +1358,7 @@
"Compression buffer size cannot be reduced below 6");
return;
}
-
+
if (png_ptr->zbuffer_size != size)
{
png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list);