Commit c9481b0f authored by Andreas Stührk's avatar Andreas Stührk Committed by Dikay900

Don't allocate lots of memory when reading TIFFs with infinite rows per strip.

Some TIFF images consist of only one strip. The magic value 2**32-1 for the
"rows per strip" tag reflects that fact, effectively meaning "infinite".

Conflicts:
	modules/highgui/src/grfmt_tiff.cpp
	modules/highgui/test/test_grfmt.cpp

fix whitespace

fix compile error
parent 8138e261
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#include "precomp.hpp" #include "precomp.hpp"
#include "grfmt_tiff.hpp" #include "grfmt_tiff.hpp"
#include <opencv2/imgproc.hpp> #include <opencv2/imgproc.hpp>
#include <limits>
namespace cv namespace cv
{ {
...@@ -242,7 +243,8 @@ bool TiffDecoder::readData( Mat& img ) ...@@ -242,7 +243,8 @@ bool TiffDecoder::readData( Mat& img )
if( tile_width0 <= 0 ) if( tile_width0 <= 0 )
tile_width0 = m_width; tile_width0 = m_width;
if( tile_height0 <= 0 ) if( tile_height0 <= 0 ||
(!is_tiled && tile_height0 == std::numeric_limits<uint32>::max()) )
tile_height0 = m_height; tile_height0 = m_height;
AutoBuffer<uchar> _buffer( size_t(8) * tile_height0*tile_width0); AutoBuffer<uchar> _buffer( size_t(8) * tile_height0*tile_width0);
......
...@@ -675,6 +675,36 @@ TEST(Imgcodecs_Tiff, decode_tile_remainder) ...@@ -675,6 +675,36 @@ TEST(Imgcodecs_Tiff, decode_tile_remainder)
CV_GrfmtReadTifTiledWithNotFullTiles test; test.safe_run(); CV_GrfmtReadTifTiledWithNotFullTiles test; test.safe_run();
} }
TEST(Imgcodecs_Tiff, decode_infinite_rowsperstrip)
{
const uchar sample_data[142] = {
0x49, 0x49, 0x2a, 0x00, 0x10, 0x00, 0x00, 0x00, 0x56, 0x54,
0x56, 0x5a, 0x59, 0x55, 0x5a, 0x00, 0x0a, 0x00, 0x00, 0x01,
0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x01, 0x01, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00,
0x00, 0x00, 0x02, 0x01, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x03, 0x01, 0x03, 0x00, 0x01, 0x00,
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00,
0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x01,
0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
0x15, 0x01, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00,
0x00, 0x00, 0x16, 0x01, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0x17, 0x01, 0x04, 0x00, 0x01, 0x00,
0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1c, 0x01, 0x03, 0x00,
0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00
};
const string filename = cv::tempfile(".tiff");
std::ofstream outfile(filename.c_str(), std::ofstream::binary);
outfile.write(reinterpret_cast<const char *>(sample_data), sizeof sample_data);
outfile.close();
EXPECT_NO_THROW(cv::imread(filename, IMREAD_UNCHANGED));
remove(filename.c_str());
}
class CV_GrfmtReadTifMultiPage : public cvtest::BaseTest class CV_GrfmtReadTifMultiPage : public cvtest::BaseTest
{ {
private: private:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment