mirror of
https://github.com/morluto/rea.git
synced 2026-11-03 13:26:10 +00:00
* fix: select caller paths through symlinks and .. as the filesystem does CLI adapters, binary target resolution, the reverse-engineering service and the objdump and Rizin command builders made caller-selected paths absolute with path.resolve, which collapses `link/..` lexically. On POSIX the filesystem follows `link` first, so these commands inspected, hashed or launched a different file and returned internally consistent Evidence for it. absoluteCallerPath now owns that step: on POSIX it prefixes a relative path with the working directory and keeps an absolute path as spelled; on Windows, where `..` resolves lexically, it keeps win32.resolve. Fixes #3864 Fixes #3911 Fixes #3912 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: keep firmware, WASM list and output-root paths on the selected file Review follow-up. The CLI already passed firmware and WASM paths through absoluteCallerPath, but snapshotFirmware and SafeOutputTree.create re-resolved them lexically, and the WASM glue and candidate lists still used resolve, so those inputs could still select a sibling file or create output beside the intended directory. absoluteCallerPath now also drops `.` segments and repeated or trailing separators on POSIX, which never change the named file, so selected paths such as `./module.wasm` keep matching their glue references exactly. Every `..` is still left for the filesystem. SafeOutputTree keeps host path syntax; its platform argument selects only the Windows name policy. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: keep directory requirements and relative cwd in caller paths Review follow-up. absoluteCallerPath stripped a trailing `/` or `/.`, so `file/` selected the regular file instead of failing with ENOTDIR; it now keeps one trailing separator. A relative cwd option was appended to the root; it is now made absolute without collapsing `..`. WASM glue matching resolved local literals lexically, so a module selected through `link/..` matched only by basename; the adapter now compares both sides through absoluteCallerPath and still reports each candidate as given. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
42 lines
1.7 KiB
TypeScript
42 lines
1.7 KiB
TypeScript
import { expect, it } from "vitest";
|
|
|
|
import { absoluteCallerPath } from "../../../src/filesystem/callerPath.js";
|
|
|
|
it("keeps POSIX parent components for the filesystem to resolve", () => {
|
|
const posix = { cwd: "/work", platform: "linux" } as const;
|
|
expect(absoluteCallerPath("link/../sample", posix)).toBe(
|
|
"/work/link/../sample",
|
|
);
|
|
expect(absoluteCallerPath("/abs/link/../sample", posix)).toBe(
|
|
"/abs/link/../sample",
|
|
);
|
|
expect(absoluteCallerPath("../sample", posix)).toBe("/work/../sample");
|
|
});
|
|
|
|
it("removes only POSIX spellings that cannot change the named file", () => {
|
|
const posix = { cwd: "/work/", platform: "darwin" } as const;
|
|
expect(absoluteCallerPath("./module.wasm", posix)).toBe("/work/module.wasm");
|
|
expect(absoluteCallerPath("a//./b", posix)).toBe("/work/a/b");
|
|
expect(absoluteCallerPath("/x/./y", posix)).toBe("/x/y");
|
|
expect(absoluteCallerPath("sample", { ...posix, cwd: "/" })).toBe("/sample");
|
|
expect(absoluteCallerPath("/", posix)).toBe("/");
|
|
// A trailing separator or `.` still requires a directory.
|
|
expect(absoluteCallerPath("sample/", posix)).toBe("/work/sample/");
|
|
expect(absoluteCallerPath("sample/.", posix)).toBe("/work/sample/");
|
|
expect(absoluteCallerPath("a//b//", posix)).toBe("/work/a/b/");
|
|
});
|
|
|
|
it("makes a relative POSIX cwd absolute before appending the path", () => {
|
|
expect(
|
|
absoluteCallerPath("sample", { cwd: "fixtures/../x", platform: "linux" }),
|
|
).toBe(`${process.cwd()}/fixtures/../x/sample`);
|
|
});
|
|
|
|
it("uses lexical resolution on Windows, where it is exact", () => {
|
|
const win32 = { cwd: "C:\\work", platform: "win32" } as const;
|
|
expect(absoluteCallerPath("link\\..\\sample", win32)).toBe(
|
|
"C:\\work\\sample",
|
|
);
|
|
expect(absoluteCallerPath("D:\\x\\..\\y", win32)).toBe("D:\\y");
|
|
});
|