cvs commit: src/lib/libc/stdlib malloc.c
jasone at FreeBSD.org
Sun Jan 15 21:04:25 PST 2006
On Jan 14, 2006, at 1:32 PM, Giorgos Keramidas wrote:
> On 2006-01-13 11:07, Jason Evans <jasone at FreeBSD.org> wrote:
>> On Jan 12, 2006, at 5:29 PM, Giorgos Keramidas wrote:
>>> Does this look like an off-by-one error to you too Jason?
>>> Apparently, the allocated size of s->data is s->size, which is 873
>>> bytes, but then Emacs tries to access s->data.
>>> Does it look like I'm right in thinking that this is a bug in Emacs?
>> This looks like a bug in emacs, as you say, but I don't know if it
>> has any particular relation to the posix_memalign() changes.
> Apparently it does seem related to posix_memalign() changes.
> When I bootstrap Emacs without posix_memalign(), by manually
> tweaking src/config.h after configure runs, and #undef
> POSIX_MEMALIGN, then it passes the bootstrap stage normally.
I looked into this some, and it appears that it is a configuration
problem in emacs. When I ran 'configure', both GNU_MALLOC and
HAVE_POSIX_MEMALIGN were defined in config.h. This appears to be a
recipe for disaster, since the allocator included with emacs does not
provide posix_memalign(). This probably means that emacs is calling
into both its own allocator and libc's, then trying to free memory
that was allocated by libc, using its own allocator.
Additionally, I see dlmalloc-specific code that tells dlmalloc not to
mmap() during allocation, since emacs's undump procedure doesn't
preserve mmap'ed regions.
It looks like emacs is by default configured to use emacs's
allocator, which is good (getting emacs to work with FreeBSD's malloc
probably isn't worth the trouble). However, the emacs code makes the
mistake of deciding whether to use posix_memalign() based on
HAVE_POSIX_MEMALIGN, rather than something like USE_MEMALIGN -- emacs
is mixing and matching allocators and their features, which is not
good. I'm not familiar enough with emacs's configuration system to
know the correct way of fixing this, but one way or another, emacs
needs to not use posix_memalign().
More information about the cvs-all