From 8cdafaa828c86ed60cbbe466b28780fd8451d148 Mon Sep 17 00:00:00 2001 From: SeppNel <35899928+SeppNel@users.noreply.github.com> Date: Sun, 23 Mar 2025 13:56:18 +0100 Subject: [PATCH] Fix file read memory leak (#750) * Fix file read memory leak * Also fix synchronous path * Use make_unique_for_overwrite * License --- src/core/hle/service/fs/file.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/core/hle/service/fs/file.cpp b/src/core/hle/service/fs/file.cpp index 21834b20d..a21b4c70d 100644 --- a/src/core/hle/service/fs/file.cpp +++ b/src/core/hle/service/fs/file.cpp @@ -1,4 +1,4 @@ -// Copyright 2018 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -79,13 +79,13 @@ void File::Read(Kernel::HLERequestContext& ctx) { if (!backend->AllowsCachedReads()) { auto& buffer = rp.PopMappedBuffer(); IPC::RequestBuilder rb = rp.MakeBuilder(2, 2); - std::unique_ptr data = std::make_unique(static_cast(operator new(length))); - const auto read = backend->Read(offset, length, *data); + std::unique_ptr data = std::make_unique_for_overwrite(length); + const auto read = backend->Read(offset, length, data.get()); if (read.Failed()) { rb.Push(read.Code()); rb.Push(0); } else { - buffer.Write(*data, 0, *read); + buffer.Write(data.get(), 0, *read); rb.Push(ResultSuccess); rb.Push(static_cast(*read)); } @@ -106,7 +106,7 @@ void File::Read(Kernel::HLERequestContext& ctx) { // Output Result ret{0}; Kernel::MappedBuffer* buffer; - std::unique_ptr data; + std::unique_ptr data; std::size_t read_size; }; @@ -122,10 +122,9 @@ void File::Read(Kernel::HLERequestContext& ctx) { // LOG_DEBUG(Service_FS, "cache={}, offset={}, length={}", cache_ready, offset, length); ctx.RunAsync( [this, async_data](Kernel::HLERequestContext& ctx) { - async_data->data = - std::make_unique(static_cast(operator new(async_data->length))); + async_data->data = std::make_unique_for_overwrite(async_data->length); const auto read = - backend->Read(async_data->offset, async_data->length, *async_data->data); + backend->Read(async_data->offset, async_data->length, async_data->data.get()); if (read.Failed()) { async_data->ret = read.Code(); async_data->read_size = 0; @@ -156,7 +155,7 @@ void File::Read(Kernel::HLERequestContext& ctx) { rb.Push(async_data->ret); rb.Push(0); } else { - async_data->buffer->Write(*async_data->data, 0, async_data->read_size); + async_data->buffer->Write(async_data->data.get(), 0, async_data->read_size); rb.Push(ResultSuccess); rb.Push(static_cast(async_data->read_size)); }