January 03, 2019 posted by Kamil Rytarowski

I've finished the process of upstreaming patches to LLVM sanitizers (almost 2000LOC of local code) and submitted to upstream new improvements for the NetBSD support. Today out of the box (in unpatched version) we have support for a variety of compiler-rt LLVM features: ASan (finds unauthorized memory access), UBSan (finds unspecified code semantics), TSan (finds threading bugs), MSan (finds uninitialized memory use), SafeStack (double stack hardening), Profile (code coverage), XRay (dynamic code tracing); while other ones such as Scudo (hardened allocator) or DFSan (generic data flow sanitizer) are not far away from completeness.

The NetBSD support is no longer visibly lacking behind Linux in sanitizers, although there are still failing tests on NetBSD that are not observed on Linux. On the other hand there are features working on NetBSD that are not functional on Linux, like sanitizing programs during early initialization process of OS (this is caused by /proc dependency on Linux that is mounted by startup programs, while NetBSD relies on sysctl(3) interfaces that is always available).

Changes in compiler-rt

A number of patches have been merged upstream this month. Part of the upstreamed code has been originally written by Yang Zheng during GSoC-2018. My work was about cleaning the patches, applying comments from upstream review and writing new regression tests. Some of the changes were newly written over the past month, like background thread support in ASan/NetBSD or NetBSD compatible per-thread cleanup destructors in ASan and MSan.

Additionally, I've also ported the LLVM profile (--coverage) feature to NetBSD and investigated the remaining failing tests. Part of the failures were caused by already a copy of older runtime inside the NetBSD libc (ABIv2 libc vs ABIv4 current). The remaining two tests are affected by incompatible behavior of atexit(3) in Dynamic Shared Objects. Replacing the functionality with destructors didn't work and I've marked these tests as expected failures and moved on.

Changes in compiler-rt:

3d5a3668a Reenable hard_rss_limit_mb_test.cc for android-26

decb231c3 Add support for background thread on NetBSD in ASan

3ebc523bb Fix a mistake in previous

df1f46250 Update NetBSD ioctl(2) entries with 8.99.28

2de4ff725 Enable asan_and_llvm_coverage_test.cc for NetBSD

4d9ac421b Reimplement Thread Static Data MSan routines with TLS

f4a536af4 Adjust NetBSD/sha2.cc to be portable to more environments

21bd4bd9f Adjust NetBSD/md2.cc to be portable to more environments

1f2d0324e Adjust NetBSD/md[45].cc to be portable to more environments

2835fe7cf Add support for LLVM profile for NetBSD

52af2fe7c Reimplement Thread Static Data ASan routines with TLS

79d385b5c Improve the comment in previous

384486fa4 Expand TSan sysroot workaround to NetBSD

81e370964 Enable test/msan/pthread_getname_np.cc for NetBSD

19e2af50e Enable SANITIZER_INTERCEPT_PTHREAD_GETNAME_NP for NetBSD

5088473c7 Fix internal_sleep() for NetBSD

cd24f2f94 Mark interception_failure_test.cc as passing for NetBSD and asan-dynamic-runtime

ececda6ca Set shared_libasan_path in lit tests for NetBSD

429bc2d51 Add a new interceptors for cdbr(3) and cdbw(3) API from NetBSD

71553eb50 Add new interceptors for vis(3) API in NetBSD

a3e78a793 Add data types needed for md2(3)/NetBSD interceptors

0ddb9d099 Add interceptors for the sha2(3) from NetBSD

9e2ff43a6 Add interceptors for md2(3) from NetBSD

42ac31ee6 Add new interceptors for FILE repositioning stream

8627b4b30 Fix a typo in the strtoi test

660f7441b Revert a chunk of previous change in sanitizer_platform_limits_netbsd.h

9a087462c Add interceptors for md5(3) from NetBSD

086caf6a2 Add interceptors for the rmd160(3) from NetBSD

8f77a2e89 Add interceptors for the md4(3) from NetBSD

