This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFC] malloc: add random offset to mmapped memory


2015-03-02 18:40 GMT+01:00 Rich Felker <dalias@libc.org>:
> On Sat, Jan 24, 2015 at 10:01:31PM +0100, Maarten Bosmans wrote:
>> My proposal is to use the extra (unused) space that we get from mmap
>> anyway (because it is page-aligned) to add an offset to the returned
>> pointer. This would improve the performance of this example test case
>> when the arrays are large enough to be mmapped directly.
>>
>> I would like to get some feedback whether glibc developers think this
>> is a worthwhile goal to pursue, before I start working on a patch.
>
> I think you should be cautious not to introduce random perturbations
> like this into programs where ASLR has been intentionally disabled. It
> makes debugging certain types of issues extremely difficult.

What kind of problems do you see?

In my experience the pointer values that are returned from malloc are
quite arbitrary already. Is this different with ASLR disabled?

I would not propose to get a 'real' random number (e.g. from rand() or
/dev/urandom), but rather just something that is different from one
malloc call to the next.
For example something like
void *malloc(size_t size) {
    // ...
    char *p; // let's say this pointer is set in the code above to the
beginning of a mmapped segment
    ptrdiff_t max_offset = ..;  // This is the unused space, the
difference between requested size and the size of the mmapped segment
    ptrdiff_t offset = (p ^ p>>32) % max_offset
    return p + offset;
}
This basically makes sure if the original pointer was deterministic
but page-aligned, the new code would return a pointer offset by some
(non-fixed, but deterministic) offset.

Maarten


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]