From b673e6ad0ec6cef94d86b9586244d26088a3d792 Mon Sep 17 00:00:00 2001 From: Peter Hillman <peterh@wetafx.co.nz> Date: Fri, 24 Jan 2020 08:42:07 +1300 Subject: [PATCH 18/23] Fix cleanup when DeepScanLineInputFile constructor throws Signed-off-by: Peter Hillman <peterh@wetafx.co.nz> --- OpenEXR/IlmImf/ImfDeepScanLineInputFile.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) --- a/IlmImf/ImfDeepScanLineInputFile.cpp +++ b/IlmImf/ImfDeepScanLineInputFile.cpp @@ -951,7 +951,6 @@ DeepScanLineInputFile::DeepScanLineInput : _data (new Data (numThreads)) { - _data->_streamData = new InputStreamMutex(); _data->_deleteStream = true; OPENEXR_IMF_INTERNAL_NAMESPACE::IStream* is = 0; @@ -961,12 +960,29 @@ DeepScanLineInputFile::DeepScanLineInput readMagicNumberAndVersionField(*is, _data->version); // // Backward compatibility to read multpart file. - // + // multiPartInitialize will create _streamData if (isMultiPart(_data->version)) { compatibilityInitialize(*is); return; } + } + catch (IEX_NAMESPACE::BaseExc &e) + { + if (is) delete is; + if (_data) delete _data; + + REPLACE_EXC (e, "Cannot read image file " + "\"" << fileName << "\". " << e.what()); + throw; + } + + // + // not multiPart - allocate stream data and intialise as normal + // + try + { + _data->_streamData = new InputStreamMutex(); _data->_streamData->is = is; _data->memoryMapped = is->isMemoryMapped(); _data->header.readFrom (*_data->_streamData->is, _data->version);