Bug 1950244 - Miminal program fail with address sanitizer error failed to allocate 0x0 (0) bytes of SetAlternateSignalStack
Summary: Miminal program fail with address sanitizer error failed to allocate 0x0 (0) ...
Keywords:
Status: CLOSED RAWHIDE
Alias: None
Product: Fedora
Classification: Fedora
Component: gcc
Version: rawhide
Hardware: Unspecified
OS: Unspecified
unspecified
unspecified
Target Milestone: ---
Assignee: Jakub Jelinek
QA Contact: Fedora Extras Quality Assurance
URL:
Whiteboard:
Depends On:
Blocks:
TreeView+ depends on / blocked
 
Reported: 2021-04-16 07:58 UTC by Lukas Slebodnik
Modified: 2021-04-20 14:37 UTC (History)
17 users (show)

Fixed In Version: gcc-11.0.1-0.5.fc35
Clone Of:
Environment:
Last Closed: 2021-04-20 14:37:03 UTC
Type: Bug
Embargoed:


Attachments (Terms of Use)


Links
System ID Private Priority Status Summary Last Updated
GNU Compiler Collection 100114 0 P3 UNCONFIRMED libasan built against latest glibc doesn't work 2021-04-16 13:28:01 UTC

Description Lukas Slebodnik 2021-04-16 07:58:16 UTC
Description of problem:
I wanted to play a bit with ASAN on rawhide but lot of things fail
even minimal program with noop logic

I am not sure whether bug is in glibc or gcc/libasan
therefore starting with glibc due to noop logic in sample program

Version-Release number of selected component (if applicable):
sh$ rpm -q gcc libasan glibc
gcc-11.0.1-0.4.fc35.x86_64
libasan-11.0.1-0.4.fc35.x86_64
glibc-2.33.9000-2.fc35.x86_64

How reproducible:
Deterministic

Steps to Reproduce:
1. dnf install -y gcc libasan
2. printf "int main(void) { return 0; }" > test.c
3. gcc -o test -g3 -O0 -fsanitize=address -fno-omit-frame-pointer test.c
4. ./test

