fix(native): decode Mach protection bits in their proper positions (#586)

Signed-off-by: Rudy Celekli <47457359+rudycelekli@users.noreply.github.com>
This commit is contained in:
Rudy Mizrahi Celekli 2026-10-05 12:14:37 -04:00 committed by GitHub
parent ea9c3dab6b
commit 6aba6ae231
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 26 additions and 2 deletions

View File

@ -253,9 +253,9 @@ const permissions = (raw: string | null) => {
const numericValue = numeric(raw);
if (numericValue !== null)
return {
read: (numericValue & 4) !== 0,
read: (numericValue & 1) !== 0,
write: (numericValue & 2) !== 0,
execute: (numericValue & 1) !== 0,
execute: (numericValue & 4) !== 0,
raw,
};
if (/^[r-][w-][x-]$/u.test(raw))

View File

@ -0,0 +1,24 @@
import { expect, it } from "vitest";
import { parseOtoolLoadCommands } from "../../../../src/native/parsers/otool.js";
it.each([0, 1, 2, 3, 4, 5, 6, 7])(
"decodes Mach VM protection bits for mask %i",
(mask) => {
const parsed = parseOtoolLoadCommands(`Load command 0
cmd LC_SEGMENT_64
segname __DATA
maxprot 0x${mask.toString(16)}
initprot ${mask}
`);
for (const permissions of [
parsed.segments[0]?.maximum_permissions,
parsed.segments[0]?.initial_permissions,
]) {
expect(permissions).toMatchObject({
read: (mask & 1) !== 0,
write: (mask & 2) !== 0,
execute: (mask & 4) !== 0,
});
}
},
);