On May 5, 2014, at 3:43 PM, David Chisnall <thera...@freebsd.org> wrote:

> On 5 May 2014, at 22:33, Warner Losh <i...@bsdimp.com> wrote:
> 
>> reallocf():
>>    The reallocf() function is identical to the realloc() function, except
>>    that it will free the passed pointer when the requested memory cannot be
>>    allocated.  This is a FreeBSD specific API designed to ease the problems
>>    with traditional coding styles for realloc() causing memory leaks in
>>    libraries.
>> ...
>>    The reallocf() function first appeared in FreeBSD 3.0.
> 
> While reallocf() is nice, it doesn't address the problem of overflow.  It 
> takes a single size, forcing the caller to do the number-of-elements * 
> element-size multiplication, which is the problematic one.  If an attacker 
> can control the number of elements, then it's possible to make the 
> multiplication overflow so reallocf() will return a valid pointer to an area 
> of memory that is much smaller than the caller was expecting.  

Stupid is as stupid does. malloc and realloc both have this same issue. While 
an interesting theoretical attack, the size doesn’t necessarily come from 
multiplication. Careful coding is still required, not matter what spin you put 
on this. reallocf() solves the memory leak issue, but not the problem with 
overflow (which the realloc() interface has too). The caller can check to make 
sure they aren’t requesting too much memory and overflowing. The interface 
isn’t designed to solve the problem you are complaining about.

There’s only so much you can do to prevent programming errors. calloc() isn’t 
going to solve the world’s problems for you, and introduces a non-trivial 
amount of overhead for the trivial amount of overhead that is “saved” by moving 
the overflow check from the caller to the callee...

Warner

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to