Actual results:
[build@eadc9aeff370 sssd]$ printf "int main(void) { return 0; }" > test.c
[build@eadc9aeff370 sssd]$  gcc -o test -g3 -O0 -fsanitize=address -fno-omit-frame-pointer test.c
[build@eadc9aeff370 sssd]$ ./test
==11818==ERROR: AddressSanitizer failed to allocate 0x0 (0) bytes of SetAlternateSignalStack (error code: 22)
==11818==Process memory map follows:
        0x000000400000-0x000000401000   /home/build/sssd/test
        0x000000401000-0x000000402000   /home/build/sssd/test
        0x000000402000-0x000000403000   /home/build/sssd/test
        0x000000403000-0x000000404000   /home/build/sssd/test
        0x000000404000-0x000000405000   /home/build/sssd/test
        0x00007fff7000-0x00008fff7000
        0x00008fff7000-0x02008fff7000
        0x02008fff7000-0x10007fff8000
        0x7f05da5b6000-0x7f05da920000
        0x7f05da920000-0x7f05da923000   /usr/lib64/libgcc_s-11-20210405.so.1
        0x7f05da923000-0x7f05da935000   /usr/lib64/libgcc_s-11-20210405.so.1
        0x7f05da935000-0x7f05da938000   /usr/lib64/libgcc_s-11-20210405.so.1
        0x7f05da938000-0x7f05da939000   /usr/lib64/libgcc_s-11-20210405.so.1
        0x7f05da939000-0x7f05da93a000   /usr/lib64/libgcc_s-11-20210405.so.1
        0x7f05da93a000-0x7f05da93b000   /usr/lib64/libgcc_s-11-20210405.so.1
        0x7f05da93b000-0x7f05da94a000   /usr/lib64/libm-2.33.9000.so
        0x7f05da94a000-0x7f05da9e4000   /usr/lib64/libm-2.33.9000.so
        0x7f05da9e4000-0x7f05daa7c000   /usr/lib64/libm-2.33.9000.so
        0x7f05daa7c000-0x7f05daa7d000   /usr/lib64/libm-2.33.9000.so
        0x7f05daa7d000-0x7f05daa7e000   /usr/lib64/libm-2.33.9000.so
        0x7f05daa7e000-0x7f05daa7f000   /usr/lib64/libm-2.33.9000.so
        0x7f05daa7f000-0x7f05daa81000
        0x7f05daa81000-0x7f05dab1a000   /usr/lib64/libstdc++.so.6.0.29
        0x7f05dab1a000-0x7f05dac1c000   /usr/lib64/libstdc++.so.6.0.29
        0x7f05dac1c000-0x7f05dac8f000   /usr/lib64/libstdc++.so.6.0.29
        0x7f05dac8f000-0x7f05dac9a000   /usr/lib64/libstdc++.so.6.0.29
        0x7f05dac9a000-0x7f05dac9d000   /usr/lib64/libstdc++.so.6.0.29
        0x7f05dac9d000-0x7f05daca0000
        0x7f05daca0000-0x7f05daca7000   /usr/lib64/libpthread-2.33.9000.so
        0x7f05daca7000-0x7f05dacb6000   /usr/lib64/libpthread-2.33.9000.so
        0x7f05dacb6000-0x7f05dacba000   /usr/lib64/libpthread-2.33.9000.so
        0x7f05dacba000-0x7f05dacbb000   /usr/lib64/libpthread-2.33.9000.so
        0x7f05dacbb000-0x7f05dacbc000   /usr/lib64/libpthread-2.33.9000.so
        0x7f05dacbc000-0x7f05dacbd000   /usr/lib64/libpthread-2.33.9000.so
        0x7f05dacbd000-0x7f05dacc1000
        0x7f05dacc1000-0x7f05dacc4000   /usr/lib64/librt-2.33.9000.so
        0x7f05dacc4000-0x7f05dacc8000   /usr/lib64/librt-2.33.9000.so
        0x7f05dacc8000-0x7f05dacca000   /usr/lib64/librt-2.33.9000.so
        0x7f05dacca000-0x7f05daccb000   /usr/lib64/librt-2.33.9000.so
        0x7f05daccb000-0x7f05daccc000   /usr/lib64/librt-2.33.9000.so
        0x7f05daccc000-0x7f05dacce000   /usr/lib64/libdl-2.33.9000.so
        0x7f05dacce000-0x7f05dacd0000   /usr/lib64/libdl-2.33.9000.so
        0x7f05dacd0000-0x7f05dacd1000   /usr/lib64/libdl-2.33.9000.so
        0x7f05dacd1000-0x7f05dacd2000   /usr/lib64/libdl-2.33.9000.so
        0x7f05dacd2000-0x7f05dacd3000
        0x7f05dacd3000-0x7f05dacf9000   /usr/lib64/libc-2.33.9000.so
        0x7f05dacf9000-0x7f05dae46000   /usr/lib64/libc-2.33.9000.so
        0x7f05dae46000-0x7f05dae92000   /usr/lib64/libc-2.33.9000.so
        0x7f05dae92000-0x7f05dae93000   /usr/lib64/libc-2.33.9000.so
        0x7f05dae93000-0x7f05dae96000   /usr/lib64/libc-2.33.9000.so
        0x7f05dae96000-0x7f05dae99000   /usr/lib64/libc-2.33.9000.so
        0x7f05dae99000-0x7f05daea2000
        0x7f05daea2000-0x7f05daec6000   /usr/lib64/libasan.so.6.0.0
        0x7f05daec6000-0x7f05daf93000   /usr/lib64/libasan.so.6.0.0
        0x7f05daf93000-0x7f05dafc6000   /usr/lib64/libasan.so.6.0.0
        0x7f05dafc6000-0x7f05dafca000   /usr/lib64/libasan.so.6.0.0
        0x7f05dafca000-0x7f05dafcd000   /usr/lib64/libasan.so.6.0.0
        0x7f05dafcd000-0x7f05db875000
        0x7f05db876000-0x7f05db87c000
        0x7f05db87c000-0x7f05db87d000   /usr/lib64/ld-2.33.9000.so
        0x7f05db87d000-0x7f05db8a1000   /usr/lib64/ld-2.33.9000.so
        0x7f05db8a1000-0x7f05db8aa000   /usr/lib64/ld-2.33.9000.so
        0x7f05db8aa000-0x7f05db8ac000   /usr/lib64/ld-2.33.9000.so
        0x7f05db8ac000-0x7f05db8ae000   /usr/lib64/ld-2.33.9000.so
        0x7ffed2dc5000-0x7ffed2de6000   [stack]
        0x7ffed2dfb000-0x7ffed2dfe000   [vvar]
        0x7ffed2dfe000-0x7ffed2e00000   [vdso]
        0xffffffffff600000-0xffffffffff601000   [vsyscall]
==11818==End of process memory map.
==11818==AddressSanitizer CHECK failed: ../../../../libsanitizer/sanitizer_common/sanitizer_common.cpp:54 "((0 && "unable to mmap")) != (0)" (0x0, 0x0)
    <empty stack>

Expected results:
No errors

