From a72b98ed5a357bb380d81f07f3f36946aa729bb2 Mon Sep 17 00:00:00 2001 From: Mark Rowe Date: Mon, 23 Feb 2026 23:26:27 -0800 Subject: [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`. --- view/sharedcache/core/SlideInfo.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'view/sharedcache/core/SlideInfo.h') diff --git a/view/sharedcache/core/SlideInfo.h b/view/sharedcache/core/SlideInfo.h index 75134985..fda5ea4d 100644 --- a/view/sharedcache/core/SlideInfo.h +++ b/view/sharedcache/core/SlideInfo.h @@ -33,10 +33,10 @@ class SlideInfoProcessor public: explicit SlideInfoProcessor(uint64_t baseAddress); - std::vector ReadEntryInfo(const MappedFileAccessor& accessor, const CacheEntry& entry) const; + std::vector ReadEntryInfo(const MappedFileRegion& file, const CacheEntry& entry) const; // Write the slide information back to the entries memory mapped regions. - void ApplyMappings(MappedFileAccessor& accessor, const std::vector& mappings) const; + void ApplyMappings(MappedFileRegion& file, const std::vector& mappings) const; - std::vector ProcessEntry(MappedFileAccessor& accessor, const CacheEntry& entry) const; + std::vector ProcessEntry(MappedFileRegion& file, const CacheEntry& entry) const; }; -- cgit v1.3.1