Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Jul 2003 16:51:16 -0700 (PDT)
From:      Don Lewis <truckman@FreeBSD.org>
To:        cswiger@mac.com
Cc:        freebsd-stable@FreeBSD.org
Subject:   Re: malloc does not return null when out of memory
Message-ID:  <200307242351.h6ONpGM7055649@gw.catspoiler.org>
In-Reply-To: <3F20692E.2060107@mac.com>

index | next in thread | previous in thread | raw e-mail

On 24 Jul, Chuck Swiger wrote:
> Muttley wrote:
>> Yes, I thought briefly about something like this.
>> 
>> Then I thought 'there's a race condition'.
> 
> Where?  The FreeBSD implementation is wrapped in a THREAD_LOCK()...?
> 
>> Then I realised that other processes might not link against this malloc.
> 
> Perhaps.
> 
>> Then I realised the race condition doesn't even matter; processes will 
>> still be killed, as the kernel doesn't care that you're still in 
>> malloc() when the overcommitted memory is touched, it just knows you've 
>> touched it and there's no actual memory there. This will result in far 
>> more processes being killed. I believe that's a bad thing.
> 
> Someone stated that it was a problem that malloc() returned pointers to virtual 
> address space that had been mapped but not allocated.  This patch does not 
> guarantee that malloc() will return, but, if malloc() does returns a pointer, 
> using the memory being pointed to will refer to memory that is allocated.
> 
> As Barny Wolff said:
>  > Won't this merely die in malloc, not return 0?
> 
> True.  This isn't a perfect solution, but given the choice between:
> 
> 1) malloc(LOTS) returning a pointer, and then sometime later the program dies 
> with a bus error when using that memory because no more VM is available, or
> 
> 2) malloc(LOTS) causing an immediate failure in malloc(),
> 
> ...choice #2 appears to be significantly better.
> 
> Figuring out what went wrong from a coredump or backtrace for #2 when the signal 
> happens in malloc() should be obvious; determining why the program crashed in 
> the middle of referencing memory in some large buffer is potentially misleading.
> 
> Programs which take care to preallocate regions of memory they need before they 
> start doing a transaction or some other operation that needs to be atomic would 
> also prefer #2; the patch I proposed could have a beneficial impact on data 
> integrity for such programs.

I believe that the problem isn't confined to dynamically allocated
memory.  I think it is also possible to run into problems when accessing
a large static array, or even when not accessing memory at all if the
kernel wants to free up some swap space and the process in question is
sufficently large.


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200307242351.h6ONpGM7055649>