summaryrefslogtreecommitdiff
path: root/lodepng.cpp
diff options
context:
space:
mode:
authorLode <lvandeve@gmail.com>2018-01-15 01:26:30 +0100
committerLode <lvandeve@gmail.com>2018-01-15 01:26:30 +0100
commitd4d8f1aa786571af4a90a41b3db048043f114629 (patch)
tree9e40c8741cc3b6fa632b4bc3dd1fe8a5ad524358 /lodepng.cpp
parentc7bb19ad54a53f0d9917da37de7288b1aadf6d0f (diff)
allow optionally ignoring a few more recoverable errors
Diffstat (limited to 'lodepng.cpp')
-rw-r--r--lodepng.cpp25
1 files changed, 19 insertions, 6 deletions
diff --git a/lodepng.cpp b/lodepng.cpp
index 37b0562..6998910 100644
--- a/lodepng.cpp
+++ b/lodepng.cpp
@@ -1,7 +1,7 @@
/*
-LodePNG version 20170917
+LodePNG version 20180114
-Copyright (c) 2005-2017 Lode Vandevenne
+Copyright (c) 2005-2018 Lode Vandevenne
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
@@ -39,7 +39,7 @@ Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for
#pragma warning( disable : 4996 ) /*VS does not like fopen, but fopen_s is not standard C so unusable here*/
#endif /*_MSC_VER */
-const char* LODEPNG_VERSION_STRING = "20170917";
+const char* LODEPNG_VERSION_STRING = "20180114";
/*
This source file is built up in the following large parts. The code sections
@@ -4565,12 +4565,20 @@ static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h,
const unsigned char* data; /*the data in the chunk*/
/*error: size of the in buffer too small to contain next chunk*/
- if((size_t)((chunk - in) + 12) > insize || chunk < in) CERROR_BREAK(state->error, 30);
+ if((size_t)((chunk - in) + 12) > insize || chunk < in)
+ {
+ if(state->decoder.ignore_end) break; /*other errors may still happen though*/
+ CERROR_BREAK(state->error, 30);
+ }
/*length of the data of the chunk, excluding the length bytes, chunk type and CRC bytes*/
chunkLength = lodepng_chunk_length(chunk);
/*error: chunk length larger than the max PNG chunk size*/
- if(chunkLength > 2147483647) CERROR_BREAK(state->error, 63);
+ if(chunkLength > 2147483647)
+ {
+ if(state->decoder.ignore_end) break; /*other errors may still happen though*/
+ CERROR_BREAK(state->error, 63);
+ }
if((size_t)((chunk - in) + chunkLength + 12) > insize || (chunk + chunkLength + 12) < in)
{
@@ -4657,7 +4665,10 @@ static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h,
else /*it's not an implemented chunk type, so ignore it: skip over the data*/
{
/*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/
- if(!lodepng_chunk_ancillary(chunk)) CERROR_BREAK(state->error, 69);
+ if(!state->decoder.ignore_critical && !lodepng_chunk_ancillary(chunk))
+ {
+ CERROR_BREAK(state->error, 69);
+ }
unknown = 1;
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
@@ -4822,6 +4833,8 @@ void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings)
settings->remember_unknown_chunks = 0;
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
settings->ignore_crc = 0;
+ settings->ignore_critical = 0;
+ settings->ignore_end = 0;
lodepng_decompress_settings_init(&settings->zlibsettings);
}