


























@@ -175,16 +175,18 @@ describe("kitchen-sink RPC isolated state", () => {
175175});
176176177177it("clamps timer env values before they reach Node timers", () => {
178-expect(readPositiveTimerMs(String(MAX_KITCHEN_SINK_TIMER_TIMEOUT_MS + 1), 60_000)).toBe(
178+const oversizedTimerMs = String(Number.MAX_SAFE_INTEGER);
179+180+expect(readPositiveTimerMs(oversizedTimerMs, 60_000)).toBe(
179181MAX_KITCHEN_SINK_TIMER_TIMEOUT_MS,
180182);
181183182184const config = resolveKitchenSinkRpcConfig({
183-OPENCLAW_KITCHEN_SINK_RPC_CALL_MS: String(MAX_KITCHEN_SINK_TIMER_TIMEOUT_MS + 1),
184-OPENCLAW_KITCHEN_SINK_RPC_COMMAND_MS: String(MAX_KITCHEN_SINK_TIMER_TIMEOUT_MS + 1),
185-OPENCLAW_KITCHEN_SINK_RPC_FETCH_MS: String(MAX_KITCHEN_SINK_TIMER_TIMEOUT_MS + 1),
186-OPENCLAW_KITCHEN_SINK_RPC_INSTALL_MS: String(MAX_KITCHEN_SINK_TIMER_TIMEOUT_MS + 1),
187-OPENCLAW_KITCHEN_SINK_RPC_READY_MS: String(MAX_KITCHEN_SINK_TIMER_TIMEOUT_MS + 1),
185+OPENCLAW_KITCHEN_SINK_RPC_CALL_MS: oversizedTimerMs,
186+OPENCLAW_KITCHEN_SINK_RPC_COMMAND_MS: oversizedTimerMs,
187+OPENCLAW_KITCHEN_SINK_RPC_FETCH_MS: oversizedTimerMs,
188+OPENCLAW_KITCHEN_SINK_RPC_INSTALL_MS: oversizedTimerMs,
189+OPENCLAW_KITCHEN_SINK_RPC_READY_MS: oversizedTimerMs,
188190});
189191190192expect(config.rpcTimeoutMs).toBe(MAX_KITCHEN_SINK_TIMER_TIMEOUT_MS);
@@ -712,6 +714,26 @@ describe("kitchen-sink RPC command output capture", () => {
712714expect(result.stderrTruncatedChars).toBe(3);
713715});
714716717+it("clamps oversized command timeout env values before scheduling timers", async () => {
718+const previousTimeout = process.env.OPENCLAW_KITCHEN_SINK_RPC_COMMAND_MS;
719+process.env.OPENCLAW_KITCHEN_SINK_RPC_COMMAND_MS = String(Number.MAX_SAFE_INTEGER);
720+try {
721+await expect(
722+runCommand(process.execPath, [
723+"--input-type=module",
724+"--eval",
725+"setTimeout(() => process.exit(0), 25);",
726+]),
727+).resolves.toMatchObject({ stdout: "", stderr: "" });
728+} finally {
729+if (previousTimeout === undefined) {
730+delete process.env.OPENCLAW_KITCHEN_SINK_RPC_COMMAND_MS;
731+} else {
732+process.env.OPENCLAW_KITCHEN_SINK_RPC_COMMAND_MS = previousTimeout;
733+}
734+}
735+});
736+715737posixIt("kills timed command process groups", async () => {
716738const root = mkdtempSync(path.join(tmpdir(), "openclaw-kitchen-rpc-timeout-"));
717739const scriptPath = path.join(root, "trap-term.mjs");
@@ -2241,6 +2263,22 @@ describe("kitchen-sink RPC process sampling", () => {
22412263});
22422264});
224322652266+it("clamps oversized HTTP probe timeouts before scheduling timers", async () => {
2267+const fetchImpl = vi.fn(async () => {
2268+await delay(25);
2269+return new Response('{"status":"live"}', { status: 200 });
2270+});
2271+2272+await expect(
2273+fetchJson("http://127.0.0.1:19680/healthz", {
2274+attempts: 1,
2275+ fetchImpl,
2276+timeoutMs: Number.MAX_SAFE_INTEGER,
2277+}),
2278+).resolves.toEqual({ ok: true, status: 200, body: { status: "live" } });
2279+expect(fetchImpl).toHaveBeenCalledOnce();
2280+});
2281+22442282it("rejects oversized HTTP probe responses before reading declared large bodies", async () => {
22452283let canceled = false;
22462284const response = new Response(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。