On 15 Jun 2010, at 01:02, Riccardo Mottola wrote:

> mprotect() wants a page-aligned address on Solaris.
> - valloc instead of malloc, valloc just one page
> - mprotect exactly that page, not size
> - before freeing, make the page writable again.

I went through this code with Riccardo last night.  On other platforms, it's 
likely that this was the cause of some subtle bugs.  

Due to limitations of the hardware, mprotect() only works at the page 
granularity.  Solaris, helpfully, tells you that you're doing something wrong 
if you try to protect memory allocations smaller than a page.  Other operating 
systems don't; the mprotect() call will silently protect the entire page.

Other bits of this page may have been allocated to other variables with malloc, 
or they may subsequently be allocated (because malloc on most platforms expects 
to be able to write to memory that it has requested from the kernel but not 
given to the user, marking a page read-only when not all of it is allocated may 
cause malloc() to crash for no apparent reason).

I think that we use mmap() to get exactly one page on other platforms.  This 
fix now gets exactly one page on platforms where mmap() is not available.

David

-- Sent from my Apple II
_______________________________________________
Gnustep-dev mailing list
Gnustep-dev@gnu.org
http://lists.gnu.org/mailman/listinfo/gnustep-dev

Reply via email to