Additional info:
Initially I tested with different reproducer. Using LD_PRELOAD

sh$ gcc -o test test.c
sh$ LD_PRELOAD=`rpm -ql libasan | grep so | tail -n1` ./test

But the result is the same

Comment 1 Florian Weimer 2021-04-16 08:00:02 UTC
This error comes from Address Sanitizer, so reassigning to gcc.

Comment 2 Lukas Slebodnik 2021-04-16 08:02:58 UTC
workaround seems to be disable option use_sigaltstack

Surprisingly, leak detection fails for minimal code as well.
Shall I file a new bug for that? or is it related?

sh-5.1$ printf "int main(void) { return 0; }" > test.c

sh-5.1$ gcc -o test test.c

sh-5.1$ LD_PRELOAD=`rpm -ql libasan | grep so | tail -n1` ASAN_OPTIONS=use_sigaltstack=0 ./test
==11881==LeakSanitizer has encountered a fatal error.
==11881==HINT: For debugging, try setting environment variable LSAN_OPTIONS=verbosity=1:log_threads=1
==11881==HINT: LeakSanitizer does not work under ptrace (strace, gdb, etc)

sh-5.1$ LD_PRELOAD=`rpm -ql libasan | grep so | tail -n1` ASAN_OPTIONS=use_sigaltstack=0 LSAN_OPTIONS=verbosity=1:log_threads=1 ./test
==11887==AddressSanitizer: failed to intercept '__isoc99_printf'
'==11887==AddressSanitizer: failed to intercept '__isoc99_sprintf'
'==11887==AddressSanitizer: failed to intercept '__isoc99_snprintf'
'==11887==AddressSanitizer: failed to intercept '__isoc99_fprintf'
'==11887==AddressSanitizer: failed to intercept '__isoc99_vprintf'
'==11887==AddressSanitizer: failed to intercept '__isoc99_vsprintf'
'==11887==AddressSanitizer: failed to intercept '__isoc99_vsnprintf'
'==11887==AddressSanitizer: failed to intercept '__isoc99_vfprintf'
'==11887==AddressSanitizer: failed to intercept 'xdr_quad_t'
'==11887==AddressSanitizer: failed to intercept 'xdr_u_quad_t'
'==11887==AddressSanitizer: failed to intercept 'xdr_destroy'
'==11887==AddressSanitizer: failed to intercept 'crypt'
'==11887==AddressSanitizer: failed to intercept 'crypt_r'
'==11887==AddressSanitizer: libc interceptors initialized
|| `[0x10007fff8000, 0x7fffffffffff]` || HighMem    ||
|| `[0x02008fff7000, 0x10007fff7fff]` || HighShadow ||
|| `[0x00008fff7000, 0x02008fff6fff]` || ShadowGap  ||
|| `[0x00007fff8000, 0x00008fff6fff]` || LowShadow  ||
|| `[0x000000000000, 0x00007fff7fff]` || LowMem     ||
MemToShadow(shadow): 0x00008fff7000 0x000091ff6dff 0x004091ff6e00 0x02008fff6fff
redzone=16
max_redzone=2048
quarantine_size_mb=256M
thread_local_quarantine_size_kb=1024K
malloc_context_size=30
SHADOW_SCALE: 3
SHADOW_GRANULARITY: 8
SHADOW_OFFSET: 0x7fff8000
==11887==Installed the sigaction for signal 11
==11887==Installed the sigaction for signal 7
==11887==Installed the sigaction for signal 8
==11887==T0: stack [0x7fffefb2f000,0x7ffff032f000) size 0x800000; local=0x7ffff032d6bc
==11887==AddressSanitizer Init done
==11888==Could not attach to thread 11887 (errno 1).
==11888==Failed suspending threads.
==11887==LeakSanitizer has encountered a fatal error.
==11887==HINT: For debugging, try setting environment variable LSAN_OPTIONS=verbosity=1:log_threads=1
==11887==HINT: LeakSanitizer does not work under ptrace (strace, gdb, etc)

Comment 3 Florian Weimer 2021-04-16 08:09:28 UTC
I think Leak Sanitizer just doesn't work with glibc because it tries to access internals behind glibc's back.

The sigaltstack issues is probably this:

static const uptr kAltStackSize = SIGSTKSZ * 4;  // SIGSTKSZ is not enough.

And this is no longer a static initializer with current glibc, and Address Sanitizer appears to access the variable before the initializer is evaluated.

Comment 4 Jakub Jelinek 2021-04-20 14:37:03 UTC
Should be fixed already in gcc-11.0.1-0.5.fc35.


Note You need to log in before you can comment on or make changes to this bug.