Package: fakechroot
Version: 2.20.1-1
Severity: normal
Control: affects -1 + jemalloc

Hi,

libjemalloc and fakechroot do not play well together on arm64 and
riscv64. Faidon managed to analyze the situation. It follows what they
found out:

I got a backtrace (see below) by:
1) attempting a normal build; killing it when it reaches t/jemalloc.t
2) cd test; ./t/jemalloc.t
3) gdb -p ($pidof cat)

This is a deadlock, by malloc() being invoked in the code path for malloc().
Something tries to malloc(), jemalloc tries to initialize itself, which in turn
means trying to open() /sys/kernel/mm/transparent_hugepage/enabled, but open()
is LD_PRELOADed to fakechroot, which tries to initialize itself, which in turn
tries to malloc memory.

I'm not entirely sure why that happens yet, or why it only happens on arm64.  I
believe it is unrelated to the previous bug, #918742.

Faidon


(gdb) bt
#0  __lll_lock_wait (futex=futex@entry=0xffff9dd604e0 <init_lock+64>, 
private=0) at lowlevellock.c:52
#1  0x0000ffff9d8f9070 in __GI___pthread_mutex_lock (mutex=0xffff9dd604e0 
<init_lock+64>) at pthread_mutex_lock.c:80
#2  0x0000ffff9dd1c4e0 in malloc_mutex_lock_final (mutex=0xffff9dd604a0 
<init_lock>) at include/jemalloc/internal/mutex.h:155
#3  je_malloc_mutex_lock_slow (mutex=mutex@entry=0xffff9dd604a0 <init_lock>) at 
src/mutex.c:85
#4  0x0000ffff9dce4a50 in malloc_mutex_lock (mutex=0xffff9dd604a0 <init_lock>, 
tsdn=0x0) at include/jemalloc/internal/mutex.h:221
#5  malloc_init_hard () at src/jemalloc.c:1740
#6  0x0000ffff9dce8650 in malloc_init () at src/jemalloc.c:210
#7  imalloc_init_check (dopts=<synthetic pointer>, sopts=<synthetic pointer>) 
at src/jemalloc.c:2230
#8  imalloc (dopts=<synthetic pointer>, sopts=<synthetic pointer>) at 
src/jemalloc.c:2261
#9  calloc (num=num@entry=6, size=size@entry=1) at src/jemalloc.c:2495
#10 0x0000ffff9ddfa020 in fakechroot_init () at ./src/libfakechroot.c:126
#11 0x0000ffff9de05c24 in fakechroot_localdir 
(p_path=p_path@entry=0xffff9dd3df98 
"/sys/kernel/mm/transparent_hugepage/enabled") at ./src/libfakechroot.c:165
#12 0x0000ffff9de08320 in open (pathname=pathname@entry=0xffff9dd3df98 
"/sys/kernel/mm/transparent_hugepage/enabled",flags=flags@entry=0) at 
./src/open.c:40
#13 0x0000ffff9dd1d11c in open (__oflag=0, __path=0xffff9dd3df98 
"/sys/kernel/mm/transparent_hugepage/enabled") at 
/usr/include/aarch64-linux-gnu/bits/fcntl2.h:53
#14 init_thp_state () at src/pages.c:567
#15 je_pages_boot () at src/pages.c:626
#16 0x0000ffff9dce4648 in malloc_init_hard_a0_locked () at src/jemalloc.c:1519
#17 0x0000ffff9dce47d4 in malloc_init_hard () at src/jemalloc.c:1751
#18 0x0000ffff9dce75ac in malloc_init () at src/jemalloc.c:210
#19 imalloc_init_check (dopts=<synthetic pointer>, sopts=<synthetic pointer>) 
at src/jemalloc.c:2230
#20 imalloc (dopts=<synthetic pointer>, sopts=<synthetic pointer>) at 
src/jemalloc.c:2261
#21 je_malloc_default (size=72704) at src/jemalloc.c:2290
#22 0x0000ffff9d9e10b4 in (anonymous namespace)::pool::pool 
(this=0xffff9db4d3b8 <(anonymous namespace)::emergency_pool>) at 
../../../../src/libstdc++-v3/libsupc++/eh_alloc.cc:123
#23 __static_initialization_and_destruction_0 (__priority=65535, 
__initialize_p=1) at ../../../../src/libstdc++-v3/libsupc++/eh_alloc.cc:262
#24 _GLOBAL__sub_I_eh_alloc.cc(void) () at 
../../../../src/libstdc++-v3/libsupc++/eh_alloc.cc:338
#25 0x0000ffff9de338bc in call_init (l=<optimized out>, argc=argc@entry=2, 
argv=argv@entry=0xffffd03cd698,env=env@entry=0xffffd03cd6b0) at dl-init.c:74
#26 0x0000ffff9de339b4 in call_init (env=0xffffd03cd6b0, argv=0xffffd03cd698, 
argc=2, l=<optimized out>) at dl-init.c:37
#27 _dl_init (main_map=0xffff9de59270, argc=2, argv=0xffffd03cd698, 
env=0xffffd03cd6b0) at dl-init.c:121
#28 0x0000ffff9de26088 in _dl_start_user () from /lib/ld-linux-aarch64.so.1
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Reply via email to