diff --git a/OpenEXR/IlmImf/ImfDeepScanLineInputFile.cpp b/OpenEXR/IlmImf/ImfDeepScanLineInputFile.cpp index b5e56bdaa6..2cb901852e 100644 --- a/OpenEXR/IlmImf/ImfDeepScanLineInputFile.cpp +++ b/OpenEXR/IlmImf/ImfDeepScanLineInputFile.cpp @@ -919,8 +919,7 @@ void DeepScanLineInputFile::initialize(const Header& header) } catch (...) { - delete _data; - _data=NULL; + // Don't delete _data here, leave that to caller throw; } } @@ -936,8 +935,15 @@ DeepScanLineInputFile::DeepScanLineInputFile(InputPartData* part) _data->memoryMapped = _data->_streamData->is->isMemoryMapped(); _data->version = part->version; - initialize(part->header); - + try + { + initialize(part->header); + } + catch(...) + { + delete _data; + throw; + } _data->lineOffsets = part->chunkOffsets; _data->partNumber = part->partNumber; @@ -980,7 +986,10 @@ DeepScanLineInputFile::DeepScanLineInputFile catch (IEX_NAMESPACE::BaseExc &e) { if (is) delete is; - if (_data && _data->_streamData) delete _data->_streamData; + if (_data && _data->_streamData) + { + delete _data->_streamData; + } if (_data) delete _data; REPLACE_EXC (e, "Cannot read image file " @@ -990,7 +999,10 @@ DeepScanLineInputFile::DeepScanLineInputFile catch (...) { if (is) delete is; - if (_data && _data->_streamData) delete _data->_streamData; + if (_data && _data->_streamData) + { + delete _data->_streamData; + } if (_data) delete _data; throw; @@ -1014,7 +1026,18 @@ DeepScanLineInputFile::DeepScanLineInputFile _data->version =version; - initialize (header); + try + { + initialize (header); + } + catch (...) + { + if (_data && _data->_streamData) + { + delete _data->_streamData; + } + if (_data) delete _data; + } readLineOffsets (*_data->_streamData->is, _data->lineOrder, @@ -1046,8 +1069,9 @@ DeepScanLineInputFile::~DeepScanLineInputFile () // if (_data->partNumber == -1 && _data->_streamData) + { delete _data->_streamData; - + } delete _data; } } diff --git a/OpenEXR/IlmImf/ImfDeepTiledInputFile.cpp b/OpenEXR/IlmImf/ImfDeepTiledInputFile.cpp index ef7f88775f..9970f3f244 100644 --- a/OpenEXR/IlmImf/ImfDeepTiledInputFile.cpp +++ b/OpenEXR/IlmImf/ImfDeepTiledInputFile.cpp @@ -886,7 +886,15 @@ DeepTiledInputFile::DeepTiledInputFile (InputPartData* part) : _data (new Data (part->numThreads)) { _data->_deleteStream=false; - multiPartInitialize(part); + try + { + multiPartInitialize(part); + } + catch(...) + { + delete _data; + throw; + } } diff --git a/OpenEXR/IlmImf/ImfTiledInputFile.cpp b/OpenEXR/IlmImf/ImfTiledInputFile.cpp index 20ff0e563d..4e5b4e3243 100644 --- a/OpenEXR/IlmImf/ImfTiledInputFile.cpp +++ b/OpenEXR/IlmImf/ImfTiledInputFile.cpp @@ -745,7 +745,10 @@ TiledInputFile::TiledInputFile (const char fileName[], int numThreads): delete _data->_streamData; } - + if (_data) + { + delete _data; + } if (is != 0) delete is; @@ -768,6 +771,10 @@ TiledInputFile::TiledInputFile (const char fileName[], int numThreads): if (is != 0) delete is; + if (_data) + { + delete _data; + } throw; } } @@ -855,7 +862,15 @@ TiledInputFile::TiledInputFile (InputPartData* part) { _data = new Data (part->numThreads); _data->_deleteStream=false; - multiPartInitialize(part); + try + { + multiPartInitialize(part); + } + catch(...) + { + if (_data) delete _data; + throw; + } }