Skip to content

Commit

Permalink
BUG: fixed memory leaks in MINC IO
Browse files Browse the repository at this point in the history
MINC IO often did not free allocations before thowing an exception,
detected by InsightSoftwareConsortium#3529
  • Loading branch information
issakomi committed Aug 14, 2022
1 parent 678b97e commit 80ece1b
Showing 1 changed file with 46 additions and 3 deletions.
49 changes: 46 additions & 3 deletions Modules/IO/MINC/src/itkMINCImageIO.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -955,6 +955,10 @@ MINCImageIO::WriteImageInformation()

if (nDims > 3)
{
for (unsigned int i = 0; i < minc_dimensions; ++i)
{
mifree_dimension_handle(this->m_MINCPImpl->m_MincApparentDims[i]);
}
itkExceptionMacro(<< "Unfortunately, only up to 3D volume are supported now.");
}

Expand Down Expand Up @@ -1038,6 +1042,10 @@ MINCImageIO::WriteImageInformation()
this->m_MINCPImpl->m_Volume_type = MI_TYPE_DOUBLE;
break;
default:
for (unsigned int i = 0; i < minc_dimensions; ++i)
{
mifree_dimension_handle(this->m_MINCPImpl->m_MincApparentDims[i]);
}
itkExceptionMacro(<< "Could read datatype " << this->GetComponentType());
}

Expand Down Expand Up @@ -1165,25 +1173,44 @@ MINCImageIO::WriteImageInformation()
mivolumeprops_t hprops;
if (minew_volume_props(&hprops) < 0)
{
for (unsigned int i = 0; i < minc_dimensions; ++i)
{
mifree_dimension_handle(this->m_MINCPImpl->m_MincApparentDims[i]);
}
itkExceptionMacro(<< "Could not allocate MINC properties");
}

if (this->m_UseCompression)
{
if (miset_props_compression_type(hprops, MI_COMPRESS_ZLIB) < 0)
{
for (unsigned int i = 0; i < minc_dimensions; ++i)
{
mifree_dimension_handle(this->m_MINCPImpl->m_MincApparentDims[i]);
}
mifree_volume_props(hprops);
itkExceptionMacro(<< "Could not set MINC compression");
}

if (miset_props_zlib_compression(hprops, this->GetCompressionLevel()) < 0)
{
for (unsigned int i = 0; i < minc_dimensions; ++i)
{
mifree_dimension_handle(this->m_MINCPImpl->m_MincApparentDims[i]);
}
mifree_volume_props(hprops);
itkExceptionMacro(<< "Could not set MINC compression level");
}
}
else
{
if (miset_props_compression_type(hprops, MI_COMPRESS_NONE) < 0)
{
for (unsigned int i = 0; i < minc_dimensions; ++i)
{
mifree_dimension_handle(this->m_MINCPImpl->m_MincApparentDims[i]);
}
mifree_volume_props(hprops);
itkExceptionMacro(<< "Could not set MINC compression");
}
}
Expand All @@ -1197,23 +1224,31 @@ MINCImageIO::WriteImageInformation()
&this->m_MINCPImpl->m_Volume) < 0)
{
// Error opening the volume
for (unsigned int i = 0; i < minc_dimensions; ++i)
{
mifree_dimension_handle(this->m_MINCPImpl->m_MincApparentDims[i]);
}
mifree_volume_props(hprops);
itkExceptionMacro(<< "Could not open file \"" << m_FileName.c_str() << "\".");
}

if (micreate_volume_image(this->m_MINCPImpl->m_Volume) < 0)
{
// Error opening the volume
mifree_volume_props(hprops);
itkExceptionMacro(<< "Could not create image in file \"" << m_FileName.c_str() << "\".");
}

if (miset_apparent_dimension_order(
this->m_MINCPImpl->m_Volume, minc_dimensions, this->m_MINCPImpl->m_MincApparentDims) < 0)
{
mifree_volume_props(hprops);
itkExceptionMacro(<< " Can't set apparent dimension order!");
}

if (miset_slice_scaling_flag(this->m_MINCPImpl->m_Volume, 0) < 0)
{
mifree_volume_props(hprops);
itkExceptionMacro(<< "Could not set slice scaling flag");
}

Expand Down Expand Up @@ -1396,7 +1431,17 @@ MINCImageIO::Write(const void * buffer)
delete[] count;
itkExceptionMacro(<< "Could not read datatype " << this->GetComponentType());
}
this->WriteImageInformation();

try
{
this->WriteImageInformation();
}
catch (const itk::ExceptionObject & ex)
{
delete[] start;
delete[] count;
throw;
}

// by default valid range will be equal to range, to avoid scaling
if (volume_data_type == this->m_MINCPImpl->m_Volume_type)
Expand Down Expand Up @@ -1430,8 +1475,6 @@ MINCImageIO::Write(const void * buffer)
delete[] count;
itkExceptionMacro(<< " Can not set real value hyperslab!!\n");
}
// TODO: determine what to do if we are streming
this->CloseVolume();

delete[] start;
delete[] count;
Expand Down

0 comments on commit 80ece1b

Please sign in to comment.