Skip to content

Commit

Permalink
Merge pull request opencv#26715 from asmorkalov:as/png_leak
Browse files Browse the repository at this point in the history
Fixed some memory leaks in PNG/APNG implementation
  • Loading branch information
asmorkalov authored Jan 6, 2025
2 parents ff18c9c + ad36f68 commit 3d7eb55
Showing 1 changed file with 36 additions and 13 deletions.
49 changes: 36 additions & 13 deletions modules/imgcodecs/src/grfmt_png.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -181,8 +181,8 @@ PngDecoder::PngDecoder()
{
m_signature = "\x89\x50\x4e\x47\xd\xa\x1a\xa";
m_color_type = 0;
m_png_ptr = 0;
m_info_ptr = m_end_info = 0;
m_png_ptr = nullptr;
m_info_ptr = m_end_info = nullptr;
m_f = 0;
m_buf_supported = true;
m_buf_pos = 0;
Expand All @@ -203,7 +203,7 @@ PngDecoder::~PngDecoder()
if( m_f )
{
fclose( m_f );
m_f = 0;
m_f = nullptr;
}

if( m_png_ptr )
Expand All @@ -212,7 +212,7 @@ PngDecoder::~PngDecoder()
png_infop info_ptr = (png_infop)m_info_ptr;
png_infop end_info = (png_infop)m_end_info;
png_destroy_read_struct( &png_ptr, &info_ptr, &end_info );
m_png_ptr = m_info_ptr = m_end_info = 0;
m_png_ptr = m_info_ptr = m_end_info = nullptr;
}
}

Expand Down Expand Up @@ -241,15 +241,14 @@ bool PngDecoder::readHeader()
volatile bool result = false;

png_structp png_ptr = png_create_read_struct( PNG_LIBPNG_VER_STRING, 0, 0, 0 );
png_infop info_ptr = nullptr;
png_infop end_info = nullptr;

if( png_ptr )
{
png_infop info_ptr = png_create_info_struct( png_ptr );
png_infop end_info = png_create_info_struct( png_ptr );
info_ptr = png_create_info_struct( png_ptr );
end_info = png_create_info_struct( png_ptr );

m_png_ptr = png_ptr;
m_info_ptr = info_ptr;
m_end_info = end_info;
m_buf_pos = 0;

if( info_ptr && end_info )
Expand All @@ -266,7 +265,10 @@ bool PngDecoder::readHeader()
{
m_f = fopen(m_filename.c_str(), "rb");
if (!m_f)
{
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
return false;
}
png_init_io(png_ptr, m_f);

if (fread(sig, 1, 8, m_f))
Expand All @@ -280,15 +282,21 @@ bool PngDecoder::readHeader()
}

if (!(id == id_IHDR && m_chunkIHDR.p.size() == 25))
{
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
return false;
}

while (true)
{
m_is_fcTL_loaded = false;
id = read_chunk(chunk);

if ((m_f && feof(m_f)) || (!m_buf.empty() && m_buf_pos > m_buf.total()))
{
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
return false;
}

if (id == id_IDAT)
{
Expand Down Expand Up @@ -381,6 +389,17 @@ bool PngDecoder::readHeader()
}
}

if(result)
{
m_png_ptr = png_ptr;
m_info_ptr = info_ptr;
m_end_info = end_info;
}
else
{
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
}

return result;
}

Expand Down Expand Up @@ -762,19 +781,23 @@ bool PngDecoder::processing_finish()

png_structp png_ptr = (png_structp)m_png_ptr;
png_infop info_ptr = (png_infop)m_info_ptr;
png_infop end_info = (png_infop)m_end_info;

if (!png_ptr || !info_ptr)
if (!png_ptr)
return false;

if (setjmp(png_jmpbuf(png_ptr)))
{
png_destroy_read_struct(&png_ptr, &info_ptr, 0);
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
return false;
}

png_process_data(png_ptr, info_ptr, footer, 12);
png_destroy_read_struct(&png_ptr, &info_ptr, 0);
m_png_ptr = 0;
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
m_png_ptr = nullptr;
m_info_ptr = nullptr;
m_end_info = nullptr;

return true;
}

Expand Down

0 comments on commit 3d7eb55

Please sign in to comment.