Browse Source

Fix memory leak in ZipSubRStream

Inside attachStream() method we may clone passed stream, but never delete it.
bank 8 months ago
parent
commit
5e8af7020c

+ 8 - 2
Engine/source/core/util/zip/zipArchive.cpp

@@ -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;

+ 1 - 1
Engine/source/core/util/zip/zipArchive.h

@@ -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