From 2014ea40b91a4631160d8c8b1055fe7f231c96b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <3397065-ZehMatt@users.noreply.gitlab.com> Date: Mon, 18 Jul 2022 21:13:41 +0300 Subject: [PATCH 1/4] Use ScopedHandle for File::Handle --- components/files/constrainedfilestreambuf.hpp | 2 +- components/platform/file.hpp | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/components/files/constrainedfilestreambuf.hpp b/components/files/constrainedfilestreambuf.hpp index 0808ba6a9c..bb9d6ca89e 100644 --- a/components/files/constrainedfilestreambuf.hpp +++ b/components/files/constrainedfilestreambuf.hpp @@ -22,7 +22,7 @@ namespace Files private: std::size_t mOrigin; std::size_t mSize; - Platform::File::Handle mFile{ Platform::File::Handle::Invalid }; + Platform::File::ScopedHandle mFile; char mBuffer[8192]{ 0 }; }; } diff --git a/components/platform/file.hpp b/components/platform/file.hpp index d0d5eb0399..3456cdc113 100644 --- a/components/platform/file.hpp +++ b/components/platform/file.hpp @@ -29,7 +29,17 @@ namespace Platform::File { size_t read(Handle handle, void* data, size_t size); + class ScopedHandle + { + Handle mHandle{ Handle::Invalid }; + + public: + ScopedHandle() = default; + ScopedHandle(Handle handle) : mHandle(handle) {} + ~ScopedHandle() { close(mHandle); } + operator Handle() const { return mHandle; } + }; } #endif // OPENMW_COMPONENTS_PLATFORM_FILE_HPP From 3c8ef8463caa76cc8ba283bccaed41924e1722da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <3397065-ZehMatt@users.noreply.gitlab.com> Date: Mon, 18 Jul 2022 21:44:03 +0300 Subject: [PATCH 2/4] Close only valid handles --- components/platform/file.hpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/components/platform/file.hpp b/components/platform/file.hpp index 3456cdc113..bd22394197 100644 --- a/components/platform/file.hpp +++ b/components/platform/file.hpp @@ -36,7 +36,11 @@ namespace Platform::File { public: ScopedHandle() = default; ScopedHandle(Handle handle) : mHandle(handle) {} - ~ScopedHandle() { close(mHandle); } + ~ScopedHandle() + { + if(mHandle != Handle::Invalid) + close(mHandle); + } operator Handle() const { return mHandle; } }; From 8a724eb7727fa797bce78de6c8af86ba0fe610e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <3397065-ZehMatt@users.noreply.gitlab.com> Date: Mon, 18 Jul 2022 22:28:35 +0300 Subject: [PATCH 3/4] Delete assignment and copy constructor --- components/platform/file.hpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/components/platform/file.hpp b/components/platform/file.hpp index bd22394197..ae803edb22 100644 --- a/components/platform/file.hpp +++ b/components/platform/file.hpp @@ -34,8 +34,21 @@ namespace Platform::File { Handle mHandle{ Handle::Invalid }; public: - ScopedHandle() = default; - ScopedHandle(Handle handle) : mHandle(handle) {} + ScopedHandle() noexcept = default; + ScopedHandle(ScopedHandle& other) = delete; + ScopedHandle(Handle handle) noexcept : mHandle(handle) {} + ScopedHandle(ScopedHandle&& other) noexcept + : mHandle(other.mHandle) + { + other.mHandle = Handle::Invalid; + } + ScopedHandle& operator=(const ScopedHandle& other) = delete; + ScopedHandle& operator=(ScopedHandle&& other) noexcept + { + mHandle = other.mHandle; + other.mHandle = Handle::Invalid; + return *this; + } ~ScopedHandle() { if(mHandle != Handle::Invalid) From 8f7ec42c09be00f1c9a3b6fba70a28f9c09bbd71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <3397065-ZehMatt@users.noreply.gitlab.com> Date: Mon, 18 Jul 2022 23:11:09 +0300 Subject: [PATCH 4/4] Close handle if valid for move assignment --- components/platform/file.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/platform/file.hpp b/components/platform/file.hpp index ae803edb22..8faf9c67cb 100644 --- a/components/platform/file.hpp +++ b/components/platform/file.hpp @@ -45,6 +45,8 @@ namespace Platform::File { ScopedHandle& operator=(const ScopedHandle& other) = delete; ScopedHandle& operator=(ScopedHandle&& other) noexcept { + if (mHandle != Handle::Invalid) + close(mHandle); mHandle = other.mHandle; other.mHandle = Handle::Invalid; return *this;