lvandeve / lodepng

PNG encoder and decoder in C and C++.
zlib License
2.06k stars 421 forks source link

Decoding bug resulting in chunk length too large #54

Open jeffboody opened 7 years ago

jeffboody commented 7 years ago

chunk_broken

I encountered the following error with the attached png and was able to reproduce it with the example_decode program.

error 30: chunk length too large, chunk broken off at end of file

I'm using the most recent version of lodepng from master branch.

commit 8a0f16afe74a6abf85e3b45e9558283022021a59 Author: Lode Vandevenne lvandeve@users.noreply.github.com Date: Thu Dec 22 13:46:52 2016 +0100

Update README.md

Gimp is able to read the file successfully so it seems like a potential decoding bug.

jeffboody commented 7 years ago

I found a workaround to load the png by breaking out of the while loop when encountering the error.

diff --git a/lodepng.cpp b/lodepng.cpp
index 02f7298..5455dd1 100644
--- a/lodepng.cpp
+++ b/lodepng.cpp
@@ -4562,7 +4562,7 @@ 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) break;

     /*length of the data of the chunk, excluding the length bytes, chunk type and CRC bytes*/
     chunkLength = lodepng_chunk_length(chunk);