From 249e95f608200ec9e4c43bbbe75a66ab67ad0745 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Fri, 15 Sep 2017 23:08:58 -0400 Subject: Fix test failure on MSVC --- libqpdf/Pl_DCT.cc | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'libqpdf/Pl_DCT.cc') diff --git a/libqpdf/Pl_DCT.cc b/libqpdf/Pl_DCT.cc index b9d54b86..8e1a5177 100644 --- a/libqpdf/Pl_DCT.cc +++ b/libqpdf/Pl_DCT.cc @@ -68,6 +68,20 @@ Pl_DCT::finish() { this->buf.finish(); + // Using a PointerHolder here and passing it into compress + // and decompress causes a memory leak with setjmp/longjmp. Just + // use a pointer and delete it. + Buffer* b = this->buf.getBuffer(); + if (b->getSize() == 0) + { + // Special case: empty data will never succeed and probably + // means we're calling finish a second time from an exception + // handler. + delete b; + this->getNext()->finish(); + return; + } + struct jpeg_compress_struct cinfo_compress; struct jpeg_decompress_struct cinfo_decompress; struct qpdf_jpeg_error_mgr jerr; @@ -77,10 +91,6 @@ Pl_DCT::finish() jerr.pub.error_exit = error_handler; bool error = false; - // Using a PointerHolder here and passing it into compress - // and decompress causes a memory leak with setjmp/longjmp. Just - // use a pointer and delete it. - Buffer* b = this->buf.getBuffer(); // The jpeg library is a "C" library, so we use setjmp and longjmp // for exception handling. if (setjmp(jerr.jmpbuf) == 0) -- cgit v1.2.3-54-g00ecf