mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #1801] [Bug] Managed static provider rejects game-sized assemblies: 256x per-byte IL/blob charge exhausts the 64 MiB budget at ~256 KB of IL #604
Closed
opened 2026-10-15 18:26:33 +00:00 by bsakaguchi
·
5 comments
No Branch/Tag specified
main
codex/procedure-reference-stacked
release-please--branches--main--components--rea-agents
release-please--branches--main--components--rea-agents--release-notes
codex/kuna-independent-retry
codex/byte-search-overlay-coverage
codex/open-failure-target-receipt
codex/kuna-xref-evidence
codex/ghidra-ambiguous-procedure-recovery
codex/function-source-bundle
codex/trace-function-integration-prototype
codex/snapshot-source-closure
codex/recorded-evidence-array-pages
codex/evidence-recovery-redesign
codex/trace-feature-address-scope
codex/call-discovery-scope
codex/ghidra-literal-candidate-evidence
codex/decompile-directory-independent-retry
codex/retry-provenance-base
codex/value-flow-capability-experiment
codex/ghidra-containing-instruction
cursor/readme-discord-button-ef9f
dependabot/github_actions/actions/setup-node-7.1.0
dependabot/github_actions/actions/upload-artifact-7.0.2
dependabot/npm_and_yarn/npm-minor-and-patch-d8d97ce6df
codex/kuna-1989
fix/8559-native-ui-fixture-ownership
fix/8555-go-verifier-mcp-ownership
codex/provider-capability-recovery
fix/8642-rizin-target-stdin
codex/ghidra-memory-effect-scope
codex/ghidra-annotation-entry-selector
codex/ghidra-readonly-recovery
codex/ghidra-regex-verifier-recovery
codex/evidence-discovery-view-guidance
fix/8545-bulk-append-overflow
fix/8428-navigation-refusal-alternatives
codex/address-context-recovery
codex/matching-member-limitations
codex/unknown-scope-contract
codex/evidence-view-guidance
feat/8373-native-trace-views
codex/ghidra-snapshot-verifier-binding
codex/elf-export-visibility
codex/evidence-view-recovery
codex/native-reference-cli-help
codex/provider-candidate-observation-scope
codex/kuna-session-verification
codex/ghidra-switch-lifetime-guidance
codex/pseudocode-paging-discovery
codex/clarify-evidence-view-support
codex/kuna-xrefs-selector-recovery
codex/context-capacity-recovery
codex/evidence-closure-large-links
codex/same-function-evidence-identity
codex/ghidra-verifier-inspected-jdk
codex/audit-guided-workflows
codex/crash-prompt-retained-dossiers
codex/analysis-view-error-recovery
codex/kuna-verifier-target-selection
codex/ghidra-selected-project-call-coverage
codex/docs-native-analysis-scope
codex/ghidra-java-socket-boundary
codex/ghidra-retained-snapshot-verifier
codex/ghidra-search-inventory-facts
fix/8284-zero-argument-parameter-bindings
fix/8198-ui-action-handler-offset
fix/8257-elf-entry-label-identity
fix/8304-deferred-output-schema-projection
fix/8277-call-path-computed-target-uncertainty
fix/pr-8089-conflicts
fix/ci-static-duplicate-export
dependabot/npm_and_yarn/lint-staged-17.6.0
dependabot/github_actions/actions/download-artifact-8.0.2
dependabot/npm_and_yarn/write-file-atomic-8.0.0
dependabot/npm_and_yarn/canonicalize-5.1.0
dependabot/github_actions/actions/cache/restore-6.1.0
dependabot/npm_and_yarn/toon-format/toon-4.4.0
dependabot/github_actions/actions/deploy-pages-5.0.1
codex/review-fixes-pr-2403
codex/review-fixes-pr-2400
codex/process-terminal-width
codex/test-brittleness-cleanup
verify/7167-browser-connect-macos
fix/7167-browser-connect
feat/native-matching-allowance-setting
feat/browser-scenario-dry-run
test/managed-caller-parameters-20261024
codex/parser-fortythird-boundaries
fix/6926-pinvoke-platform-decorations-20261023
fix/6889-har-body-encoding-20261023
fix/6888-sqlite-schema-budget-20261023
fix/dependency-security-gates-6708
cursor/evidence-overwrite-rebase-b4ac
feat/4057-verify-native-exports
fix/windows-acl-observer-overhead-20261022
cursor/erlang-beam-restack-4476
cursor/pe-certificate-review-bf32
fix/6116-javascript-application-fs-errors
fix/6061-unmapped-runtime-script-unknown
feat/browser-scenario-summary
fix/pe-certificates
codex/verify-3407
cursor/rebase-5699
cursor/rebase-5352
cursor/rebase-5600
cursor/fix-cli-schema-omission-10a8
codex/audit-hopper-shutdown-reasons-20261021
fix/demangle-swift-omitted-record
fix/nib-boolean-value-types
cursor/cancellation-partial-observation-a5ac
fix/ib-object-limit-reasons
fix/electron-fuse-limit-advice
fix/kuna-doctor-dangling-cache
fix/fixed-budget-refusal-advice
fix/js-ipc-listener-dedup
fix/js-return-member-provenance
fix/dmg-integrity-retry-advice
fix/ida-doctor-readiness
fix/kuna-version-probe-output-drain
fix/legacy-swift-runtime-name-matching
fix/dylib-lazy-load-commands
fix/browser-scenario-startup-cancel
fix/swift-nested-punycode-classification
fix/compare-unselected-scopes
fix/objc-method-budget-coverage
fix/dmg-mounted-root-observations
audit/ci-tests-20261019-round2
release/6.7.0
fix/wabt-cleanup-retry-resolution
fix/electron-fuse-elf-pe-architecture
fix/native-plist-descriptor-ownership
fix/kuna-caller-cleanup-ownership
experiment/atomic-codemode-20261016
review/first-contributor-3776
fix/call-resolution-full-read-cycles
fix/member-mutation-selection-repeat
experiment/atomic-re-tools-20261015
perf/member-mutation-lazy-origins
perf/static-network-mutation-index
fix/hopper-startup-lifecycle
audit/3050-windows-proof-20261015
feat/windows-window-capture-2183
audit/3049-windows-proof-20261015
audit/3735-macos-fixtures-20261015
fix/batch-decompile-null-pseudocode
fix/kuna-inventory-honors-jobs
experiment/browser-codemode-tool-design-20261015
fix/hopper-clean-runtime-argv
codex/review-2049-27f1b367
review-fixes/pr-2787-routing
fix/3360-scoped-this-emitters
fix/3367-replaced-global-effects
fix/3838-compact-any-value-items
test/hopper-download-probe-20261015
codex/windows-runtime-creation-red-green-20261015
codex/windows-readonly-root-red-green-20261015
codex/windows-root-share-red-green-20261015
codex/exp-1685-win-mcp-startup
codex/bug-sweep-20261015
investigate/2190-windows-package-phases
investigate/3543-macos-cli-deadline
perf/3281-reverse-tools-feedback-quality
fix/3406-hopper-doctor-fixture
fix/3341-wrapper-require-test-context
fix/3301-owned-uninstall-fixtures
fix/3164-compiler-input-ownership
fix/pcap-cleanup-stdout-newline-20261014
perf/interface-builder-summary
codex/review-fixes-pr-1977
fix/ghidra-effective-jvm-platform
fix/docs-turkish-rust-link-20261013
fix/main-maintenance-ci-20261010
fix/recover-binary-session-process-effects
codex/review-fixes-pr-2457
codex/ci-required-cancellation-gate
fix/main-format-baseline-20261013
fix/setup-preserve-entry-fields
cursor/restore-main-checks-1ffc
fix/ghidra-bridge-hashmap-import
codex/shared-ci-jadx-json-default-20261013
codex/shared-ci-ghidra-test-groups-20261013
codex/shared-ci-java-fixture-format-20261013
codex/fix-intrinsic-invocation-boundaries
test/release-preflight-reusable-jobs
test/js-parameter-provenance-expectation
fix/linux-hopper-verification-current
test/2419-ghidra-elf-probe-size
followup/pr-1544-native-ida
codex/fold-pr-2230-contribution
docs/readme-responsible-use
fix/issue-2064
fix/issue-2050
fix/issue-2053
fix/issue-1968
fix/issue-1945
experiment/codemode-bridge-20261011
fix/tool-effects-negative-wording-1904-20261012
fix/1842-electron-interop-provenance
feat/recover-javascript-multi-input
refactor/website-i18n-prep
fix/nativeaot-pe-virtual-extent
fix/browser-verifier-ci-hang
fix/pe-resources-input-selection
docs/beginner-friendly-guides
docs/beginner-setup-guide
fix/javascript-analysis-worker-1563
fix/1649-ghidra-duplicate-names
fix/javascript-export-keys-integration-1369
test/maintenance-boundary-contracts-20261011
review/javascript-export-keys-1369
review/process-live-progress-1483
test/javascript-1495-growth-ratio
fix/ci-escape-timing
docs/normalized-terminal-geometry-1450
release/6.3.0
archive/release-6.3.0-pr1381
release/6.2.0
fix/electron-preload-dynamic-override
fix/javascript-self-referential-bundler-edges
release/6.1.0
cursor/grok-client-cherry-pick-0b56
feat/signature-posture
feat/dyld-shared-cache
feat/artifact-integrity-policy
feat/pkg-inventory
release/6.0.0
chore/sync-release-5.0.0
release/5.0.0
cursor/cloud-agent-node-787e
fix/javascript-xhr-open-endpoints
review/pr-711-realpath-fallback-wording
cleanup/replay-confinement
codex/test-suite-performance
codex/issue-foundations
codex/address-open-issues-2026-07-20
agent/javascript-vite-rollup-esbuild-adapters
agent/process-cleanup
agent/triage-integration
agent/unknown-commands-registry
feat/mcp-identity-metadata
morlvps/issue_cleanup
codex/installer-redesign
morl/roadmap-investigation-core
morl/roadmap-investigation-docs
release-please--branches--main--components--rea
rea-agents-6.8.0
rea-agents-6.7.0
rea-agents-6.6.0
experiment/atomic-codemode-wait-runtime-20261016
rea-agents-6.5.0
rea-agents-6.4.0
rea-agents-6.3.0
rea-agents-6.2.0
rea-agents-6.1.0
rea-agents-6.0.0
rea-agents-5.0.0
rea-agents-4.1.0
rea-agents-4.0.1
rea-agents-4.0.0
rea-agents-3.2.1
rea-agents-3.2.0
rea-agents-3.1.0
rea-agents-3.0.0
rea-agents-2.7.0
rea-agents-2.6.0
rea-agents-2.5.1
rea-agents-2.5.0
rea-agents-2.4.0
rea-agents-2.3.0
rea-agents-2.2.0
rea-agents-2.1.0
rea-agents-2.0.0
rea-agents-1.7.0
rea-agents-1.6.0
rea-agents-1.5.0
rea-agents-1.4.0
rea-agents-1.3.0
rea-agents-1.2.0
rea-agents-1.1.0
rea-agents-1.0.0
rea-agents-0.5.0
rea-agents-0.4.0
rea-agents-0.3.0
rea-0.2.1
rea-0.2.0
Labels
Clear labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
Mirrored from GitHub Pull Request
question
roadmap
triage
No labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
question
roadmap
triage
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
morluto/rea#604
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @Nelglor on GitHub (Oct 11, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/1801
Before submitting
Area
dotnet (managed static provider)
Observed behavior
inspect-managed-members(and the MCP tool) rejects ordinary game-sized assemblies withresource-limit/metadata.representation, returning zero types and zero methods. A 247 KB UnityAssembly-CSharp.dlland a 2.5 MBassembly_valheim.dllboth fail. Only very small assemblies (a 23 KB stub,System.Memory.dll) succeed.Reproduction
valheim_Data/Managed/assembly_valheim.dllfrom Steam is a public example).npx -y rea-agents@6.4.0 inspect-managed-members /path/assembly_valheim.dll --format jsontypes: [],methods: [], and theresource-limitcoverage issue above.Expected behavior
A 2.5 MB assembly with a few hundred KB of IL should decode fully, or at worst report partial coverage after a genuinely large amount of retained representation. The 64 MiB budget is described in docs as a representation budget, not a cap on raw IL size.
Impact and scope
Every real-world managed target I tried fails, so the managed track is unusable for game assemblies, which is the main case where a headless
.NETinspector is attractive (dnSpy/ILSpy replacement). Small library assemblies work.REA version
rea-agents 6.4.0 (npx)
Runtime and platform
Node 26.10.0; Linux x86_64 (CachyOS); no native provider involved
Target and artifact context
Windows PE/CLI x86 assemblies produced by Unity (Mono backend); public Steam game files; no .NET runtime involved
Interface
CLI (
rea inspect-managed-members); the MCP tool shares the same pathEarliest failure stage
parseMethods→methodBodyindist/dotnet/ManagedMemberRows.js/ManagedMethodBodyReader.js, at file offset 136816 of the 2.5 MB Valheim assembly, i.e. roughly 5% into the method bodies.Relevant output or evidence
Instrumented
ManagedDecodeBudget.prototype.reserveto log the failing call and the cumulative reservation:Typed outcome or recovery expected
Full decode for assemblies of this size. If a budget must apply, a partial result with
coverage.state: "partial"and the decoded prefix retained, rather than discarding everything.Analysis or suspected cause
ManagedMethodBodyReader.js:66chargesil.length * 256bytes per method body, andManagedMemberRows.js:151chargesbytes.length * 256per blob signature, all against the single shared 64 MiBManagedDecodeBudget. 64 MiB / 256 = 256 KiB, so any assembly whose total IL plus signature blobs exceeds roughly 256 KB is rejected regardless of how much representation is actually retained. The 256x multiplier looks like a worst-case per-byte JSON projection estimate applied to the raw IL length, which overshoots by two orders of magnitude for normal code.Additional context
Found while evaluating REA as a headless alternative to dnSpy for Unity save-file reversing. Two further gaps that would matter for that use case, noted here rather than as separate issues since they may be by design:
ldstranchors carry only the#UStoken (0x70000001), never the literal text; and call edges name member-ref targets without their declaring type (target_name: ".ctor"), so "who callsCryptoStream" is not answerable by name.@llegui commented on GitHub (Oct 11, 2026):
Same failure here on large .NET Framework 4.x (x86) assemblies:
of 18 assemblies, only the 7 smallest decoded; the rest failed with the same
resource-limit / metadata.representationissue, including one of 375 KB.Workaround that confirms the diagnosis above: making the constant in
dist/dotnet/ManagedDecodeBudget.jsconfigurableand running with
REA_MANAGED_BUDGET_MB=4096(plusnode --max-old-space-size=8192)decodes all 11 failing assemblies (5–40 s each, coverage
partialwith no issues,JSON output 4–77 MB). So the accounting, not real memory, is what rejects them.
An env var / CLI option for the budget, or a lower per-byte charge, would fix it.
@akushonkamen commented on GitHub (Oct 11, 2026):
Confirming the diagnosis from reading
origin/main(@ed084b3d): the flat 256x per-byte charge introduced by0f0d6e4dexhausts the 64 MiB representation budget at ~256 KB of charged input.Charging sites I measured:
src/dotnet/ManagedMemberRows.ts:273—reserve(bytes.length * 256, layout.blob.offset)(blob heap; this is what fires first on MemberRef-dense assemblies likeassembly_valheim.dll, offset 136816 in the report)src/dotnet/ManagedMemberInstructionDecoder.ts:492—count * 256(IL bodies; a ~340 KB-IL synthetic assembly trips this at offset ~274 KB)Reproduced red-to-green against a synthetic 965 KB assembly built with the dotnet SDK: current
mainreturnsresource-limit / metadata.representationwithtypes: [],methods: []; the same DLL decodes fine (complete, all methods) on a checkout without0f0d6e4d.Working on a fix. Plan: replace the flat 256x factor with a bounded per-byte representation estimate (JSON-escape worst case, in line with the existing
reserveString×6 accounting inManagedDecodeBudget.ts:32-35), keep theresource-limitfailure semantics, and include{charged, budget}in the failure detail for diagnosability. I'll also evaluate making the budget overridable (env) as llegui suggests — happy to follow whatever the maintainers prefer between "tighter accounting" vs "configurable budget". One caveat for honesty: my fixtures are synthetic (dotnet SDK-generated IL + synthetic blob heap), not the commercial-obfuscator samples llegui tested.🤖 AI-assisted: this comment and the upcoming fix were prepared with Claude (anthropic), account akushonkamen.
@netfox-web commented on GitHub (Oct 11, 2026):
Another data point, rea 6.4.0 / Node 24.19 / win32 x64, no obfuscator involved:
inspect-managed-artifactsucceeds (classification,assembly,referencesall fine), butinspect-managed-membersreturnstypes: []withresource-limit / metadata.representationat offset 239581 ("exceeds the 67108864 byte representation budget").metadata_size2,054,868,resources_size3,151,856) fails already ininspect-managed-artifact(metadata.status: partial,assembly: null).So ordinary line-of-business WinForms apps hit this too, not only game-sized assemblies. An env override as suggested above would unblock us immediately. Thanks for the quick diagnosis.
@akushonkamen commented on GitHub (Oct 11, 2026):
Update: the fix is implemented and validated on a local branch (
fix/1801-managed-decode-budget-accounting, against main @f2150eb9); a pull request referencing this issue follows.Root cause (sharper than "the constant is too big"): the flat 256x per-byte pre-charges at
ManagedMemberRows.ts:273(signature blobs),ManagedMethodBodyReader.ts:102(IL bodies), andManagedMemberInstructionDecoder.ts:492(exception clauses) bill transient decode expansion cumulatively against the 64 MiB retained representation budget introduced by0f0d6e4d. Decoded records already get billed by the retained ledger through the existing precise paths (admitManagedProjectionatManagedMemberInspector.ts:214, heap stringreserveString, per-digest charges) — so the pre-charge made the effective capacity for input 256x smaller while double-counting everything that is actually kept. 64 MiB ÷ 256 = the ~256 KB blow-up point in the title.Fix: each decode call now admits its own 256x expansion against a new per-call
admitDecodeExpansionceiling (1 GiB,ManagedDecodeBudget.ts), preserving 0f0d6e4d's fail-before-expansion property for a single pathological body without letting transient work spend retained capacity; the signature charge becomes a precise retained estimate (reserveString(bytes.length * 11 + 64)— worst is an 11-char primitive name per blob byte, house ×6 factor);resource-limitdetails now carryattempted/remainingbytes for diagnosability. The 64 MiB retained budget itself is unchanged;docs/managed-code-analysis.md"Resource admission" is updated to describe the two accounts.Validation (all commands run locally):
src/dotnet/ManagedDecodeBudgetCapacity.test.ts: red 5/5 before the change (both fixture tests fail with exactlyresource-limit / metadata.representation), green 5/5 after. Regression:vitest run src/dotnet/90/90; managed boundary/acceptance/composition suites 43/43;npm run check:fast(typecheck+lint) passes;node scripts/verify-test-discovery.mjsfinds all 834 test files exactly once.resource-limitat offset 274572 (byte-identical symptom to this report); fixed build decodes all 5201 methods in 224 ms. A 286 KB 2201-method assembly (inspect-managed-membersCLI) reportscoverage: completewith all method bodies present.resource-limit— now with precise diagnostics. Reported-size assemblies (hundreds of KB to a few MB) sit well under that ledger. If maintainers want the projection ledger more permissive (its per-record ×6 key/scalar accounting dominates) or an env override as llegui and netfox-web suggest, I'm happy to follow up or fold it in.🤖 AI-assisted: prepared with Claude (anthropic), account akushonkamen.
@akushonkamen commented on GitHub (Oct 11, 2026):
An update after studying the freshly merged #1768 (current
main@f178bf1c): it supersedes my earlier comment above, and we are not opening a pull request for this issue.Independent positive check of #1768. The real dotnet SDK assembly I used to reproduce this issue's aggregate failure (965 KB, 5201 methods, ~340 KB of aggregate IL — rejected on the pre-#1768 tree with
resource-limit/metadata.representationat offset 274572) now decodes fully onf178bf1c:coverage.state: "complete", no issues, 5201/5201 method bodies present (inspect-managed-members --format json, ~1.6 s). That is the "few hundred KB of IL" class this report describes, so from our side the reported scenario is resolved.One residual gap is still reproducible on
f178bf1c: a single item whose ×256 decode bound alone exceeds the budget is still rejected, no matter how small the retained output is:resource-limit/metadata.representation, offset 2572;Both are fixture-level repros against
inspectManagedMembersBytes; exact steps available on request. Whether this is worth changing is the maintainer's call: #1768's live-accumulation bound looks deliberate, and its new regression test ("bounds a method's IL and exception sections together",src/dotnet/ManagedMemberInspector.test.ts) requires rejecting a method whose IL bound (~40 MiB) plus exception-section bound (~28 MiB) are live together. Admitting a lone 300 KB body (~76.8 MiB bound) is mathematically incompatible with keeping that test, so the two policies cannot be combined cleanly. We explored a per-call decode-expansion admission (1 GiB ceiling) that passes both residual cases but fails that test by construction, and shelved it rather than weaken a freshly reviewed bound — details on request. (Method-merging obfuscators can produce such oversized single bodies, so the residual may still matter for a minority of obfuscated targets.)Investigated with AI assistance.