Freeradius crashes with SIGABRT

Daniel Feuchtinger daniel.feuchtinger at lrz.de
Wed Dec 4 13:05:17 CET 2019


Hi, 

finally I found the time to build the recent
freeradius with address sanitizer support. 
I built with gcc, that works fine, 
no clang needed.

RTLD_DEEPBIND in src/main/modules.c
seems to break asan-support?
https://github.com/google/sanitizers/issues/611

The changelog says, trouble with oracle
was the cause for RTLD_DEEPBIND, would
it be possible to couple RTLD_DEEPBIND
via configure to oracle support?

The debian package has no oracle support,
so I used this patch:

--- freeradius-3.0.20+dfsg.orig/src/main/modules.c
+++ freeradius-3.0.20+dfsg/src/main/modules.c
@@ -168,10 +168,11 @@ fr_dlhandle fr_dlopenext(char const *nam
        } else
 #endif
                flags |= RTLD_LOCAL;
+/*
 #ifdef RTLD_DEEPBIND
                flags |= RTLD_DEEPBIND;
 #endif
-
+*/

The first run crashed after a few minutes (see AddressSanitizer output below),
a second run with higher max_requests still runs without a crash
for a few hours now. I guess there shouldn't be a crash with
double-free, even if max_requests is to low?
Here's the asan-Log:

=================================================================
==115708==ERROR: AddressSanitizer: attempting double-free on 0x60b0001bbab0 in thread T0:
    #0 0x7f7ee2477fb0 in __interceptor_free (/usr/lib/x86_64-linux-gnu/libasan.so.5+0xe8fb0)
    #1 0x7f7ee1e825d2 in _tc_free_internal ../talloc.c:1201
    #2 0x7f7ee1e8243f in _tc_free_children_internal ../talloc.c:1646
    #3 0x7f7ee1e8243f in _tc_free_internal ../talloc.c:1163
    #4 0x7f7ee1e8243f in _tc_free_children_internal ../talloc.c:1646
    #5 0x7f7ee1e8243f in _tc_free_internal ../talloc.c:1163
    #6 0x7f7ee1e8243f in _tc_free_children_internal ../talloc.c:1646
    #7 0x7f7ee1e8243f in _tc_free_internal ../talloc.c:1163
    #8 0x7f7ee1e7d347 in _tc_free_children_internal ../talloc.c:1646
    #9 0x7f7ee1e7d347 in _tc_free_internal ../talloc.c:1163
    #10 0x7f7ee1e7d347 in _talloc_free_internal ../talloc.c:1227
    #11 0x7f7ee1e7d347 in _talloc_free ../talloc.c:1769
    #12 0x5594dc01a3cd in request_free src/main/process.c:602
    #13 0x5594dc01a3cd in request_free src/main/process.c:587
    #14 0x5594dc0206fc in request_done src/main/process.c:897
    #15 0x5594dc024ac0 in request_receive src/main/process.c:1765
    #16 0x5594dbfe7c3b in auth_socket_recv src/main/listen.c:1597
    #17 0x5594dc01a775 in event_socket_handler src/main/process.c:4869
    #18 0x7f7ee22b1988 in fr_event_loop src/lib/event.c:649
    #19 0x5594dc031734 in radius_event_process src/main/process.c:5954
    #20 0x5594dbfc7d33 in main src/main/radiusd.c:626
    #21 0x7f7ee197209a in __libc_start_main ../csu/libc-start.c:308
    #22 0x5594dbfc8979 in _start (/usr/sbin/freeradius+0x57979)

