From dbcae60c5510e2633a80af6fe6bbde8f91870fa0 Mon Sep 17 00:00:00 2001 From: peterhillman Date: Tue, 2 Feb 2021 06:22:35 +1300 Subject: [PATCH] Prevent reading or writing OpenEXR images with no channels (#911) * test for empty/missing channel lists Signed-off-by: Peter Hillman * add channels to all images written/read by OpenEXRTest Signed-off-by: Peter Hillman --- src/lib/OpenEXR/ImfHeader.cpp | 8 ++++++++ .../invalid_shared_attrs_multipart.exr | Bin 1993 -> 2015 bytes .../OpenEXRTest/testBadTypeAttributes.cpp | 5 +++-- .../OpenEXRTest/testDeepScanLineBasic.cpp | 1 + .../testMultiPartSharedAttributes.cpp | 6 ++++++ 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/lib/OpenEXR/ImfHeader.cpp b/src/lib/OpenEXR/ImfHeader.cpp index 1795a9d0be..df312c1974 100644 --- a/src/lib/OpenEXR/ImfHeader.cpp +++ b/src/lib/OpenEXR/ImfHeader.cpp @@ -998,7 +998,15 @@ Header::sanityCheck (bool isTiled, bool isMultipartFile) const // x and y subsampling factors. // + + + const ChannelList &channels = this->channels(); + + if (channels.begin()==channels.end()) + { + THROW (IEX_NAMESPACE::ArgExc, "Missing or empty channel list in header"); + } if (isTiled || isDeep) { diff --git a/src/test/OpenEXRTest/invalid_shared_attrs_multipart.exr b/src/test/OpenEXRTest/invalid_shared_attrs_multipart.exr index 236c40a976da2cd6a5bf3c9727685913a20cb09f..1da3823d4ec8e57d1eb05b6630de762874145283 100644 GIT binary patch delta 15 XcmX@ff1iH?E6YTQRhwtB7%&3>FcSq< delta 15 Xcmcc5f0BO#E6YT^DVx``7%&3>Fs%h_ diff --git a/src/test/OpenEXRTest/testBadTypeAttributes.cpp b/src/test/OpenEXRTest/testBadTypeAttributes.cpp index 634fca9397..d6843f400e 100644 --- a/src/test/OpenEXRTest/testBadTypeAttributes.cpp +++ b/src/test/OpenEXRTest/testBadTypeAttributes.cpp @@ -306,7 +306,8 @@ const std::string & NOTYPEATTR=""; template void check(const char* filename,const string& inputtype,const string &outputtype,bool add_tiledesc) { Header f; - + f.channels().insert("Dummy",Channel()); + if(inputtype!=NOTYPEATTR) { f.setType(inputtype); @@ -323,7 +324,7 @@ template void check(const char* filename,const string& input } { - IMF::MultiPartInputFile file(filename); + MultiPartInputFile file(filename); if(outputtype!=NOTYPEATTR && file.header(0).type()!=outputtype) { diff --git a/src/test/OpenEXRTest/testDeepScanLineBasic.cpp b/src/test/OpenEXRTest/testDeepScanLineBasic.cpp index 37786e137a..c32f2e2cf2 100644 --- a/src/test/OpenEXRTest/testDeepScanLineBasic.cpp +++ b/src/test/OpenEXRTest/testDeepScanLineBasic.cpp @@ -538,6 +538,7 @@ void testCompressionTypeChecks() { Header h; h.setType(DEEPTILE); + h.channels().insert("Dummy",Channel()); h.compression()=NO_COMPRESSION; h.sanityCheck(); h.compression()=ZIPS_COMPRESSION; diff --git a/src/test/OpenEXRTest/testMultiPartSharedAttributes.cpp b/src/test/OpenEXRTest/testMultiPartSharedAttributes.cpp index 773c6f85f8..6fa11af1af 100644 --- a/src/test/OpenEXRTest/testMultiPartSharedAttributes.cpp +++ b/src/test/OpenEXRTest/testMultiPartSharedAttributes.cpp @@ -174,9 +174,11 @@ void testDisplayWindow (const vector
& hs, const std::string & fn) { vector
headers(hs); + headers[0].channels().insert("Dummy",Channel()); IMATH_NAMESPACE::Box2i newDisplayWindow = headers[0].displayWindow(); Header newHeader (newDisplayWindow.size().x+10, newDisplayWindow.size().y+10); newHeader.setType (headers[0].type()); + newHeader.channels() = headers[0].channels(); newHeader.setName (headers[0].name() + string("_newHeader")); headers.push_back (newHeader); testMultiPartOutputFileForExpectedFailure (headers, @@ -196,6 +198,7 @@ testPixelAspectRatio (const vector
& hs, const std::string & fn) headers[0].pixelAspectRatio() + 1.f); newHeader.setType (headers[0].type()); newHeader.setName (headers[0].name() + string("_newHeader")); + newHeader.channels().insert("Dummy",Channel()); headers.push_back (newHeader); testMultiPartOutputFileForExpectedFailure (headers, fn, @@ -211,6 +214,7 @@ testTimeCode (const vector
& hs, const std::string & fn) Header newHeader (headers[0]); newHeader.setName (headers[0].name() + string("_newHeader")); + newHeader.channels().insert("Dummy",Channel()); // @@ -251,6 +255,7 @@ testChromaticities (const vector
& hs, const std::string & fn) Header newHeader (headers[0]); newHeader.setName (headers[0].name() + string("_newHeader")); + newHeader.channels().insert("Dummy",Channel()); Chromaticities c; ChromaticitiesAttribute ca(c); @@ -359,6 +364,7 @@ testHeaders (const std::string & fn) // expect this to fail - header has no image attribute type // Header h; + h.channels().insert("Dummy",Channel()); headers.push_back (h); testMultiPartOutputFileForExpectedFailure (headers, fn,