mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #5737] [Bug] inspect-plist rejects valid data-bearing plists at depth 129 while deeper integer plists succeed #3484
Closed
opened 2026-10-31 00:41:01 +00:00 by bsakaguchi
·
4 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#3484
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 @coygeek on GitHub (Oct 21, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/5737
Before submitting
Area
Native analysis or decompilation
Observed behavior
inspect-plistrejects a valid binary plist containing a two-byte data leaf at value depth 129 withunreadable_output. The same command accepts data at depth 128 and integer leaves at depths 129 and 200. Apple'splutilaccepts the failing source and its XML conversion. Inspecting that converted XML also fails. The error calls the conversion unreadable and recommendsrea doctorinstead of identifying the depth restriction.Reproduction
Run from a built source checkout with locked dependencies installed, on macOS with Python 3, system plutil and jq:
The independent verifier executed each CLI fixture once at the baseline below. I reran the script after a fresh
npm run build:cachedon fetched main; each of its five CLI invocations reproduced the same result. No target code or application was executed.Expected behavior
Return the complete nested structure with the depth-129 data leaf represented as
{ "$plist_type": "data", "base64": "AAE=" }, as in the depth-128 control, and retain accurate source format, provenance and limitations. If XML conversion remains the decoding path, retain its applicable limitation. The same depth already succeeds for an integer leaf.The inspect_plist contract advertises normalized JSON for a selected local plist. Native investigation guidance documents typed scalar projection for XML conversion. Its 128-level documented bound belongs to keyed-archive inspection, rather than ordinary plist inspection. Resource protection and malformed-input validation must remain effective; a genuine resource refusal should identify the bound accurately.
Impact and scope
P2: deterministic rejection of this bounded valid input class returns no normalized facts and gives misleading recovery guidance. Baseline and current-main executions agree. Production frequency is unknown; no data mutation or security-boundary crossing was observed. Converting to XML also fails. Replacing data with an integer changes the selected evidence, so a safe practical workaround preserving the complete result remains unverified. Dates, shipped application fixtures, MCP and other platforms were not tested.
REA version
rea-agents6.7.0, source baseline9d8e7803326a382cbbb3ffdb900f5e93e5442d68. Rechecked with a fresh build and public CLI execution on fetched maind0067ba34a39ea47dd7e11bb2e6169bc0938cc3f(also 6.7.0): still reproduces. The lockfile did not change between those revisions.Runtime and platform
Node.js v26.12.0; macOS 27.0.1; arm64; Python 3 standard-library plistlib and system plutil. No Hopper/Ghidra/IDA involvement.
Target and artifact context
Synthetic binary property lists containing dictionaries nested 128 or 129 levels around data bytes
00 01, plus integer-1 controls at depths 129 and 200. The failing binary is also converted to XML for a second inspection. No private target data or live service is involved.Interface
CLI
Earliest failure stage
Native analysis or reconstruction
Relevant output or evidence
Fresh current-main public CLI results, reduced to relevant fields:
Both
plutil -lintcalls reportOK; XML conversion exits 0. JSON conversion reportsInvalid object in plist for JSON format, selecting REA's XML fallback. Both failing CLI responses have categoryexecution_failure,retryable: false, and advice to runrea doctor. I checked the successful controls' complete nested structures and exact leaves: typed data with base64AAE=at depth 128 and numeric1at depths 129 and 200. The data control includes the XML-conversion limitation; both integer controls have no limitations.Evidence provenance: observed public CLI and native utility checks, independently reproduced at the baseline and rerun on main. The rejecting guard identified below is source-derived reasoning.
Typed outcome or recovery expected
The same depth-129 binary fixture should succeed with the complete nested structure, exact typed data leaf,
format: "binary", and accurate provenance and limitations. Its converted XML should also succeed while retaining its own source format. Preserve all three successful controls. Proposed discriminating checks: malformed XML and unsupported non-ASCII data literals must still fail, and keyed-archive and Interface Builder resource contracts must remain intact. These are acceptance checks, not a claim of a tested fix.Analysis or suspected cause
Source-derived reasoning: NativeMacOSProvider.ts selects XML conversion after JSON refusal. propertyListXmlSource.ts rejects value depth above the shared
MAX_PLIST_DEPTH(128) during preflight. parsePlistXml replaces that exception with the unreadable-conversion message. The successful small-integer JSON path bypasses that XML preflight and projection.The first rejecting guard is REA's preflight, not evidence that its bundled plist decoder failed. The shared depth bound is intentional; the defect is its undocumented, value-type-dependent application in
inspect_plistand loss of the diagnostic. This report does not ask to remove resource bounds from other consumers. Current main retains these paths.Additional context
Related #5701, #5702, #5703 and #5705 concern control-character rejection, Unicode separators, fractional dates and negative zero through XML fallback. This data-only fixture has its own depth-bound restoration condition. Closed #2105 / merged #2161 cover early rejection of over-limit keyed archives; closed #3949 / merged #4114 cover Interface Builder values within its supported depth budget. Their fixes do not restore this ordinary-plist inspection case.
Prepared with AI assistance and independent verification. No fix or successful restoration has been tested. Last known good version: NOT_ENOUGH_INFO; none established.
@XinwangTao commented on GitHub (Oct 21, 2026):
The interesting part here is the asymmetry: integer leaves sail past depth 129/200 while a two-byte data leaf stops at 129, and the error is misreported as unreadable_output pointing at doctor. That reads like a parser-side bound on data-bearing leaf nodes (the 128-level documented limit) that was never surfaced to the user. The fix direction from #5741 also applies: once the parser knows the input exceeds its structural bound, it should say so explicitly (actual depth vs limit) and treat it as a clear out-of-scope rejection, not an unreadable blob. Worth adding the depth-129 data fixture to the contract tests so the diagnostic message is pinned down alongside the fix.
@kaoru0822-kitauji commented on GitHub (Oct 21, 2026):
Rechecked on current main
a5f982de8(freshnpm run build:cached, macOS arm64, built CLI), using the issue's fixtures.d672cc239changed the binary path:data128.plistjqitself rejects the 128-level output (Exceeds depth limit), so I did not project the valuedata129.plistresource_constraint: "binary plist nesting exceeds the native plist decode budget"int129.plistresource_constraintint200.plistresource_constraintdata129.xml(plutil -convert xml1ofdata129.plist)unreadable_outputwith reason "plutil XML conversion was not a readable plist", plusrea doctoradviceSo for binary input, the data/integer asymmetry is gone. Both leaf kinds now get the same typed nesting-budget refusal at depth 129. Whether a fixed 128-level budget is the intended contract is the maintainers' call.
The XML-input part still reproduces as reported: a depth-129 XML plist is misreported as unreadable output with doctor advice, instead of a typed nesting refusal or a decode. That appears to belong with the XML-fallback siblings (#5702, and the remaining parts of the #5701 family). Source-derived reasoning only; I did not trace the XML branch. I am not taking this issue.
@XinwangTao commented on GitHub (Oct 21, 2026):
Good to see the binary path now returns resource_constraint with an explicit "nesting exceeds the native plist decode budget" message — that's the right direction and much more actionable than the old unreadable_output.
One remaining inconsistency though: the XML conversion path (data129.xml converted from the same fixture) still fails with unreadable_output and suggests
rea doctor, even though the root cause is the same depth-129 data leaf. Since the binary decoder already knows how to classify this as a resource constraint, the XML path should surface the same classification (actual depth vs documented bound) instead of falling back to "unreadable" — otherwise users converting valid plists to XML will keep hitting the misleading error. Also worth noting the error message itself should reference the actual nesting bound rather than a generic doctor hint.@XinwangTao commented on GitHub (Oct 21, 2026):
Thanks for the recheck on main. The binary-path asymmetry being gone (both data and integer leaves now return the same typed resource_constraint at depth 129) matches the parser-side bound theory — good to see it unified. The XML-input path still misreporting depth-129 input as unreadable_output with rea doctor advice remains the real UX problem: users get a misleading recovery hint instead of a precise "nesting exceeds the decode budget" refusal. Suggest pinning a depth-129 XML fixture in the contract tests alongside the binary one, so the XML fallback branch surfaces the same typed refusal as its binary sibling.