From d9a47fe8156bed1829f2a8ee334dca89ca810f3a Mon Sep 17 00:00:00 2001 From: WerWolv Date: Sun, 4 Sep 2022 11:16:20 +0200 Subject: [PATCH] fix: Crashes when resizing file Fixes #721 --- lib/libimhex/include/hex/providers/provider.hpp | 4 ++-- lib/libimhex/source/api/imhex_api.cpp | 2 ++ lib/libimhex/source/providers/provider.cpp | 8 -------- .../builtin/include/content/providers/null_provider.hpp | 3 +++ plugins/builtin/source/content/events.cpp | 8 +++++++- plugins/builtin/source/content/providers.cpp | 2 ++ .../builtin/source/content/providers/disk_provider.cpp | 4 +--- .../builtin/source/content/providers/file_provider.cpp | 4 +--- plugins/builtin/source/content/providers/gdb_provider.cpp | 4 +--- .../source/content/providers/intel_hex_provider.cpp | 3 +-- .../source/content/providers/motorola_srec_provider.cpp | 4 ++-- .../source/content/views/view_provider_settings.cpp | 1 + plugins/builtin/source/content/welcome_screen.cpp | 5 ++++- 13 files changed, 27 insertions(+), 25 deletions(-) diff --git a/lib/libimhex/include/hex/providers/provider.hpp b/lib/libimhex/include/hex/providers/provider.hpp index d4701169b..62faa8c31 100644 --- a/lib/libimhex/include/hex/providers/provider.hpp +++ b/lib/libimhex/include/hex/providers/provider.hpp @@ -70,8 +70,8 @@ namespace hex::prv { [[nodiscard]] virtual std::string getName() const = 0; [[nodiscard]] virtual std::vector> getDataInformation() const = 0; - [[nodiscard]] virtual bool open(); - virtual void close(); + [[nodiscard]] virtual bool open() = 0; + virtual void close() = 0; void addPatch(u64 offset, const void *buffer, size_t size, bool createUndo = false); void createUndoPoint(); diff --git a/lib/libimhex/source/api/imhex_api.cpp b/lib/libimhex/source/api/imhex_api.cpp index 62f583742..417ba6a41 100644 --- a/lib/libimhex/source/api/imhex_api.cpp +++ b/lib/libimhex/source/api/imhex_api.cpp @@ -308,6 +308,8 @@ namespace hex { setCurrentProvider(0); provider->close(); + EventManager::post(provider); + delete provider; } diff --git a/lib/libimhex/source/providers/provider.cpp b/lib/libimhex/source/providers/provider.cpp index f29d8e79e..fe89932e8 100644 --- a/lib/libimhex/source/providers/provider.cpp +++ b/lib/libimhex/source/providers/provider.cpp @@ -170,14 +170,6 @@ namespace hex::prv { return page; } - bool Provider::open() { - EventManager::post(this); - return true; - } - void Provider::close() { - EventManager::post(this); - } - void Provider::addPatch(u64 offset, const void *buffer, size_t size, bool createUndo) { if (this->m_patchTreeOffset > 0) { auto iter = this->m_patches.end(); diff --git a/plugins/builtin/include/content/providers/null_provider.hpp b/plugins/builtin/include/content/providers/null_provider.hpp index 37cf92002..7bf697bcb 100644 --- a/plugins/builtin/include/content/providers/null_provider.hpp +++ b/plugins/builtin/include/content/providers/null_provider.hpp @@ -15,6 +15,9 @@ namespace hex::plugin::builtin::prv { [[nodiscard]] bool isResizable() const override { return false; } [[nodiscard]] bool isSavable() const override { return false; } + [[nodiscard]] bool open() override { return true; } + void close() override { } + void readRaw(u64 offset, void *buffer, size_t size) override { hex::unused(offset, buffer, size); } void writeRaw(u64 offset, const void *buffer, size_t size) override { hex::unused(offset, buffer, size); } [[nodiscard]] size_t getActualSize() const override { return 0x00; } diff --git a/plugins/builtin/source/content/events.cpp b/plugins/builtin/source/content/events.cpp index fb54efc00..cbb709da4 100644 --- a/plugins/builtin/source/content/events.cpp +++ b/plugins/builtin/source/content/events.cpp @@ -21,7 +21,8 @@ namespace hex::plugin::builtin { auto provider = ImHexApi::Provider::createProvider("hex.builtin.provider.file", true); if (auto *fileProvider = dynamic_cast(provider); fileProvider != nullptr) { fileProvider->setPath(path); - (void)fileProvider->open(); + if (fileProvider->open()) + EventManager::post(fileProvider); } } @@ -100,6 +101,8 @@ namespace hex::plugin::builtin { TaskManager::doLater([provider] { ImHexApi::Provider::remove(provider); }); return; } + + EventManager::post(provider); } else if (provider->hasLoadInterface()) EventManager::post(View::toWindowName("hex.builtin.view.provider_settings.load_popup")); @@ -107,7 +110,10 @@ namespace hex::plugin::builtin { if (!provider->open() || !provider->isAvailable()) { View::showErrorPopup("hex.builtin.popup.error.open"_lang); TaskManager::doLater([provider] { ImHexApi::Provider::remove(provider); }); + return; } + + EventManager::post(provider); } }); diff --git a/plugins/builtin/source/content/providers.cpp b/plugins/builtin/source/content/providers.cpp index 31098f0eb..56243d150 100644 --- a/plugins/builtin/source/content/providers.cpp +++ b/plugins/builtin/source/content/providers.cpp @@ -41,6 +41,8 @@ namespace hex::plugin::builtin { provider->loadSettings(providerSettings["settings"]); if (!provider->open()) success = false; + else + EventManager::post(provider); } return success; diff --git a/plugins/builtin/source/content/providers/disk_provider.cpp b/plugins/builtin/source/content/providers/disk_provider.cpp index f2d7b2d39..d7996635b 100644 --- a/plugins/builtin/source/content/providers/disk_provider.cpp +++ b/plugins/builtin/source/content/providers/disk_provider.cpp @@ -137,7 +137,7 @@ namespace hex::plugin::builtin::prv { #endif - return Provider::open(); + return true; } void DiskProvider::close() { @@ -156,8 +156,6 @@ namespace hex::plugin::builtin::prv { this->m_diskHandle = -1; #endif - - Provider::close(); } void DiskProvider::readRaw(u64 offset, void *buffer, size_t size) { diff --git a/plugins/builtin/source/content/providers/file_provider.cpp b/plugins/builtin/source/content/providers/file_provider.cpp index 55d4fe110..cc1bb1604 100644 --- a/plugins/builtin/source/content/providers/file_provider.cpp +++ b/plugins/builtin/source/content/providers/file_provider.cpp @@ -300,7 +300,7 @@ namespace hex::plugin::builtin::prv { #endif - return Provider::open(); + return true; } void FileProvider::close() { @@ -319,8 +319,6 @@ namespace hex::plugin::builtin::prv { ::close(this->m_file); #endif - - Provider::close(); } void FileProvider::loadSettings(const nlohmann::json &settings) { diff --git a/plugins/builtin/source/content/providers/gdb_provider.cpp b/plugins/builtin/source/content/providers/gdb_provider.cpp index c677a6da8..62dc3182f 100644 --- a/plugins/builtin/source/content/providers/gdb_provider.cpp +++ b/plugins/builtin/source/content/providers/gdb_provider.cpp @@ -273,7 +273,7 @@ namespace hex::plugin::builtin::prv { } }); - return Provider::open(); + return true; } else { return false; } @@ -285,8 +285,6 @@ namespace hex::plugin::builtin::prv { if (this->m_cacheUpdateThread.joinable()) { this->m_cacheUpdateThread.join(); } - - Provider::close(); } bool GDBProvider::isConnected() const { diff --git a/plugins/builtin/source/content/providers/intel_hex_provider.cpp b/plugins/builtin/source/content/providers/intel_hex_provider.cpp index a088114f1..f87410a92 100644 --- a/plugins/builtin/source/content/providers/intel_hex_provider.cpp +++ b/plugins/builtin/source/content/providers/intel_hex_provider.cpp @@ -210,12 +210,11 @@ namespace hex::plugin::builtin::prv { this->m_dataSize = maxAddress + 1; this->m_dataValid = true; - return Provider::open(); + return true; } void IntelHexProvider::close() { - Provider::close(); } [[nodiscard]] std::string IntelHexProvider::getName() const { diff --git a/plugins/builtin/source/content/providers/motorola_srec_provider.cpp b/plugins/builtin/source/content/providers/motorola_srec_provider.cpp index 4468d687e..8ebc4840c 100644 --- a/plugins/builtin/source/content/providers/motorola_srec_provider.cpp +++ b/plugins/builtin/source/content/providers/motorola_srec_provider.cpp @@ -190,11 +190,11 @@ namespace hex::plugin::builtin::prv { this->m_dataSize = maxAddress + 1; this->m_dataValid = true; - return Provider::open(); + return true; } void MotorolaSRECProvider::close() { - Provider::close(); + } [[nodiscard]] std::string MotorolaSRECProvider::getName() const { diff --git a/plugins/builtin/source/content/views/view_provider_settings.cpp b/plugins/builtin/source/content/views/view_provider_settings.cpp index a52cf2eb5..71d1d6190 100644 --- a/plugins/builtin/source/content/views/view_provider_settings.cpp +++ b/plugins/builtin/source/content/views/view_provider_settings.cpp @@ -36,6 +36,7 @@ namespace hex::plugin::builtin { if (ImGui::Button("hex.builtin.common.open"_lang)) { if (provider->open()) { + EventManager::post(provider); ImGui::CloseCurrentPopup(); } else { diff --git a/plugins/builtin/source/content/welcome_screen.cpp b/plugins/builtin/source/content/welcome_screen.cpp index c581f59e9..888f1d1a5 100644 --- a/plugins/builtin/source/content/welcome_screen.cpp +++ b/plugins/builtin/source/content/welcome_screen.cpp @@ -99,6 +99,8 @@ namespace hex::plugin::builtin { return; } + EventManager::post(provider); + updateRecentProviders(); } } @@ -340,7 +342,8 @@ namespace hex::plugin::builtin { if (ImGui::Hyperlink("X")) { auto provider = ImHexApi::Provider::createProvider("hex.builtin.provider.null"); if (provider != nullptr) - (void)provider->open(); + if (provider->open()) + EventManager::post(provider); } }