Mmaping two consecutive pages

I am writing unit test for my UTF8 processing library, and I want my test to be segfault if the function goes into a buffer overflow. So I came up with the idea of ​​combining two pages next to each other in memory, the first with PROT_READ | PROT_WRITE, and the second with PROT_NONE. Thus, if an overflow occurs, segfault is guaranteed. Here is an example:


void *addr1, *addr2; /* these are the pages; mmap call left out for simplicity */
char *p = (char *) (addr1 + getpagesize() - 8);

utf8_encode(aUtf8String, p, 8); // this shouldn't segfault

The problem is that when I overlay the second page, my segfaults program. Here is an example program that reproduces the problem (GNU / Linux):


#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/mman.h>

void checkMap(void *p) 
{ 
    if(p == MAP_FAILED) {
        printf("error running mmap: %s\n", strerror(errno));
        exit(1);
    }   
}

int main(void)
{
    void *addr1, *addr2;
    size_t pagesize;

    pagesize = getpagesize();
    checkMap(addr1 = mmap(NULL, pagesize, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0));
    checkMap(addr2 = mmap(addr1 + pagesize, pagesize, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0));  /* segfaults */
    munmap(addr1, pagesize);
    munmap(addr2, pagesize);

    return 0;
}

, printf() mmap() . - , mmap segfaulting? mmap(), - , ?

+3
2

mprotect(), , mmap(). , mmap() , , -, .

(Linux mprotect() , POSIX , mmap().)

Electric Fence .

+3

( - ), , ​​ , ( , , seg - - ).

, , , , , , ?

, , , valgrind , , .

0

Source: https://habr.com/ru/post/1703966/


All Articles