diff options
| author | Mason Reed <mason@vector35.com> | 2025-04-14 15:10:31 -0400 |
|---|---|---|
| committer | Mason Reed <mason@vector35.com> | 2025-04-14 15:10:31 -0400 |
| commit | 4f7d5e40861d73a3738b63f92d9ff5feb235f8d6 (patch) | |
| tree | a371552fcf77671e91cc130fadfab57e57e25ad7 | |
| parent | 507935f828188047ee009d2216a2c2d92c8b83fd (diff) | |
[SharedCache] Fix overzealous alert about missing shared cache entries
Following the conversation in https://github.com/Vector35/binaryninja-api/issues/6631 we are going to make the edited alerts warnings and then also fix the warning showing on certain shared caches even when all entries are present.
| -rw-r--r-- | view/sharedcache/core/SharedCache.cpp | 8 | ||||
| -rw-r--r-- | view/sharedcache/core/SharedCacheView.cpp | 13 |
2 files changed, 13 insertions, 8 deletions
diff --git a/view/sharedcache/core/SharedCache.cpp b/view/sharedcache/core/SharedCache.cpp index 2eb885d4..4950c8c0 100644 --- a/view/sharedcache/core/SharedCache.cpp +++ b/view/sharedcache/core/SharedCache.cpp @@ -59,12 +59,10 @@ CacheEntry CacheEntry::FromFile(const std::string& filePath, const std::string& // Read the header, this _should_ be compatible with all known DSC formats. // Mason: the above is not true! https://github.com/Vector35/binaryninja-api/issues/6073 + // The mappingOffset should point right after the header. We use this to constrain the read size so unsupported fields are zeroed. + auto headerSize = file->ReadUInt32(0x10); dyld_cache_header header = {}; - file->Read(&header, 0, sizeof(header)); - - // Adjust the array count to actually be the "real" number for comparisons with what we load. - // This is required so we can check if we loaded the required number of caches, in view init. - header.subCacheArrayCount += header.cacheSubType; + file->Read(&header, 0, headerSize); // Read the mappings using the headers `mappingCount` and `mappingOffset`. dyld_cache_mapping_info currentMapping = {}; diff --git a/view/sharedcache/core/SharedCacheView.cpp b/view/sharedcache/core/SharedCacheView.cpp index fb80d132..4218a2fe 100644 --- a/view/sharedcache/core/SharedCacheView.cpp +++ b/view/sharedcache/core/SharedCacheView.cpp @@ -861,16 +861,23 @@ bool SharedCacheView::InitController() LogSecondaryFileName(entry.GetFileName()); // Set the number of sub-caches so we can verify it later. if (entry.GetType() == CacheEntryType::Primary) - expectedFileCount += entry.GetHeader().subCacheArrayCount; + { + const auto& entryHeader = entry.GetHeader(); + // TODO: Some caches seem to have less sub caches than what we report having. + expectedFileCount += entryHeader.subCacheArrayCount; + // On older caches we don't have any sub-caches, so we want to skip alerting the user to that fact. + if (entryHeader.subCacheArrayOffset == 0) + expectedFileCount = 0; + } } for (const auto& missingFileName: missingCacheEntries) m_logger->LogErrorF("Secondary cache file '{}' is missing!", missingFileName); // Verify that we have the required amount of sub-caches, if not alert the user. if (expectedFileCount == 1) - m_logger->LogAlertF("Primary cache file '{}' has no sub-caches! You are likely opening a secondary cache file instead of a primary one.", m_primaryFileName); + m_logger->LogWarnF("Primary cache file '{}' has no sub-caches! You are likely opening a secondary cache file instead of a primary one.", m_primaryFileName); else if (totalEntries < expectedFileCount) - m_logger->LogAlertF("Insufficient cache files in dyld header ({}/{}), loading as partial shared cache...", totalEntries, expectedFileCount); + m_logger->LogWarnF("Insufficient cache files in dyld header ({}/{}), loading as partial shared cache...", totalEntries, expectedFileCount); } auto sharedCache = sharedCacheBuilder.Finalize(); |
