[New-bugs-announce] [issue18178] Redefinition of malloc(3) family of functions at build time

rm report at bugs.python.org
Mon Jun 10 10:11:18 CEST 2013


New submission from rm:

Hello.

Marcel Moolenaar (marcel at FreeBSD.org) pointed this out after committing FreeBSD revision 250991 [1], that makes the malloc(3) family of functions weak symbols. I'm citing him, because (silly me) I don't understand all of this completely:

"""
After my commit to head that makes the malloc(3) family of functions weak symbols, a bug in what appears to be the Python build was exposed. The net effect of the bug is that _ctypes.so contains (strong) definitions of the malloc(3) family of functions and resulting in unintended symbol resolution.

_ctypes.so incorporates the libffi functionality for what I presume is
the basis for Python bindings. libffi includes dlmalloc.c, an open source allocator. dlmalloc.c is incuded by closures.c and closures.c defines USE_DL_PREFIX. On top of that closures.c makes all allocator functions static. This, therefore adds a memory allocator to libffi without exposure of standard symbols In short: dlmalloc.c never gets compiler separately or independently for this reason.

The python build however compiles dlmalloc.c separately/independently. As such, dlmalloc.c now defines and exports the malloc(3) family of functions and it also get linked into _ctypes.so. Thus when libffi is built as part of the Python build, the set of symbols exported is different from when libffi is compiled as a port.


The simplest test case is this (on a -current machines):

1.  Build & install lang/python27 (unmodified; if needed)
2.  try and build databases/py-sqlite3

The build of databases/py-sqlite3 fails because this:
running config
*** Signal 11

On amd64 I observed an assertion failure of FreeBSD's malloc, with
the same effect.


Manually triggering this:

fbsdvm% pwd
/usr/ports/databases/py-sqlite3/work/Python-2.7.5/Modules

fbsdvm% /usr/local/bin/python2.7 setup.py config
running config
Segmentation fault

But if symbols are resolved non-lazily, things change:

fbsdvm% setenv LD_BIND_NOW yes
fbsdvm% /usr/local/bin/python2.7 setup.py config
running config

This demonstrates how, after loading _ctypes.so, malloc(3) and friends
get resolved differently and thus inconsistently from before.

The publicly visible symbols in _ctypes.so, also show the problem:

fbsdvm% nm /usr/local/lib/python2.7/lib-dynload/_ctypes.so | grep ' T ' | egrep '(alloc)|(free)'
0000c3f0 T _ctypes_alloc_callback
00005250 T _ctypes_alloc_format_string
00016d10 T calloc
000121e0 T ffi_closure_alloc
00013760 T ffi_closure_free
00016050 T free
000170c0 T independent_calloc
000172d0 T independent_comalloc
000148e0 T malloc
00017460 T malloc_footprint
00017480 T malloc_max_footprint
000175c0 T malloc_stats
00017440 T malloc_trim
000176e0 T malloc_usable_size
000173a0 T pvalloc
00016d90 T realloc
00017310 T valloc

There are definitions of malloc(3) and friends that shouldn't be there.
"""

We have similar reports in our bug-tracker [2] and [3]. And the patch attached fixes this for post-r250991 versions of FreeBSD, and noop for earlier versions. The same patch applied to python2.7, python3.2, python3.3 and patched in FreeBSD ports tree locally.

[1] http://svnweb.freebsd.org/changeset/base/250991
[2] http://www.freebsd.org/cgi/query-pr.cgi?pr=ports/179102
[3] http://www.freebsd.org/cgi/query-pr.cgi?pr=ports/179413

----------
components: ctypes
files: patch-Modules-_ctypes-libffi_fficonfig.py.in
messages: 190892
nosy: cvs-src
priority: normal
severity: normal
status: open
title: Redefinition of malloc(3) family of functions at build time
type: crash
versions: Python 2.7
Added file: http://bugs.python.org/file30522/patch-Modules-_ctypes-libffi_fficonfig.py.in

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue18178>
_______________________________________


More information about the New-bugs-announce mailing list