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 doesn't always free allocations before throwing an exception,
detected by #3529.
  • Loading branch information
issakomi committed Aug 14, 2022
1 parent 678b97e commit bc0be93
Showing 1 changed file with 48 additions and 1 deletion.
49 changes: 48 additions & 1 deletion 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,7 +1042,13 @@ 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());
}
}

std::string storage_data_type;
Expand Down Expand Up @@ -1165,25 +1175,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 +1226,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 +1433,17 @@ MINCImageIO::Write(const void * buffer)
delete[] count;
itkExceptionMacro(<< "Could not read datatype " << this->GetComponentType());
}
this->WriteImageInformation();

try
{
this->WriteImageInformation();
}
catch (const itk::ExceptionObject &)
{
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

0 comments on commit bc0be93

Please sign in to comment.