码迷,mamicode.com
首页 > 其他好文 > 详细

malloc_readonly

时间:2015-03-19 16:43:47      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:

malloc_readonly.h

#ifndef _MALLOC_READONLY_H_
#define _MALLOC_READONLY_H_

const void * malloc_readonly(const void * copy_from, unsigned size);

#endif

malloc_readonly.c

#include "malloc_readonly.h"
#include <unistd.h>
#include <malloc.h>
#include <string.h>
#include <sys/mman.h>

const void * malloc_readonly(const void * copy_from, unsigned size)
{
    if(size == 0) {
        return NULL;
    }

    int page_size = sysconf(_SC_PAGE_SIZE);
    if(page_size == -1) {
        return NULL;
    }

    unsigned new_size = (size + (page_size - 1)) / page_size * page_size;

    void * buf = memalign(page_size, new_size);
    if(buf == NULL) {
        return NULL;
    }

    (void)memcpy(buf, copy_from, size);

    (void)mprotect(buf, new_size, PROT_READ);

    return buf;
}

demo.c

#include "malloc_readonly.h"
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

static void catch_sig(int sig, siginfo_t * si, void * unused)
{
    printf("Got SIG%d @ %p\n", sig, si->si_addr);
    exit(1);
}

int main(void)
{
    struct sigaction sa;
    sa.sa_flags = SA_SIGINFO;
    sigemptyset(&sa.sa_mask);
    sa.sa_sigaction = catch_sig;
    sigaction(SIGSEGV, &sa, NULL);

    char * c = (char *)malloc_readonly("123456", 6);

    c[0] = 0;

    free(c);
    return 0;
}


malloc_readonly

标签:

原文地址:http://my.oschina.net/2bit/blog/389016

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!