Merge pull request #1389 from just-bank/fix-memleak-ziparchive

`FileStream` memory leak in `ZipArchive` (`ZipSubRStream`) when extracting files from archive.
This commit is contained in:
Brian Roberts 2025-02-19 11:51:57 -06:00 committed by GitHub
commit a206746526
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 9 additions and 3 deletions

View file

@ -700,7 +700,7 @@ Stream * ZipArchive::openFile(const char *filename, ZipEntry* ze, AccessMode mod
return NULL;
}
void ZipArchive::closeFile(Stream *stream)
void ZipArchive::closeFile(Stream *stream, bool deleteRootStream /*= false*/)
{
FilterStream *currentStream, *nextStream;
@ -724,6 +724,11 @@ void ZipArchive::closeFile(Stream *stream)
// so we need to update the relevant information in the header.
updateFile(tempStream);
}
// [bank / Feb-2025] If the stream was cloned (via openFileForRead method)
// we should clean it up and delete, otherwise it will rest in memory forever.
if (deleteRootStream && stream != mStream)
delete stream;
}
//-----------------------------------------------------------------------------
@ -888,7 +893,8 @@ bool ZipArchive::extractFile(const char *pathInZip, const char *filename, bool *
ret = false;
}
closeFile(source);
// Pass deleteRootStream flag to drop cloned FileStream
closeFile(source, true);
dest.close();
return ret;

View file

@ -480,7 +480,7 @@ public:
/// @param stream Stream to close
/// @see ZipArchive::openFile(const char *, AccessMode)
//-----------------------------------------------------------------------------
virtual void closeFile(Stream *stream);
virtual void closeFile(Stream *stream, bool deleteRootStream = false);
//-----------------------------------------------------------------------------
/// @brief Open a file within the zip file for read