fix(native): reject trailing text in lipo integers and keep multi-word otool keys (#531)

This commit is contained in:
morluto 2026-10-05 15:23:02 +08:00 committed by GitHub
parent c30878f616
commit 9e30d93af3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 26 additions and 2 deletions

View File

@ -58,7 +58,7 @@ export const parseLipoArchitectures = (output: string): LipoArchitecture[] => {
};
const integer = (value: string | undefined): number | null => {
if (value === undefined) return null;
if (value === undefined || !/^\d+$/u.test(value)) return null;
const parsed = Number.parseInt(value, 10);
return Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : null;
};

View File

@ -167,7 +167,7 @@ const parseFields = (block: string): Record<string, string | number | null> => {
const fields: Record<string, string | number | null> = {};
for (const rawLine of block.split(/\r?\n/u).slice(1)) {
const line = rawLine.trim();
const match = /^(\S+(?:\s+version)?)\s+(.+)$/u.exec(line);
const match = /^(\S+(?:\s+(?:version|stamp))?)\s+(.+)$/u.exec(line);
if (match?.[1] === undefined || match[2] === undefined) continue;
const value = match[2].trim();
fields[match[1]] = numeric(value) ?? value;

View File

@ -42,3 +42,13 @@ it("does not reinterpret segment and section flags as Mach header flags", async
true,
);
});
it("keeps multi-word field names such as time stamp intact", async () => {
const load = parseOtoolLoadCommands(await nativeFixture("otool-load.txt"));
const stamped = load.commands.filter(
(command) => "time stamp" in command.fields,
);
expect(stamped.length).toBeGreaterThan(0);
expect(load.commands.some((command) => "time" in command.fields)).toBe(false);
expect(stamped[0]?.fields["time stamp"]).toMatch(/^2 Thu Jan/);
});

View File

@ -305,6 +305,20 @@ describe("native macOS provider failures and parsing", () => {
],
);
});
it("rejects trailing text in lipo numeric fields instead of truncating", () => {
const output = [
"architecture arm64",
" cputype CPU_TYPE_ARM64",
" cpusubtype CPU_SUBTYPE_ARM64_ALL",
" offset 16384 trailing-junk",
" size 0x10",
" align 2^14 (16384)",
].join("\n");
expect(parseLipoArchitectures(output)).toMatchObject([
{ name: "arm64", file_offset: null, size: null, alignment: 16384 },
]);
});
});
class FailingRunner implements NativeCommandRunner {