From 4e414902bec27bc8fb7af476bedf7974c1f35ef9 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 6 Sep 2019 03:23:42 -0400 Subject: [PATCH] MemoryWriter: Use a std::unique_ptr for FILE handle in save() Prevents potential leaks from occurring within failure cases (e.g. with the default exception handler). --- src/athena/MemoryWriter.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/athena/MemoryWriter.cpp b/src/athena/MemoryWriter.cpp index 4e8bb61..256cbf9 100644 --- a/src/athena/MemoryWriter.cpp +++ b/src/athena/MemoryWriter.cpp @@ -185,11 +185,11 @@ void MemoryWriter::save(std::string_view filename) { return; } - if (!filename.empty()) + if (!filename.empty()) { m_filepath = filename; + } - FILE* out = fopen(m_filepath.c_str(), "wb"); - + std::unique_ptr out{std::fopen(m_filepath.c_str(), "wb"), std::fclose}; if (!out) { atError(fmt("Unable to open file '{}'"), m_filepath); setError(); @@ -200,22 +200,24 @@ void MemoryWriter::save(std::string_view filename) { atUint64 blocksize = BLOCKSZ; do { - if (blocksize > m_length - done) + if (blocksize > m_length - done) { blocksize = m_length - done; + } - atInt64 ret = fwrite(m_data + done, 1, blocksize, out); + const atInt64 ret = std::fwrite(m_data + done, 1, blocksize, out.get()); if (ret < 0) { atError(fmt("Error writing data to disk")); setError(); return; - } else if (ret == 0) + } + + if (ret == 0) { break; + } done += blocksize; } while (done < m_length); - - fclose(out); } void MemoryWriter::writeUBytes(const atUint8* data, atUint64 length) {