summaryrefslogtreecommitdiff
path: root/view/sharedcache/core/SharedCacheView.cpp
diff options
context:
space:
mode:
authorMark Rowe <mark@vector35.com>2026-02-23 23:26:27 -0800
committerMark Rowe <mark@vector35.com>2026-02-24 14:24:54 -0800
commita72b98ed5a357bb380d81f07f3f36946aa729bb2 (patch)
treeca48b3607721fa2c109b7989ae4b911bab89ea6d /view/sharedcache/core/SharedCacheView.cpp
parent3eda43f185a0411538745a99e251122e6a9192e0 (diff)
[DSC] Simplify file mapping to fix intermittent unrelocated pointers
The `FileAccessorCache`'s LRU eviction could discard a file's mapped data after slide info had already been applied to it. Future accesses to the file produced a fresh mapping, but failed to reapply the slide info. This could result in pointers not correctly being slid, such as in https://github.com/Vector35/binaryninja-api/issues/7689. The LRU cache existed to stay within OS file descriptor limits, since the old `MappedFile` held its fd open for the lifetime of the mapping. There's no real reason for it to hold the file descriptor open like this. Closing it after `mmap` is sufficient to avoid the file descriptor limits. `MappedFileRegion` replaces the combination of `FileAccessorCache`, `WeakFileAccessor`, and `MappedFileAccessor`. It closes the fd immediately after mmap, so all files can stay mapped without consuming descriptors, making the cache unnecessary. `MappedFileRegion` is owned directly by the `CacheEntry` for its full lifetime. Slide info is applied exactly once to each `MappedFileRegion`.
Diffstat (limited to 'view/sharedcache/core/SharedCacheView.cpp')
-rw-r--r--view/sharedcache/core/SharedCacheView.cpp12
1 files changed, 0 insertions, 12 deletions
diff --git a/view/sharedcache/core/SharedCacheView.cpp b/view/sharedcache/core/SharedCacheView.cpp
index dac39278..746bd7eb 100644
--- a/view/sharedcache/core/SharedCacheView.cpp
+++ b/view/sharedcache/core/SharedCacheView.cpp
@@ -3,8 +3,6 @@
#include <filesystem>
#include "SharedCacheController.h"
-#include "FileAccessorCache.h"
-#include "MappedFileAccessor.h"
#include "SharedCacheBuilder.h"
using namespace BinaryNinja;
@@ -17,12 +15,6 @@ SharedCacheViewType::SharedCacheViewType() : BinaryViewType(VIEW_NAME, VIEW_NAME
// We register all our one-shot stuff here, such as the object destructor.
void SharedCacheViewType::Register()
{
- auto fdLimit = AdjustFileDescriptorLimit();
- LogDebugF("Shared Cache processing initialized with a max file descriptor limit of {}", fdLimit);
-
- // Adjust the global accessor cache to the fdlimit.
- FileAccessorCache::Global().SetCacheSize(fdLimit);
-
RegisterSharedCacheControllerDestructor();
static SharedCacheViewType type;
@@ -874,10 +866,6 @@ bool SharedCacheView::InitController()
std::chrono::duration<double> elapsed = endTime - startTime;
m_logger->LogInfoF("Processing {} entries took {:.3f} seconds", totalEntries, elapsed.count());
- // If we can't store all of our files for this cache in the accessor cache we might run into issues, warn the user.
- if (totalEntries > FileAccessorCache::Global().GetCacheSize())
- m_logger->LogWarn("Cache contains more entries than the allowed number of opened file handles, this may impact reliability.");
-
// Verify that we are not missing any entries that were stored in the metadata.
// If we are that means we should alert the user that a previously associated cache entry is missing.
std::set<std::string> missingCacheEntries = m_secondaryFileNames;