[PR #7070] [MERGED] fix(ghidra): accept stock language IDs with LEBE endianness or a slash #7622

Closed
opened 2026-11-03 13:39:10 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/morluto/rea/pull/7070
Author: @Adolanium
Created: 10/25/2026
Status: ✅ Merged
Merged: 10/25/2026
Merged by: @morluto

Base: main ← Head: fix/ghidra-language-id-forms


📝 Commits (1)

  • 468bc21 fix(ghidra): accept stock language IDs with LEBE endianness or a slash

📊 Changes

2 files changed (+22 additions, -1 deletions)

View changed files

📝 src/config/ghidraLanguageOverride.ts (+3 -1)
📝 src/ghidra/GhidraLanguageOverride.test.ts (+19 -0)

📄 Description

Summary

Fixes #7072.

REA_GHIDRA_LANGUAGE_ID refuses four language IDs that ship with Ghidra: ARM:LEBE:32:v8LEInstruction and ARM:LEBE:32:v7LEInstruction (ARM BE8: big-endian data, little-endian instructions) and M16C/60:LE:16:default and M16C/80:LE:16:default. The syntax check allowed only LE or BE as the endian field and no / in the processor. Both forms are now accepted.

Problem and expected behavior

ghidraLanguageIdSchema in src/config/ghidraLanguageOverride.ts used ^[A-Za-z0-9_.+-]+:(?:LE|BE):…. Ghidra's own language definitions (Ghidra/Processors/ARM/data/languages/ARM.ldefs, M16C_60.ldefs, M16C_80.ldefs) declare these IDs, and docs/ghidra-*.md present the variable as the way to select an installed Ghidra language. Configuration parsing failed with "must be a Ghidra language ID such as x86:LE:32:default" before Ghidra started, so BE8 ARM firmware and M16C ROMs could not be analyzed with an explicit language.

Expected: those IDs parse; the existing installed-catalog check (GhidraLanguageCatalog) still decides whether the language exists.

Change and scope

  • src/config/ghidraLanguageOverride.ts: the endian field also accepts LEBE; the processor field accepts / between name parts (a leading, trailing or doubled / is still refused). The comment names both forms.

Not included: the compiler-spec ID syntax is unchanged; every stock compiler-spec ID already matches it.

Follow the contribution scope.
Unresolved scope, authority, side effects, or required verification block
integration. Link the required maintainer scope decision for new providers or
capabilities involving target execution, injection, mutation, or protection
recovery; ordinary fixes within existing boundaries may state "not applicable".
Draft PRs may leave the scope decision pending and the readiness and merge checklists
unchecked. Maintainers can help resolve open questions.

Contribution scope: not applicable. This is a fix inside the existing Ghidra language override setting.

Contract and boundary impact

  • Semantic owner and earliest changed stage: ghidraLanguageIdSchema, used when REA_GHIDRA_LANGUAGE_ID is parsed.
  • Contribution scope fit and linked maintainer decision: not applicable.
  • CLI and MCP/tool-catalog contract: none; the environment setting accepts four more stock IDs.
  • Provider, bridge, target-format, or platform compatibility: Ghidra. The ID reaches analyzeHeadless as one -processor argument in an argument array; the installed .ldefs check is unchanged.
  • Evidence, artifact, provenance, or reconstruction contract: none.
  • Target selection, authority, upstream behavior, and cleanup details (if applicable): the selected language is preserved as written.
  • Generated metadata (docs/public/product-catalog.json), package, or installation impact (CI generates and validates ignored catalogs and skills/; edit authored instructions in .agents/skills/reverse-engineer-anything/ and never commit build outputs): none.

Expected effects (check known effects; use documentation-only on its own).
Unchecked items do not establish absence; leave uncertainties visible.

  • Read existing files or captured data.
  • Launch or attach to a process.
  • Inject instrumentation or run scripts/code.
  • Change process memory, registers, files, or configuration.
  • Contact network services.
  • Recover protected code or work around protections.
  • Documentation or usability only; no target interaction.
  • Not sure yet; investigation or maintainer guidance needed.

Evidence and regression coverage

  • Tests added or updated: src/ghidra/GhidraLanguageOverride.test.ts:
    • "accepts the stock Ghidra language ID %s" for the four IDs: each parses to { languageId } unchanged.
    • "still refuses the malformed language ID %j" for ARM:BELE:32:v8, /x86:LE:32:default and a trailing space.
  • Base reproduction or other evidence: with ghidraLanguageOverride.ts from upstream/main 8e6a95788 and the new tests, the four acceptance cases fail. The four IDs are the only stock <language id> values in Ghidra's .ldefs files that the old pattern rejects (a review-time check of all 194).
  • User-visible CLI/MCP output (if applicable): configuration parsing for REA_GHIDRA_LANGUAGE_ID.
  • Remaining proof gaps: no real Ghidra run with these languages.

For evidence-bearing changes:

  • Observed, derived, and inferred claims remain distinguishable.
  • Artifact identity, source provenance, and failed attempts remain preserved.
  • Unsupported, incomplete, unavailable, or uncertain outcomes remain visible.

Validation performed

On Linux (WSL Ubuntu, Node 24.22.1) at 468bc2166 (on upstream/main 8e6a95788), after npm ci and npm run build:cached:

  • npx tsc -p . --noEmit passed.
  • npx oxfmt --check on the changed files: clean. node scripts/ci/static-check-report.mjs lint: 0 errors.
  • npx vitest run src/ghidra/GhidraLanguageOverride.test.ts src/config tests/boundary/ghidra: 188 passed, in two runs.
  • The negative check above failed the four acceptance cases.

Compatibility, safety, and release

  • Breaking changes or migration steps: none; previously accepted IDs are unchanged.
  • Real Hopper/Ghidra, browser, or OS coverage: Linux unit tests only; no real Ghidra.
  • Package or release metadata impact: none.
  • Security, privacy, process, or containment review: the value is still a single argument token; no new characters other than / between name parts.

Author readiness

Human owner: @Adolanium

  • I reviewed the final diff and relevant existing code, understand the change and its edge cases, and take responsibility for the complete PR, including AI-assisted work.
  • I checked the evidence above, confirmed it supports the current change, and recorded meaningful validation gaps.
  • I declare this PR ready for initial maintainer review.

Before merge

  • This PR addresses a concrete problem or an agreed enhancement.
  • Material scope and authority questions are resolved, and any required maintainer scope decision covers the final diff.
  • The PR has one focused outcome and the title follows type(scope): outcome.
  • Related issue is linked, or the reason for not linking one is stated above.
  • Tests cover changed observable behavior and meaningful failure paths.
  • Owning docs, contracts, and generated metadata are updated where needed.
  • User-visible CLI/MCP changes include representative output.
  • I checked the final diff for secrets, unrelated cleanup, and unsupported claims.

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/morluto/rea/pull/7070 **Author:** [@Adolanium](https://github.com/Adolanium) **Created:** 10/25/2026 **Status:** ✅ Merged **Merged:** 10/25/2026 **Merged by:** [@morluto](https://github.com/morluto) **Base:** `main` ← **Head:** `fix/ghidra-language-id-forms` --- ### 📝 Commits (1) - [`468bc21`](https://github.com/morluto/rea/commit/468bc21663f23a243063f64f4e3bd127a8106f5d) fix(ghidra): accept stock language IDs with LEBE endianness or a slash ### 📊 Changes **2 files changed** (+22 additions, -1 deletions) <details> <summary>View changed files</summary> 📝 `src/config/ghidraLanguageOverride.ts` (+3 -1) 📝 `src/ghidra/GhidraLanguageOverride.test.ts` (+19 -0) </details> ### 📄 Description ## Summary Fixes #7072. `REA_GHIDRA_LANGUAGE_ID` refuses four language IDs that ship with Ghidra: `ARM:LEBE:32:v8LEInstruction` and `ARM:LEBE:32:v7LEInstruction` (ARM BE8: big-endian data, little-endian instructions) and `M16C/60:LE:16:default` and `M16C/80:LE:16:default`. The syntax check allowed only `LE` or `BE` as the endian field and no `/` in the processor. Both forms are now accepted. ## Problem and expected behavior `ghidraLanguageIdSchema` in `src/config/ghidraLanguageOverride.ts` used `^[A-Za-z0-9_.+-]+:(?:LE|BE):…`. Ghidra's own language definitions (`Ghidra/Processors/ARM/data/languages/ARM.ldefs`, `M16C_60.ldefs`, `M16C_80.ldefs`) declare these IDs, and `docs/ghidra-*.md` present the variable as the way to select an installed Ghidra language. Configuration parsing failed with "must be a Ghidra language ID such as x86:LE:32:default" before Ghidra started, so BE8 ARM firmware and M16C ROMs could not be analyzed with an explicit language. Expected: those IDs parse; the existing installed-catalog check (`GhidraLanguageCatalog`) still decides whether the language exists. ## Change and scope - `src/config/ghidraLanguageOverride.ts`: the endian field also accepts `LEBE`; the processor field accepts `/` between name parts (a leading, trailing or doubled `/` is still refused). The comment names both forms. Not included: the compiler-spec ID syntax is unchanged; every stock compiler-spec ID already matches it. Follow the [contribution scope](https://github.com/morluto/rea/blob/main/CONTRIBUTING.md#contribution-scope). Unresolved scope, authority, side effects, or required verification block integration. Link the required maintainer scope decision for new providers or capabilities involving target execution, injection, mutation, or protection recovery; ordinary fixes within existing boundaries may state "not applicable". Draft PRs may leave the scope decision pending and the readiness and merge checklists unchecked. Maintainers can help resolve open questions. Contribution scope: not applicable. This is a fix inside the existing Ghidra language override setting. ## Contract and boundary impact - Semantic owner and earliest changed stage: `ghidraLanguageIdSchema`, used when `REA_GHIDRA_LANGUAGE_ID` is parsed. - Contribution scope fit and linked maintainer decision: not applicable. - CLI and MCP/tool-catalog contract: none; the environment setting accepts four more stock IDs. - Provider, bridge, target-format, or platform compatibility: Ghidra. The ID reaches analyzeHeadless as one `-processor` argument in an argument array; the installed `.ldefs` check is unchanged. - Evidence, artifact, provenance, or reconstruction contract: none. - Target selection, authority, upstream behavior, and cleanup details (if applicable): the selected language is preserved as written. - Generated metadata (`docs/public/product-catalog.json`), package, or installation impact (CI generates and validates ignored catalogs and `skills/`; edit authored instructions in `.agents/skills/reverse-engineer-anything/` and never commit build outputs): none. Expected effects (check known effects; use documentation-only on its own). Unchecked items do not establish absence; leave uncertainties visible. - [ ] Read existing files or captured data. - [x] Launch or attach to a process. - [ ] Inject instrumentation or run scripts/code. - [ ] Change process memory, registers, files, or configuration. - [ ] Contact network services. - [ ] Recover protected code or work around protections. - [ ] Documentation or usability only; no target interaction. - [ ] Not sure yet; investigation or maintainer guidance needed. ## Evidence and regression coverage - Tests added or updated: `src/ghidra/GhidraLanguageOverride.test.ts`: - "accepts the stock Ghidra language ID %s" for the four IDs: each parses to `{ languageId }` unchanged. - "still refuses the malformed language ID %j" for `ARM:BELE:32:v8`, `/x86:LE:32:default` and a trailing space. - Base reproduction or other evidence: with `ghidraLanguageOverride.ts` from upstream/main 8e6a95788 and the new tests, the four acceptance cases fail. The four IDs are the only stock `<language id>` values in Ghidra's `.ldefs` files that the old pattern rejects (a review-time check of all 194). - User-visible CLI/MCP output (if applicable): configuration parsing for `REA_GHIDRA_LANGUAGE_ID`. - Remaining proof gaps: no real Ghidra run with these languages. For evidence-bearing changes: - [x] Observed, derived, and inferred claims remain distinguishable. - [x] Artifact identity, source provenance, and failed attempts remain preserved. - [x] Unsupported, incomplete, unavailable, or uncertain outcomes remain visible. ## Validation performed On Linux (WSL Ubuntu, Node 24.22.1) at 468bc2166 (on upstream/main 8e6a95788), after `npm ci` and `npm run build:cached`: - `npx tsc -p . --noEmit` passed. - `npx oxfmt --check` on the changed files: clean. `node scripts/ci/static-check-report.mjs lint`: 0 errors. - `npx vitest run src/ghidra/GhidraLanguageOverride.test.ts src/config tests/boundary/ghidra`: 188 passed, in two runs. - The negative check above failed the four acceptance cases. ## Compatibility, safety, and release - Breaking changes or migration steps: none; previously accepted IDs are unchanged. - Real Hopper/Ghidra, browser, or OS coverage: Linux unit tests only; no real Ghidra. - Package or release metadata impact: none. - Security, privacy, process, or containment review: the value is still a single argument token; no new characters other than `/` between name parts. ## Author readiness <!-- The human owner completes these declarations before requesting review. The PR author is the owner by default. A different owner must explicitly accept ownership on this PR. AI agents must leave these declarations to a human to dictate to them or there could be catastrophic consequences for many users of REA. Draft PRs may leave them unchecked. These declarations record initial readiness when opening the PR for review; later pushes do not require a new human sign-off. Keep the description and validation evidence current as the work changes. See CONTRIBUTING.md#pull-request-ownership-and-readiness. --> Human owner: @Adolanium - [x] I reviewed the final diff and relevant existing code, understand the change and its edge cases, and take responsibility for the complete PR, including AI-assisted work. - [x] I checked the evidence above, confirmed it supports the current change, and recorded meaningful validation gaps. - [x] I declare this PR ready for initial maintainer review. ## Before merge <!-- Draft PRs may leave pending items unchecked. Resolve material scope and authority questions before integration. --> - [ ] This PR addresses a concrete problem or an agreed enhancement. - [ ] Material scope and authority questions are resolved, and any required maintainer scope decision covers the final diff. - [ ] The PR has one focused outcome and the title follows `type(scope): outcome`. - [ ] Related issue is linked, or the reason for not linking one is stated above. - [ ] Tests cover changed observable behavior and meaningful failure paths. - [ ] Owning docs, contracts, and generated metadata are updated where needed. - [ ] User-visible CLI/MCP changes include representative output. - [ ] I checked the final diff for secrets, unrelated cleanup, and unsupported claims. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
bsakaguchi 2026-11-03 13:39:10 +00:00
Sign in to join this conversation.
No milestone
No project
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#7622
No description provided.