Skip to content
MachoOpenFromMemoryCopy

MachoOpenFromMemoryCopy

Description

Parse a Mach-O image from an in-memory byte range – R-value / copy form (mirrors VecInsertR).

Parser allocates its own buffer through alloc and MemCopys the caller’s bytes in. Caller’s pointer is never retained; their buffer remains theirs.

Success

Returns true; out owns an independent copy of data.

Failure

Returns false; out zeroed; caller’s data untouched.

Usage example (Cross-references)

Usage examples (Cross-references)
    bool macho_open_from_memory_copy(Macho *out, const u8 *data, size data_size, Allocator *alloc) {
        if (!out || !data || !alloc) {
            LOG_FATAL("MachoOpenFromMemoryCopy: NULL argument (contract violation)");
        }
        Buf copy = BufInit(alloc);
        Buf copy = BufInit(alloc);
        if (!VecReserve(&copy, (u64)data_size)) {
            LOG_ERROR("MachoOpenFromMemoryCopy: allocation failed ({} bytes)", (u64)data_size);
            return false;
        }
    // MachoDeinit on success.
    static bool open_blob(Macho *out, const u8 *bytes, u32 len, DefaultAllocator *alloc) {
        return MachoOpenFromMemoryCopy(out, bytes, len, ALLOCATOR_OF(alloc));
    }
    
        Macho m;
        bool  ok = MachoOpenFromMemoryCopy(&m, blob, sizeof(blob), base);
        if (!ok) {
            DefaultAllocatorDeinit(&alloc);
    
        Macho m;
        if (!MachoOpenFromMemoryCopy(&m, blob, sizeof(blob), base)) {
            DefaultAllocatorDeinit(&alloc);
            return false;
    
        Macho m;
        bool  ok = !MachoOpenFromMemoryCopy(&m, fat, sizeof(fat), base);
    
        DefaultAllocatorDeinit(&alloc);
    
        Macho m;
        if (!MachoOpenFromMemoryCopy(&m, blob, sizeof(blob), base)) {
            DefaultAllocatorDeinit(&alloc);
            return false;
        DefaultAllocator alloc = DefaultAllocatorInit();
        Macho            m;
        bool             opened = MachoOpenFromMemoryCopy(&m, bytes, len, ALLOCATOR_OF(&alloc));
        if (opened)
            MachoDeinit(&m);
    
        Macho m;
        if (!MachoOpenFromMemoryCopy(&m, two_blob, sizeof(two_blob), base)) {
            DefaultAllocatorDeinit(&alloc);
            return false;
    
        Macho m;
        bool  ok = MachoOpenFromMemoryCopy(&m, buf, sizeof(buf), base);
        ok       = ok && VecLen(&m.segments) == 0 && VecLen(&m.sections) == 0;
        ok       = ok && m.cputype == 0x01000007u && m.filetype == MACHO_FILE_TYPE_EXECUTE;
    
        Macho m;
        bool  ok = MachoOpenFromMemoryCopy(&m, buf, sizeof(buf), base);
        ok       = ok && VecLen(&m.segments) == 1 && VecLen(&m.sections) == 0;
        ok       = ok && ZstrCompare(VecPtrAt(&m.segments, 0)->name, "__TEXT") == 0;
    
        Macho m;
        bool  ok = MachoOpenFromMemoryCopy(&m, buf, sizeof(buf), base);
        ok       = ok && VecLen(&m.segments) == 1;
        ok       = ok && ZstrCompare(VecPtrAt(&m.segments, 0)->name, "ABCDEFGHIJKLMNOP") == 0;
    
        Macho m;
        bool  ok = MachoOpenFromMemoryCopy(&m, buf, len, base);
        ok       = ok && VecLen(&m.segments) == 1 && VecLen(&m.sections) == 2;
        ok       = ok && VecPtrAt(&m.sections, 0)->addr == 0x100000000ull;
    
        Macho m;
        bool  ok = MachoOpenFromMemoryCopy(&m, buf, sizeof(buf), base);
        ok       = ok && VecLen(&m.sections) == 1;
        ok       = ok && ZstrCompare(VecPtrAt(&m.sections, 0)->section, "abcdefghijklmnop") == 0;
    
        Macho m;
        bool  ok = MachoOpenFromMemoryCopy(&m, buf, sizeof(buf), base);
        ok       = ok && VecLen(&m.segments) == 1;
        if (ok)
    
        Macho m;
        bool  ok = MachoOpenFromMemoryCopy(&m, buf, sizeof(buf), base);
        ok       = ok && VecLen(&m.segments) == 0 && VecLen(&m.sections) == 0;
        if (ok)
    
        Macho m;
        if (!MachoOpenFromMemoryCopy(&m, g_symblob, len, base)) {
            DefaultAllocatorDeinit(&alloc);
            return false;
    
        Macho m;
        if (!MachoOpenFromMemoryCopy(&m, g_symblob, len, base)) {
            DefaultAllocatorDeinit(&alloc);
            return false;
    
        Macho m;
        bool  opened = MachoOpenFromMemoryCopy(&m, buf, sizeof(buf), base);
        if (opened)
            MachoDeinit(&m);
    
        Macho m;
        bool  ok = MachoOpenFromMemoryCopy(&m, b, BUF, base);
        // Canonical-true check: real code stores exactly `true` (== 1); the
        // mutant stores 42, so `== true` is false under the mutation.
Last updated on