[libpng16] Revised contrib/oss-fuzz/libpng_read_fuzzer.cc
diff --git a/contrib/oss-fuzz/libpng_read_fuzzer.cc b/contrib/oss-fuzz/libpng_read_fuzzer.cc
index 8894b82..1ca3f86 100644
--- a/contrib/oss-fuzz/libpng_read_fuzzer.cc
+++ b/contrib/oss-fuzz/libpng_read_fuzzer.cc
@@ -23,21 +23,6 @@
#define PNG_INTERNAL
#include "png.h"
-#define PNG_CLEANUP \
- if(png_handler.png_ptr) \
- { \
- if (row_ptr && png_ptr) \
- png_free(png_ptr, row_ptr); \
- if (png_handler.end_info_ptr) \
- png_destroy_read_struct(&png_handler.png_ptr, &png_handler.info_ptr,\
- &png_handler.end_info_ptr); \
- else if (png_handler.info_ptr) \
- png_destroy_read_struct(&png_handler.png_ptr, &png_handler.info_ptr,\
- nullptr); \
- else \
- png_destroy_read_struct(&png_handler.png_ptr, nullptr, nullptr); \
- }
-
struct BufState {
const uint8_t* data;
size_t bytes_left;
@@ -51,7 +36,6 @@
BufState* buf_state = nullptr;
~PngObjectHandler() {
- PNG_CLEANUP
delete buf_state;
}
};
@@ -71,6 +55,7 @@
// Entry point for LibFuzzer.
// Roughly follows the libpng book example:
// http://www.libpng.org/pub/png/book/chapter13.html
+
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
if (size < kPngHeaderSize) {
return 0;
@@ -91,13 +76,14 @@
png_handler.info_ptr = png_create_info_struct(png_handler.png_ptr);
if (!png_handler.info_ptr) {
- PNG_CLEANUP
+ png_destroy_read_struct(&png_handler.png_ptr, nullptr, nullptr);
return 0;
}
png_handler.end_info_ptr = png_create_info_struct(png_handler.png_ptr);
if (!png_handler.info_ptr) {
- PNG_CLEANUP
+ png_destroy_read_struct(&png_handler.png_ptr, &png_handler.info_ptr,
+ nullptr);
return 0;
}
@@ -113,6 +99,21 @@
png_set_read_fn(png_handler.png_ptr, png_handler.buf_state, user_read_data);
png_set_sig_bytes(png_handler.png_ptr, kPngHeaderSize);
+#define PNG_CLEANUP
+ if(png_handler.png_ptr) \
+ { \
+ if (png_handler.row_ptr) \
+ png_free(png_handler.png_ptr, png_handler.row_ptr); \
+ if (png_handler.end_info_ptr) \
+ png_destroy_read_struct(&png_handler.png_ptr, &png_handler.info_ptr,\
+ &png_handler.end_info_ptr); \
+ else if (png_handler.info_ptr) \
+ png_destroy_read_struct(&png_handler.png_ptr, &png_handler.info_ptr,\
+ nullptr); \
+ else \
+ png_destroy_read_struct(&png_handler.png_ptr, nullptr, nullptr); \
+ }
+
if (setjmp(png_jmpbuf(png_handler.png_ptr))) {
PNG_CLEANUP
return 0;