fix(lru): prevent unbounded cache growth on iOS 18+#4377
Merged
Conversation
|
@Aboudjem is attempting to deploy a commit to the Wevm Team on Vercel. A member of the Team first needs to authorize it. |
🦋 Changeset detectedLatest commit: 46c1e9c The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
b78c595 to
1bdbda7
Compare
Fixes wevm#2911 — `isAddress()` causes memory leak on iOS 18+ when called with 8k+ unique addresses because `LruMap` entries are never evicted. Three issues in `LruMap.set()`: 1. `this.keys()` on a Map subclass can return stale iterators on iOS 18 JavaScriptCore — changed to `super.keys()` to bypass subclass dispatch 2. Truthy check `if (firstKey)` silently skips eviction for falsy keys (e.g. empty string) — changed to `firstKey !== undefined` 3. Re-setting an existing key didn't refresh its LRU position — added delete-before-set to move updated keys to end of insertion order
1bdbda7 to
f169b90
Compare
bdf8494 to
69e0d6e
Compare
Amp-Thread-ID: https://ampcode.com/threads/T-019cfd58-c79c-779f-92ea-4af5742b9af2 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019cfd58-c79c-779f-92ea-4af5742b9af2 Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019cfd58-c79c-779f-92ea-4af5742b9af2 Co-authored-by: Amp <amp@ampcode.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes #2911 —
isAddress()causes memory leak on iOS 18+ when called with 8k+ unique addresses.Root Cause
Three issues in
LruMap.set()(src/utils/lru.ts):this.keys()on Map subclass returns stale/undefined iterators on iOS 18 JavaScriptCore — changed tosuper.keys()to bypass subclass dispatchif (firstKey)silently skips eviction for falsy keys (e.g. empty string"") — changed tofirstKey !== undefineddeletebeforesetfor existing keys.Changes
src/utils/lru.ts— 4 lines changed inset()methodsrc/utils/lru.test.ts— 2 regression tests added:Why iOS 18 specifically
iOS 18 shipped a JavaScriptCore update that changed iterator behavior on
Mapsubclasses. Whenthis.keys().next().valueis called on a class thatextends Mapand has overriddenset/delete, the iterator can returnundefinedinstead of the first key. Theif (firstKey)guard then silently skips eviction, and the cache grows without bound.Both
isAddressCache(8192 entries) andchecksumAddressCache(8192 entries) are affected, compounding the leak.Test plan