diff --git a/plugins/builtin/include/content/providers/file_provider.hpp b/plugins/builtin/include/content/providers/file_provider.hpp index 57363a0ba..75e07ae36 100644 --- a/plugins/builtin/include/content/providers/file_provider.hpp +++ b/plugins/builtin/include/content/providers/file_provider.hpp @@ -29,6 +29,11 @@ namespace hex::plugin::builtin { void readRaw(u64 offset, void *buffer, size_t size) override; void writeRaw(u64 offset, const void *buffer, size_t size) override; + /** + * @brief closes the file streams used to read the file. + * Need to be called on file write, see https://github.com/WerWolv/ImHex/issues/988 + */ + void invalidateFiles(); [[nodiscard]] size_t getActualSize() const override; void save() override; diff --git a/plugins/builtin/source/content/providers/file_provider.cpp b/plugins/builtin/source/content/providers/file_provider.cpp index 5d987c342..6d73fec2a 100644 --- a/plugins/builtin/source/content/providers/file_provider.cpp +++ b/plugins/builtin/source/content/providers/file_provider.cpp @@ -77,7 +77,8 @@ namespace hex::plugin::builtin { writeFile.seek(offset); writeFile.writeBuffer(reinterpret_cast(buffer), size); - this->m_files.clear(); + + this->invalidateFiles(); } void FileProvider::save() { @@ -124,6 +125,13 @@ namespace hex::plugin::builtin { Provider::insert(offset, size); } + void FileProvider::invalidateFiles() { + for(auto & [threadId, file] : this->m_files){ + file.close(); + } + this->m_files.clear(); + } + void FileProvider::remove(u64 offset, size_t size) { auto oldSize = this->getActualSize(); this->resize(oldSize + size);