diff options
| author | Mason Reed <mason@vector35.com> | 2025-02-19 23:17:55 -0500 |
|---|---|---|
| committer | Mason Reed <mason@vector35.com> | 2025-04-02 05:36:54 -0400 |
| commit | ad337df11a3939dea833fc39d7ee555a427b9d09 (patch) | |
| tree | f393f670f428eb6f2f621eeb3dc630caca62fdaf /view/sharedcache | |
| parent | 0d228d32f6087ea95d5de5235dd25aa6eeb7f406 (diff) | |
[SharedCache] Warn when loading BNDB with different shared cache metadata version
This does not actually give the user control to exit early, that looks to need core changes.
Diffstat (limited to 'view/sharedcache')
| -rw-r--r-- | view/sharedcache/core/DSCView.cpp | 8 | ||||
| -rw-r--r-- | view/sharedcache/core/SharedCache.cpp | 15 | ||||
| -rw-r--r-- | view/sharedcache/core/SharedCache.h | 1 |
3 files changed, 24 insertions, 0 deletions
diff --git a/view/sharedcache/core/DSCView.cpp b/view/sharedcache/core/DSCView.cpp index 782bbe30..aae1e3c4 100644 --- a/view/sharedcache/core/DSCView.cpp +++ b/view/sharedcache/core/DSCView.cpp @@ -195,6 +195,14 @@ bool DSCView::Init() if (m_parseOnly) return true; + // Check the metadata version if there is one, so we can alert the user to why they have no loaded images. + // TODO: Once the view is able to be exited early we should offer to close the view if the user does not want to upgrade. + auto metadataVersion = SharedCacheCore::SharedCacheMetadata::ViewMetadataVersion(GetParentView()); + if (metadataVersion.has_value() && metadataVersion.value() != METADATA_VERSION) + { + ShowMessageBox("Invalid Shared Cache Metadata!", "The BNDB shared cache metadata was created with a different version of the Shared Cache view, to continue the metadata has to be recreated. You will need to add your images back again."); + } + // Add Mach-O file header type info EnumerationBuilder cpuTypeBuilder; cpuTypeBuilder.AddMemberWithValue("CPU_TYPE_ANY", MACHO_CPU_TYPE_ANY); diff --git a/view/sharedcache/core/SharedCache.cpp b/view/sharedcache/core/SharedCache.cpp index 9e578384..a9d8a70b 100644 --- a/view/sharedcache/core/SharedCache.cpp +++ b/view/sharedcache/core/SharedCache.cpp @@ -3594,6 +3594,21 @@ bool SharedCacheMetadata::ViewHasMetadata(BinaryView* view) return view->QueryMetadata(Tag); } +std::optional<unsigned int> SharedCacheMetadata::ViewMetadataVersion(BinaryView* view) +{ + // Whether the view has compatible metadata. I.e. if the version differs. + Ref<Metadata> viewMetadata = view->QueryMetadata(Tag); + if (!viewMetadata) + return std::nullopt; + DeserializationContext context; + rapidjson::ParseResult result = context.doc.Parse(viewMetadata->GetString().c_str()); + if (!result) + return std::nullopt; + if (!context.doc.HasMember("metadataVersion")) + return std::nullopt; + return context.doc["metadataVersion"].GetUint(); +} + // static std::optional<SharedCacheMetadata> SharedCacheMetadata::LoadFromView(BinaryView* view) { diff --git a/view/sharedcache/core/SharedCache.h b/view/sharedcache/core/SharedCache.h index f6a1e7a8..c78ad554 100644 --- a/view/sharedcache/core/SharedCache.h +++ b/view/sharedcache/core/SharedCache.h @@ -668,6 +668,7 @@ private: public: static std::optional<SharedCacheMetadata> LoadFromView(BinaryView*); static bool ViewHasMetadata(BinaryView*); + static std::optional<unsigned int> ViewMetadataVersion(BinaryView*); const std::unordered_map<uint64_t, std::shared_ptr<std::unordered_map<uint64_t, Ref<Symbol>>>>& ExportInfos() const; std::string InstallNameForImageBaseAddress(uint64_t baseAddress) const; |
