mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #4561] [Bug] Ghidra synchronous Java prerequisite probes can outlive their timeout and block cancellation #2371
Closed
opened 2026-10-17 21:03:51 +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#2371
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 @morluto on GitHub (Oct 16, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/4561
Before submitting
Area
Provider or capability discovery
Observed behavior
Source-only finding: Ghidra prerequisite discovery calls
spawnSync(java, ..., {timeout:5000,maxBuffer:1MiB})with default SIGTERM and no process-family owner. The synchronous call blocks the event loop. Its timeout does not prove bounded completion or cleanup of a noncooperative command and descendants.Reproduction
NOT_ENOUGH_INFO: no hanging Java or descendant runtime reproduction performed. Inspected
systemGhidraInstallationHost().probeJavaat8116dc0651; current audit extraction moves the same execution intosrc/ghidra/GhidraJavaProbe.tswithout changing lifecycle authority.Expected behavior
Prerequisite discovery should join an owned, cancellable probe and report unresolved cleanup when closure cannot be confirmed. Reuse existing process supervision and identity primitives; do not treat a timeout, numeric PID, or root-only termination as family cleanup proof.
Impact and scope
Source-derived possibility of indefinitely stalled CLI doctor/provider discovery or MCP event loop and surviving descendants. Actual affected users/frequency/platform-specific outcomes: NOT_ENOUGH_INFO. No claim of a real JVM failure or leaked process.
REA version
8116dc0651(6.5.0 source)Runtime and platform
Pinned Node 24.18.0 semantics; platform reproduction unavailable.
Target and artifact context
No reverse-engineering target needed; configured Java prerequisite command only.
Interface
CLI and MCP discovery (source-derived)
Earliest failure stage
Setup or provider admission
Relevant output or evidence
Repository call uses synchronous Node execution, a 5s timeout and no external process owner. Pinned Node 24.18.0 documentation states that synchronous spawn waits for complete exit even after the timeout signal; a child that handles SIGTERM without exiting can keep the parent waiting. Ordinary parent termination is not proof of descendant closure.
Typed outcome or recovery expected
Preserve cancellation/deadline and exact owned cleanup facts, including retry if cleanup fails.
Analysis or suspected cause
Synchronous prerequisite admission cannot use the current asynchronous process supervision lifecycle. A correct change needs coordinated provider discovery/admission ownership rather than merely changing the kill signal or moving spawnSync to a wrapper.
Additional context
Related #4560 preserves probe failure classification/output; that work does not establish bounded lifecycle completion. Related #4227 tracks broader ownership invariants. Proposed checks: a controlled selected Java command that handles SIGTERM, descendants with inherited output, cancellation while probing, final cleanup and retry; run through public CLI/MCP with external fixture ownership.
@Nitin13-git commented on GitHub (Oct 17, 2026):
Reproduced on current
main(origin/mainat the time, macOS arm64, Node 24.18.0), with a stubjavathat ignores SIGTERM (trap "" TERM; sleep 20) selected throughjavaHome:setIntervalticked 0 times during the call, so the whole event loop was blocked (spawnSyncatGhidraInstallation.tsprobeJava).spawnSyncwith the same options andkillSignal: "SIGKILL"returned after 5.0 s; the same with an extra background child holding the output pipe also returned after 5.0 s. I have not applied this anywhere; it would bound the wait but not the 5 s event-loop block, cancellation, or descendant cleanup.The proper fix needs an owned, cancellable (async) probe, but the probe sits behind synchronous provider methods (
inspectAvailability(),inspectReadinessSnapshot(),createClient(), all part of the sharedAnalysisProviderinterface). Which design do you want?The issue mentions an audit extraction into
GhidraJavaProbe.ts; if that is already in progress, I will not duplicate it. Happy to implement whichever direction you choose.@morluto commented on GitHub (Oct 17, 2026):
The original source-only finding now has a bounded runtime reproduction on main
71929ed37(Node24.18.0, Darwin arm64), including publicnode scripts/rea.mjs doctor --json.A controlled caller-selected Java executable records startup and SIGTERM. The fixture runs under REA's existing external
runOwnedCommand/spawnOwnedProviderProcessowner with a seven-second deadline and exact process-group verification. It is an idle Node script posing as the selected prerequisite command, not a real JVM or Ghidra target.Observed sequential controls:
The direct probe's 100ms timer never fired in the ignored-SIGTERM case; it did fire after both completed direct controls. The doctor case does not instrument its internal timer. Every externally owned fixture group was verified empty after cleanup, and the allocated fixture directory was removed after evidence capture. These observations show outliving the five-second probe timeout and event-loop blocking; they do not claim an indefinitely observed hang, spontaneous JVM failure, or escaped descendants.
Context7 and DeepWiki corroborated the API distinction; the version-specific source was checked against Node24.18.0 child_process documentation: asynchronous spawning enables event-loop progress, while a sent signal alone does not prove exit or descendant cleanup.
The fix remains in progress. The complete migration must cover GhidraInstallationHost/inspection, GhidraProvider's cached readiness and synchronous client creation, registry candidate snapshots/selection, target-free session status, and doctor's currently file-only resource scope. Source review also identified the need to preserve exact interruption provenance and completed output interpretation through final process cleanup. These are integration requirements, not yet separately reproduced defect claims. A synchronous wrapper or kill-signal-only change would leave the ownership and cancellation contract incomplete.
No production code changed in this investigation; no native Ghidra/JVM, Windows/Linux lifecycle, MCP responsiveness, or descendant escape behavior was verified. Heavy Qodo/profiler jobs were not restarted.
@morluto commented on GitHub (Oct 17, 2026):
Prerequisite published in
150e996a86f2bec4982ba87f37bf502a8d5e8214: the shared readiness/status path now awaits owned observations.unknownwhile finalization is in progress.Validation executed: 255 focused tests across 18 files, including registered MCP delayed readiness, status during shutdown, typed cancellation, physical failure during shutdown, denied cleanup/retry, provider switching and SDK-converted schema validity. Another 21 registry tests passed after strengthening the primary-restoration assertion.
check:fast,docs:checkand 5 README conformance controls passed. Controlled providers/process fixtures establish this scope; no native Ghidra/JVM claim is made.Bounded completed production session-status tasks against
408704827, two alternating warm repeats plus separate first processes: ordinary status elapsed 0.18080/0.18258 s, CPU 0.28390/0.28324 s, sampled peak family RSS 199.87/199.84 MB, raw cl100k_base reply tokens 115/115. Status during held provider finalization: elapsed 0.18432/0.17863 s, CPU 0.27746/0.28922 s, RSS 199.76/199.25 MB, tokens 115/134 (the candidate honestly reports unknown readiness). No subprocesses launched in these measurements. True cold caches, whole-agent and CLI/MCP transport costs remain unmeasured; no performance improvement claimed.Compatibility: the commit is marked breaking because candidate availability can now be
unknown; consumers that assume only available/unavailable must handle it.#4561 remains unfinished. The actual synchronous Java producer, installation inspection, Ghidra readiness sharing/cache, synchronous client creation and doctor process cleanup ownership still require migration. Heavy Qodo/profiler workloads stayed stopped.
@morluto commented on GitHub (Oct 17, 2026):
Java subprocess boundary fixed on main in
cc2e18a265, following shared ownership commitse567033a7andfb146bf40.The Java probe now uses bounded asynchronous owned commands, observes complete output before final cleanup, retains physical failures across late cancellation, and preserves exact preparation/process cleanup capabilities. Registry readiness/profile work shares observations only within one active task; later tasks and client admission are fresh. Client factories expose a closeable deferred owner immediately, and doctor joins cancellation and cleanup.
Executed 405 focused tests across 24 files (2 explicit skips), 109 provider/doctor controls rerun after final admission refinement, check:fast, docs:check (5 conformance controls), normal commit/pre-push hooks. Real idle Node fixtures acting as selected Java commands cover active cancellation, SIGTERM resistance with a responsive timer, completed valid/invalid reports followed by cancellation, refused cleanup and exact retry, preparation cleanup without adopting caller-owned error resources, and zero root exit with a detached descendant holding output open. Public compiled doctor --provider ghidra --json returned its own 5-second deadline error in about 5.6s, before the independent 15-second watchdog; its observed process group was empty. Earlier reproduction here needed external cleanup after 7s and direct synchronous probing blocked its timer.
Completed-task comparison against
e567033a7, same controlled successful Java-shaped executable and equivalent provider facts; two alternating warm filesystem repeats plus separate first processes:Ownership adds measurable preparation/verification cost; no speed or memory improvement claimed. CPU is wait4 root plus reaped children; RSS is a sampled PPID-family sum and may miss transient peaks. Tokens use cl100k_base on complete raw replies. True cold caches, full agent, MCP/catalog/retry and real-engine costs remain unmeasured.
Scope: macOS/Node 24.18.0 controlled process and file fixtures, plus public CLI/MCP lifecycle regressions. These are not real JVM/Ghidra behavior or Windows/Linux lifecycle verification. Separate source finding #4672 tracks the remaining synchronous unbounded installation properties read before Java starts; that file-port migration remains audit work. Full codebase audit remains active. Heavy Qodo/profiler workloads stayed stopped.