From 84e17126593c40e38305fad6a16e81545a8f687c Mon Sep 17 00:00:00 2001 From: Patrick Spettel Date: Tue, 16 Aug 2016 10:49:11 +0200 Subject: [PATCH] Fix temporary file removal in imdecode for tiff The TiffDecoder keeps an open file handle. As a consequence the file cannot be removed before the TiffDecoder closes the file. --- modules/imgcodecs/src/loadsave.cpp | 20 ++++++++++++++++---- modules/imgcodecs/test/test_grfmt.cpp | 13 +++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/modules/imgcodecs/src/loadsave.cpp b/modules/imgcodecs/src/loadsave.cpp index 1c0b794b8e..244d05dd83 100644 --- a/modules/imgcodecs/src/loadsave.cpp +++ b/modules/imgcodecs/src/loadsave.cpp @@ -514,8 +514,14 @@ imdecode_( const Mat& buf, int flags, int hdrtype, Mat* mat=0 ) if( !decoder->readHeader() ) { - if( !filename.empty() ) - remove(filename.c_str()); + decoder.release(); + if ( !filename.empty() ) + { + if ( remove(filename.c_str()) != 0 ) + { + CV_Error( CV_StsError, "unable to remove temporary file" ); + } + } return 0; } @@ -556,8 +562,14 @@ imdecode_( const Mat& buf, int flags, int hdrtype, Mat* mat=0 ) } bool code = decoder->readData( *data ); - if( !filename.empty() ) - remove(filename.c_str()); + decoder.release(); + if ( !filename.empty() ) + { + if ( remove(filename.c_str()) != 0 ) + { + CV_Error( CV_StsError, "unable to remove temporary file" ); + } + } if( !code ) { diff --git a/modules/imgcodecs/test/test_grfmt.cpp b/modules/imgcodecs/test/test_grfmt.cpp index f305ca137a..14860f9a8b 100644 --- a/modules/imgcodecs/test/test_grfmt.cpp +++ b/modules/imgcodecs/test/test_grfmt.cpp @@ -890,6 +890,19 @@ TEST(Imgcodecs_Tiff, decode_multipage) CV_GrfmtReadTifMultiPage test; test.safe_run(); } +TEST(Imgcodecs_Tiff, imdecode_no_exception_temporary_file_removed) +{ + cvtest::TS& ts = *cvtest::TS::ptr(); + string input = string(ts.get_data_path()) + "../cv/shared/lena.png"; + cv::Mat img = cv::imread(input); + ASSERT_FALSE(img.empty()); + + std::vector buf; + EXPECT_NO_THROW(cv::imencode(".tiff", img, buf)); + + EXPECT_NO_THROW(cv::imdecode(buf, IMREAD_UNCHANGED)); +} + #endif #ifdef HAVE_WEBP