Would be neat if randomized brk and setrlimit(RLIMIT_DATA, ...)
worked in a predictable way:

$ gcc brk.c -fPIC -pie -m64;./a.out;./a.out;./a.out
sbrk=0x7f721b815000 main=0x7f721af04860
sbrk succeeded (brk=0x7f721b909240)
sbrk=0x7fc3d77e2000 main=0x7fc3d66fa860
sbrk failed: Cannot allocate memory (brk=0x7fc3d77e2000)
sbrk=0x7f05b0615000 main=0x7f05af76b860
sbrk failed: Cannot allocate memory (brk=0x7f05b0615000)

-- 
Do what you love because life is too short for anything else.

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <errno.h>
#include <string.h>

int main(void)
{
        void *p;
        const struct rlimit rlim_data = {
                .rlim_cur = 10 << 20,
                .rlim_max = RLIM_INFINITY
        };
        int saved_errno;

        p = sbrk(0);
        fprintf(stderr, "sbrk=%p main=%p\n", p, &main);
        if (setrlimit(RLIMIT_DATA, &rlim_data) == -1) {
                fprintf(stderr, "setrlimit failed: %s\n", strerror(errno));
                return 1;
        }
        if (sbrk(1 << 20) == (void*)-1) {
                saved_errno = errno;
                fprintf(stderr, "sbrk failed: %s (brk=%p)\n",
                        strerror(saved_errno), sbrk(0));
                return 1;
        } else {
                fprintf(stderr, "sbrk succeeded (brk=%p)\n", sbrk(0));
                return 0;
        }
}

Reply via email to