
























@@ -394,6 +394,82 @@ describe("resolvePreferredOpenClawTmpDir", () => {
394394expect(warn).toHaveBeenCalledWith(expect.stringContaining("tightened permissions on temp dir"));
395395});
396396397+it("uses /tmp/openclaw when another process tightened permissions before repair", () => {
398+const chmodSync = vi.fn();
399+const warn = vi.fn();
400+const tmpdir = vi.fn(() => "/var/fallback");
401+const states = [0o40777, 0o40700, 0o40700];
402+const lstatSync = vi.fn<NonNullable<TmpDirOptions["lstatSync"]>>((target: string) => {
403+if (target === POSIX_OPENCLAW_TMP_DIR) {
404+return makeDirStat({ mode: states.shift() ?? 0o40700 });
405+}
406+return secureDirStat();
407+});
408+409+const resolved = resolvePreferredOpenClawTmpDir({
410+accessSync: vi.fn(),
411+ lstatSync,
412+ chmodSync,
413+mkdirSync: vi.fn(),
414+getuid: vi.fn(() => 501),
415+ tmpdir,
416+ warn,
417+});
418+419+expect(resolved).toBe(POSIX_OPENCLAW_TMP_DIR);
420+expect(chmodSync).not.toHaveBeenCalled();
421+expect(warn).not.toHaveBeenCalled();
422+expect(tmpdir).not.toHaveBeenCalled();
423+});
424+425+it("uses fallback when another process tightened fallback permissions before repair", () => {
426+const fallbackPath = fallbackTmp();
427+const chmodSync = vi.fn();
428+const warn = vi.fn();
429+const states = [0o40777, 0o40700, 0o40700];
430+431+const resolved = resolveWithReadOnlyTmpFallback({
432+ fallbackPath,
433+fallbackLstatSync: vi.fn(() => makeDirStat({ mode: states.shift() ?? 0o40700 })),
434+ chmodSync,
435+ warn,
436+});
437+438+expect(resolved).toBe(fallbackPath);
439+expect(chmodSync).not.toHaveBeenCalled();
440+expect(warn).not.toHaveBeenCalled();
441+});
442+443+it("uses /tmp/openclaw when chmod loses a concurrent repair race", () => {
444+const chmodSync = vi.fn((target: string, mode: number) => {
445+if (target === POSIX_OPENCLAW_TMP_DIR && mode === 0o700) {
446+throw nodeErrorWithCode("EPERM");
447+}
448+});
449+const warn = vi.fn();
450+const states = [0o40777, 0o40777, 0o40700];
451+const lstatSync = vi.fn<NonNullable<TmpDirOptions["lstatSync"]>>((target: string) => {
452+if (target === POSIX_OPENCLAW_TMP_DIR) {
453+return makeDirStat({ mode: states.shift() ?? 0o40700 });
454+}
455+return secureDirStat();
456+});
457+458+const resolved = resolvePreferredOpenClawTmpDir({
459+accessSync: vi.fn(),
460+ lstatSync,
461+ chmodSync,
462+mkdirSync: vi.fn(),
463+getuid: vi.fn(() => 501),
464+tmpdir: vi.fn(() => "/var/fallback"),
465+ warn,
466+});
467+468+expect(resolved).toBe(POSIX_OPENCLAW_TMP_DIR);
469+expect(chmodSync).toHaveBeenCalledWith(POSIX_OPENCLAW_TMP_DIR, 0o700);
470+expect(warn).not.toHaveBeenCalled();
471+});
472+397473it("throws when the fallback directory cannot be created", () => {
398474expect(() =>
399475resolvePreferredOpenClawTmpDir({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。