27af3db52 Add interceptors for the sha1(3) from NetBSD

6b9f7889b Add interceptors for the strtoi(3)/strtou(3) from NetBSD

195044df9 Add a new interceptors for statvfs1(2) and fstatvfs1(2) from NetBSD

f0835eb01 Add a new interceptor for fparseln(3) from NetBSD

11ecbe602 Add new interceptor for strtonum(3)

19b47fcc0 Remove XFAIL in get_module_and_offset_for_pc.cc for NetBSD-MSan

b3a7f1d78 Add a new interceptor for modctl(2) from NetBSD

39c2acc81 Add a new interceptor for nl_langinfo(3) from NetBSD

2eb9a4c53 Update GET_LINK_MAP_BY_DLOPEN_HANDLE() for NetBSD x86

e8dd644be Improve the regerror(3) interceptor

dd939986a Add interceptors for the sysctl(3) API family from NetBSD

67639f9cc Add interceptors for the fts(3) API family from NetBSD

c8fae517a Add new interceptor for regex(3) in NetBSD

Part of the new code has been quickly ported from NetBSD to other Operating Systems, mostly FreeBSD, and when applicable to Darwin and Linux.

Changes in other LLVM projects

In order to eliminate local diffs in other LLVM projects, I've upstreamed two patches to LLVM and two to OpenMP. I've also helped other BSDs to get their support in OpenMP (DragonFlyBSD and OpenBSD).

LLVM changes:

50df229c26a Add NetBSD support in needsRuntimeRegistrationOfSectionRange.

267dfed3ade Register kASan shadow offset for NetBSD/amd64

OpenMP changes:

67d037d Implement __kmp_is_address_mapped() for NetBSD

9761977 Implement __kmp_gettid() for NetBSD

a72c79b Add OpenBSD support to OpenMP

b3d05ab Add DragonFlyBSD support to OpenMP

NetBSD changes

I've introduced 5 changes to the NetBSD source tree over the past month, not counting updates to TODO lists.

Raise the fill_vmentries() E2BIG limit from 1MB to 10MB

Correct libproc_p.a in distribution sets

compiler_rt: Update prepare-import.sh according to future updates

Correct handling of minval > maxval in strtonum(3)

Stop mangling __func__ for C++11 and newer

The first change is needed to handle large address space with sysctl(3) operation to retrieve the map. This feature is required in sanitizers and part of the tests were failing because within 1MB it wasn't possible to pass all the information about the process virtual map (mostly due to a large number of small allocations).

The second change was introduced to unbreak MKPROFILE=no build, I needed this during my work of porting the modern LLVM profile feature.

The third change is a preparation for import of compiler-rt sanitizers into the NetBSD distribution.

The forth change was a bug fix for strtonum(3) implementation in libc.

The fifth change was intended to reuse native compiler support for the __func__ compiler symbol.

Integration of LLVM sanitizers with the NetBSD basesystem

We are ready to push support for LLVM sanitizers into the NetBSD basesystem as all the needed patches have been merged. I've divided the remaining tests of integration of LLVM sanitizers into three milestones:

Import compiler-rt sources into src/. A complete diff is pending for final acceptance in internal review. Integrate building of compiler-rt stanitizer under the MKLLVM=yes option. This has been made functional, but it needs polishing and submitting to internal review. Make MKSANITIZER available out of the box with the toolchain available in "./build.sh tools". This will be continuation of the previous point. All the MKSANITIZER patches independent from compiler type are already committed into the NetBSD distribution, however there will be likely some extra minor adaptation work here too.

Plan for the next milestone

Finish the integration of LLVM sanitizers with the NetBSD distribution.

This work was sponsored by The NetBSD Foundation.

The NetBSD Foundation is a non-profit organization and welcomes any donations to help us continue funding projects and services to the open-source community. Please consider visiting the following URL, and chip in what you can:

http://netbsd.org/donations/#how-to-donate [2 comments]