0x60b0001bbab0 is located 0 bytes inside of 111-byte region [0x60b0001bbab0,0x60b0001bbb1f)
freed by thread T0 here:
==115708==AddressSanitizer CHECK failed: ../../../../src/libsanitizer/sanitizer_common/sanitizer_stackdepotbase.h:140 "((id & (((u32)-1) >> kReservedBits))) == ((id))" (0x6a15fa73, 0xea15fa73)
    #0 0x7f7ee2482fa5  (/usr/lib/x86_64-linux-gnu/libasan.so.5+0xf3fa5)
    #1 0x7f7ee249df39 in __sanitizer::CheckFailed(char const*, int, char const*, unsigned long long, unsigned long long) (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x10ef39)
    #2 0x7f7ee24982af  (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x1092af)
    #3 0x7f7ee23bc1ec  (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x2d1ec)
    #4 0x7f7ee23bd60d  (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x2e60d)
    #5 0x7f7ee23bdc2f  (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x2ec2f)
    #6 0x7f7ee247fee3  (/usr/lib/x86_64-linux-gnu/libasan.so.5+0xf0ee3)
    #7 0x7f7ee23bacc4  (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x2bcc4)
    #8 0x7f7ee2477f8a in __interceptor_free (/usr/lib/x86_64-linux-gnu/libasan.so.5+0xe8f8a)
    #9 0x7f7ee1e825d2 in _tc_free_internal ../talloc.c:1201
    #10 0x7f7ee1e8243f in _tc_free_children_internal ../talloc.c:1646
    #11 0x7f7ee1e8243f in _tc_free_internal ../talloc.c:1163
    #12 0x7f7ee1e8243f in _tc_free_children_internal ../talloc.c:1646
    #13 0x7f7ee1e8243f in _tc_free_internal ../talloc.c:1163
    #14 0x7f7ee1e8243f in _tc_free_children_internal ../talloc.c:1646
    #15 0x7f7ee1e8243f in _tc_free_internal ../talloc.c:1163
    #16 0x7f7ee1e7d347 in _tc_free_children_internal ../talloc.c:1646
    #17 0x7f7ee1e7d347 in _tc_free_internal ../talloc.c:1163
    #18 0x7f7ee1e7d347 in _talloc_free_internal ../talloc.c:1227
    #19 0x7f7ee1e7d347 in _talloc_free ../talloc.c:1769
    #20 0x5594dc01a3cd in request_free src/main/process.c:602
    #21 0x5594dc01a3cd in request_free src/main/process.c:587
    #22 0x5594dc0206fc in request_done src/main/process.c:897
    #23 0x5594dc024ac0 in request_receive src/main/process.c:1765
    #24 0x5594dbfe7c3b in auth_socket_recv src/main/listen.c:1597
    #25 0x5594dc01a775 in event_socket_handler src/main/process.c:4869
    #26 0x7f7ee22b1988 in fr_event_loop src/lib/event.c:649
    #27 0x5594dc031734 in radius_event_process src/main/process.c:5954
    #28 0x5594dbfc7d33 in main src/main/radiusd.c:626
    #29 0x7f7ee197209a in __libc_start_main ../csu/libc-start.c:308
    #30 0x5594dbfc8979 in _start (/usr/sbin/freeradius+0x57979)





Am 06.03.19 um 23:17 schrieb Alan DeKok:
> 
>   Another alternative is to use LLVM.  If you install the LLVM RPM, you can then build FreeRADIUS with some more options.
> 
> 1) install LLVM
> 2) grab the 3.0.18 source (or the source from GitHub)
> 3) do: CC=clang ./configure --prefix=/opt/freeradius ... args ...
> 
>   I think the name of the compiler on Suse is "clang".  If not, you'll have to find that out
> 
>   You're best to put this build into a unique directory, so it's easy to get rid of it later.
> 
> 4) Edit "Make.inc", and look for the line "CFLAGS = ..."  add this:
> 
> 	-fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize-address-use-after-scope
> 
> 5) run "make; make install"
> 
>   You can then run that version with some extra environment variables:
> 
> export ASAN_SYMBOLIZER_PATH="/usr/local/opt/llvm/bin/llvm-symbolizer"
> 
>    You'll have to find out where that executable is located...
> 
> export ASAN_OPTIONS="malloc_context_size=50 detect_leaks=1 symbolize=1"
> 
>   Then run FreeRADIUS: /usr/freeradius/sbin/radiusd -f -d /etc/raddb
> 
>   With some luck, the address sanitizer may find the issue.  Note that the server will run much slower than normal, but that's likely fine.
> 
>   These issues are very, very, difficult to track down without tools like the address sanitizer.  We're using that in the v4 / master branch, and it's a huge help.
> 
>   Alan DeKok.
> 
> 
> -
> List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html
> 


-- 
Daniel Feuchtinger
Leibniz-Rechenzentrum
Boltzmannstraße 1
D-85748 Garching b. München
Tel. 089 35831 8820

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 6026 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.freeradius.org/pipermail/freeradius-users/attachments/20191204/86ac0aa0/attachment.bin>


More information about the Freeradius-Users mailing list