fix(android): validate engine archive prerequisites (#1145)

* fix(android): validate engine archive prerequisites

* fix(android): bound engine metadata reads before allocation
This commit is contained in:
Ysopwnable authored and GitHub committed 2026-10-09 09:15:33 +08:00
1 parent 13935077ba
commit e9ebfb94ef
9 files changed
+180 -17

No files matched your search

+26 -3
View File
@@ -1,5 +1,12 @@
import assert from "node:assert/strict";
import { access, mkdtemp, mkdir, rm, symlink } from "node:fs/promises";
import {
access,
mkdtemp,
mkdir,
rm,
symlink,
writeFile,
} from "node:fs/promises";
import { tmpdir } from "node:os";
import { delimiter, dirname, isAbsolute, join } from "node:path";
import { Client } from "@modelcontextprotocol/client";
@@ -67,6 +74,8 @@ export async function verifyAndroidFailureRecovery({
}
const withoutJavaHome = { ...environment };
delete withoutJavaHome.JAVA_HOME;
const invalidJar = join(root, "invalid.jar");
await writeFile(invalidJar, "not a Java archive");
const environments = [
{
label: "JRE without compiler",
@@ -78,6 +87,12 @@ export async function verifyAndroidFailureRecovery({
env: { ...withoutJavaHome, PATH: empty },
observation: "ENOENT",
},
{
label: "invalid engine archive with a working JDK",
env: { ...environment, REA_JADX_MCP_JAR: invalidJar },
observation: "Cannot inspect REA_JADX_MCP_JAR",
jarFailure: true,
},
];
if (process.platform === "darwin") {
// /usr/bin/java either resolves an installed runtime or reports the actual stub failure.
@@ -114,8 +129,16 @@ export async function verifyAndroidFailureRecovery({
JSON.stringify(failure).includes(scenario.observation),
JSON.stringify(failure),
);
assert.match(failure.message, /full JDK/u);
assert.match(failure.remediation.action, /java --list-modules/u);
assert.match(
failure.message,
scenario.jarFailure ? /REA_JADX_MCP_JAR/u : /full JDK/u,
);
assert.match(
failure.remediation.action,
scenario.jarFailure ? /jadx-headless-mcp/u : /java --list-modules/u,
);
if (scenario.jarFailure)
assert.doesNotMatch(failure.message, /Select a full JDK/u);
assert.doesNotMatch(JSON.stringify(failure), /rea doctor/u);
await verifyAndroidReadiness({
entrypoint,