[Pixman] [PATCH 1/5] Add fence_malloc() and fence_free().
Siarhei Siamashka
siarhei.siamashka at gmail.com
Mon Sep 20 05:29:26 PDT 2010
On Tuesday 14 September 2010 16:18:18 Søren Sandmann wrote:
> From: Søren Sandmann Pedersen <ssp at redhat.com>
>
> These variants of malloc() and free() try to surround the allocated
> memory with protected pages so that out-of-bounds accessess will cause
> a segmentation fault.
>
> If mprotect() and getpagesize() are not available, these functions are
> simply equivalent to malloc() and free().
[...]
> +void *
> +fence_malloc (uint32_t len)
> +{
> + unsigned long page_size = getpagesize();
> + unsigned long page_mask = page_size - 1;
> + uint32_t n_payload_bytes = (len + page_mask) & ~page_mask;
> + uint32_t n_bytes =
> + (len +
> + page_size * (N_LEADING_PROTECTED + N_TRAILING_PROTECTED + 2) +
> + n_payload_bytes) & ~page_mask;
> + uint8_t *initial_page;
> + uint8_t *leading_protected;
> + uint8_t *trailing_protected;
> + uint8_t *payload;
> + uint8_t *addr;
> +
> + addr = malloc (n_bytes);
> +
> + if (!addr)
> + {
> + printf ("malloc failed on %u %u\n", len, n_bytes);
> + return NULL;
> + }
> +
> + initial_page = (uint8_t *)(((unsigned long)addr + page_mask) &
> ~page_mask); + leading_protected = initial_page + page_size;
> + payload = leading_protected + N_LEADING_PROTECTED * page_size;
> + trailing_protected = payload + n_payload_bytes;
> +
> + ((info_t *)initial_page)->addr = addr;
> + ((info_t *)initial_page)->len = len;
> + ((info_t *)initial_page)->trailing = trailing_protected;
> +
> + if (mprotect (leading_protected, N_LEADING_PROTECTED * page_size,
> + PROT_NONE) == -1)
There is the following warning in mprotect man page: "SVr4, POSIX.1-2001.
POSIX says that the behavior of mprotect() is unspecified if it is applied to a
region of memory that was not obtained via mmap(2)."
Also I wonder if it makes sense to be able to configure whether to align
allocated memory blocks at the lower or upper page boundary?
--
Best regards,
Siarhei Siamashka
More information about the Pixman
mailing list