Fix leaking streams in some image streams.

This commit is contained in:
Jean-Philip Desjardins 2022-12-31 12:19:04 -05:00
parent 358c4efc86
commit b852400139
9 changed files with 25 additions and 25 deletions

View file

@ -31,7 +31,7 @@
#include "TargetConditionals.h"
#endif
static Framework::CStream* CreateImageStream(const fs::path& imagePath)
static std::unique_ptr<Framework::CStream> CreateImageStream(const fs::path& imagePath)
{
static const char* s3ImagePathPrefix = "//s3/";
auto imagePathString = imagePath.string();
@ -46,7 +46,7 @@ static Framework::CStream* CreateImageStream(const fs::path& imagePath)
throw std::runtime_error("Invalid S3 object path.");
}
auto bucketName = std::string(fullObjectPath.begin(), fullObjectPath.begin() + objectPathPos);
return new CS3ObjectStream(bucketName.c_str(), fullObjectPath.c_str() + objectPathPos + 1);
return std::make_unique<CS3ObjectStream>(bucketName.c_str(), fullObjectPath.c_str() + objectPathPos + 1);
#else
throw std::runtime_error("S3 support was disabled during build configuration.");
#endif
@ -55,16 +55,16 @@ static Framework::CStream* CreateImageStream(const fs::path& imagePath)
if(Framework::Android::CContentUtils::IsContentPath(imagePath))
{
auto uri = Framework::Android::CContentUtils::BuildUriFromPath(imagePath);
return new Framework::Android::CContentStream(uri.c_str(), "r");
return std::make_unique<Framework::Android::CContentStream>(uri.c_str(), "r");
}
else
{
return new Framework::CPosixFileStream(imagePathString.c_str(), O_RDONLY);
return std::make_unique<Framework::CPosixFileStream>(imagePathString.c_str(), O_RDONLY);
}
#elif defined(__EMSCRIPTEN__)
return new CJsDiscImageDeviceStream();
return std::make_unique<CJsDiscImageDeviceStream>();
#else
return new Framework::CStdStream(imagePathString.c_str(), "rb");
return std::make_unique<Framework::CStdStream>(imagePathString.c_str(), "rb");
#endif
}

View file

@ -1,8 +1,8 @@
#include "ChdCdImageStream.h"
#include <libchdr/chd.h>
CChdCdImageStream::CChdCdImageStream(Framework::CStream* baseStream)
: CChdImageStream(baseStream)
CChdCdImageStream::CChdCdImageStream(std::unique_ptr<Framework::CStream> baseStream)
: CChdImageStream(std::move(baseStream))
{
//We only support 2448 bytes units
assert(m_unitSize == 2448);

View file

@ -11,7 +11,7 @@ public:
TRACK_TYPE_MODE2_RAW,
};
CChdCdImageStream(Framework::CStream*);
CChdCdImageStream(std::unique_ptr<Framework::CStream>);
TRACK_TYPE GetTrack0Type() const;

View file

@ -5,10 +5,11 @@
#include <stdexcept>
#include "ChdStreamSupport.h"
CChdImageStream::CChdImageStream(Framework::CStream* baseStream)
: m_baseStream(baseStream)
//Should probably take a shared_ptr instead of raw
CChdImageStream::CChdImageStream(std::unique_ptr<Framework::CStream> baseStream)
: m_baseStream(std::move(baseStream))
{
m_file = ChdStreamSupport::CreateFileFromStream(baseStream);
m_file = ChdStreamSupport::CreateFileFromStream(m_baseStream.get());
chd_error result = chd_open_core_file(m_file, CHD_OPEN_READ, nullptr, &m_chd);
if(result != CHDERR_NONE)
{

View file

@ -9,7 +9,7 @@ typedef struct chd_core_file core_file;
class CChdImageStream : public Framework::CStream
{
public:
CChdImageStream(Framework::CStream* baseStream);
CChdImageStream(std::unique_ptr<Framework::CStream> baseStream);
virtual ~CChdImageStream();
uint32 GetUnitSize() const;
@ -23,7 +23,7 @@ public:
protected:
uint64 GetTotalSize() const;
Framework::CStream* m_baseStream = nullptr;
std::unique_ptr<Framework::CStream> m_baseStream;
core_file* m_file = nullptr;
chd_file* m_chd = nullptr;
uint32 m_unitSize = 0;

View file

@ -21,14 +21,14 @@ struct CsoHeader
uint8 reserved[2];
};
CCsoImageStream::CCsoImageStream(CStream* baseStream)
: m_baseStream(baseStream)
CCsoImageStream::CCsoImageStream(std::unique_ptr<CStream> baseStream)
: m_baseStream(std::move(baseStream))
, m_readBuffer(nullptr)
, m_zlibBuffer(nullptr)
, m_index(nullptr)
, m_position(0)
{
if(baseStream == nullptr)
if(!m_baseStream)
{
throw std::runtime_error("Null base stream supplied.");
}

View file

@ -6,7 +6,7 @@
class CCsoImageStream : public Framework::CStream
{
public:
CCsoImageStream(Framework::CStream* baseStream);
CCsoImageStream(std::unique_ptr<Framework::CStream> baseStream);
virtual ~CCsoImageStream();
virtual void Seek(int64 pos, Framework::STREAM_SEEK_DIRECTION whence) override;
@ -23,7 +23,7 @@ private:
uint64 ReadBaseAt(uint64 pos, uint8* dest, uint64 bytes);
void DecompressFrame(uint32 frame, uint64 readBufferSize);
Framework::CStream* m_baseStream;
std::unique_ptr<Framework::CStream> m_baseStream;
uint32 m_frameSize;
uint8 m_frameShift;
uint8 m_indexShift;

View file

@ -7,10 +7,10 @@
#include "zstd_zlibwrapper.h"
#include "StdStream.h"
CIszImageStream::CIszImageStream(CStream* baseStream)
: m_baseStream(baseStream)
CIszImageStream::CIszImageStream(std::unique_ptr<CStream> baseStream)
: m_baseStream(std::move(baseStream))
{
if(baseStream == nullptr)
if(!m_baseStream)
{
throw std::runtime_error("Null base stream supplied.");
}
@ -39,7 +39,6 @@ CIszImageStream::~CIszImageStream()
delete[] m_cachedBlock;
delete[] m_readBuffer;
delete[] m_blockDescriptorTable;
delete m_baseStream;
}
void CIszImageStream::Seek(int64 position, Framework::STREAM_SEEK_DIRECTION origin)

View file

@ -6,7 +6,7 @@
class CIszImageStream : public Framework::CStream
{
public:
CIszImageStream(Framework::CStream*);
CIszImageStream(std::unique_ptr<Framework::CStream>);
virtual ~CIszImageStream();
virtual void Seek(int64, Framework::STREAM_SEEK_DIRECTION) override;
@ -78,7 +78,7 @@ private:
void ReadGzipBlock(uint32);
void ReadBz2Block(uint32);
Framework::CStream* m_baseStream = nullptr;
std::unique_ptr<Framework::CStream> m_baseStream;
HEADER m_header;
BLOCKDESCRIPTOR* m_blockDescriptorTable = nullptr;
int64 m_cachedBlockNumber = -1;