This is an archive of the discontinued LLVM Phabricator instance.

[hwasan, asan] Intercept vfork.
ClosedPublic

Authored by eugenis on Feb 21 2019, 4:20 PM.

Diff Detail

Event Timeline

eugenis created this revision.Feb 21 2019, 4:20 PM
Herald added projects: Restricted Project, Restricted Project. · View Herald TranscriptFeb 21 2019, 4:20 PM
Herald added subscribers: Restricted Project, kristof.beyls, krytarowski and 3 others. · View Herald Transcript
eugenis edited the summary of this revision. (Show Details)Feb 21 2019, 4:21 PM

This is the second attempt. It adds:

  • a fix in __asan_handle_vfork
  • a fix for win32 build
  • a fix for mac build
  • fixed .note.GNU-stack syntax that works with arm32 assembler
  • x86_64 vfork interceptor
vitalybuka added inline comments.Feb 22 2019, 1:58 PM
compiler-rt/lib/asan/asan_interceptors.cc
664 ↗(On Diff #187889)

Why can't this be ASAN_INTERCEPT_FUNC?

Same below for HWSAN

eugenis updated this revision to Diff 188000.Feb 22 2019, 3:47 PM
eugenis edited the summary of this revision. (Show Details)

fixed a bug in x86_64 version
added i386 and arm

Hmm, this change somehow includes D58532 diff, too.

pcc added inline comments.Feb 22 2019, 4:27 PM
compiler-rt/lib/hwasan/hwasan_interceptors.cc
273 ↗(On Diff #188001)

Shouldn't it be only this line that is protected with the defined(__linux__)?

eugenis marked 2 inline comments as done.Feb 22 2019, 5:05 PM
eugenis added inline comments.
compiler-rt/lib/asan/asan_interceptors.cc
664 ↗(On Diff #187889)

Done. I've had to add a new macro to interception.h to declare externally-defined interceptor/wrapper pair.
Wrapper can not be defined in this file because an alias can not target an external symbol.

eugenis updated this revision to Diff 188260.Feb 25 2019, 3:12 PM

untabify asm files

pcc accepted this revision.Feb 27 2019, 1:10 PM

LGTM

This revision is now accepted and ready to land.Feb 27 2019, 1:10 PM
This revision was automatically updated to reflect the committed changes.
phosek added a subscriber: phosek.Feb 27 2019, 5:24 PM

This broke our builders with the following error:

[630/630] Linking CXX shared library /b/s/w/ir/k/recipe_cleanup/clangv6gSby/llvm_build_dir/lib/clang/9.0.0/i386-linux-gnu/lib/libclang_rt.asan.so
FAILED: /b/s/w/ir/k/recipe_cleanup/clangv6gSby/llvm_build_dir/lib/clang/9.0.0/i386-linux-gnu/lib/libclang_rt.asan.so 
: && /b/s/w/ir/k/recipe_cleanup/clangv6gSby/llvm_build_dir/./bin/clang++ --target=i386-linux-gnu --sysroot=/b/s/w/ir/k/cipd/linux-i386 -fPIC -fPIC -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -std=c++11 -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wstring-conversion -fdiagnostics-color -ffunction-sections -fdata-sections -Wall -std=c++11 -Wno-unused-parameter -O3 -DNDEBUG  -fuse-ld=lld  -Wl,-z,nodelete -Wl,--color-diagnostics   -nodefaultlibs -Wl,--version-script,/b/s/w/ir/k/recipe_cleanup/clangv6gSby/llvm_build_dir/runtimes/runtimes-i386-linux-gnu-bins/compiler-rt/lib/asan/clang_rt.asan-dynamic-i386.vers -shared -Wl,-soname,libclang_rt.asan.so -o /b/s/w/ir/k/recipe_cleanup/clangv6gSby/llvm_build_dir/lib/clang/9.0.0/i386-linux-gnu/lib/libclang_rt.asan.so compiler-rt/lib/interception/CMakeFiles/RTInterception.i386.dir/interception_linux.cc.o compiler-rt/lib/interception/CMakeFiles/RTInterception.i386.dir/interception_mac.cc.o compiler-rt/lib/interception/CMakeFiles/RTInterception.i386.dir/interception_win.cc.o compiler-rt/lib/interception/CMakeFiles/RTInterception.i386.dir/interception_type_test.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_allocator.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_common.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_deadlock_detector1.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_deadlock_detector2.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_errno.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_file.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_flags.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_flag_parser.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_fuchsia.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_libc.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_libignore.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_linux.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_linux_s390.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_mac.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_netbsd.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_openbsd.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_persistent_allocator.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_platform_limits_freebsd.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_platform_limits_linux.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_platform_limits_netbsd.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_platform_limits_openbsd.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_platform_limits_posix.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_platform_limits_solaris.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_posix.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_printf.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_procmaps_common.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_procmaps_bsd.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_procmaps_linux.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_procmaps_mac.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_procmaps_solaris.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_rtems.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_solaris.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_stoptheworld_mac.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_suppressions.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_tls_get_addr.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_thread_registry.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_type_traits.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_win.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_linux_x86_64.S.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_linux_mips64.S.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_termination.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.i386.dir/sanitizer_common_libcdep.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.i386.dir/sanitizer_allocator_checks.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.i386.dir/sanitizer_linux_libcdep.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.i386.dir/sanitizer_mac_libcdep.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.i386.dir/sanitizer_posix_libcdep.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.i386.dir/sanitizer_stoptheworld_linux_libcdep.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonCoverage.i386.dir/sancov_flags.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonCoverage.i386.dir/sanitizer_coverage_fuchsia.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonCoverage.i386.dir/sanitizer_coverage_libcdep_new.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonCoverage.i386.dir/sanitizer_coverage_win_sections.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.i386.dir/sanitizer_allocator_report.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.i386.dir/sanitizer_stackdepot.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.i386.dir/sanitizer_stacktrace.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.i386.dir/sanitizer_stacktrace_libcdep.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.i386.dir/sanitizer_stacktrace_printer.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.i386.dir/sanitizer_stacktrace_sparc.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.i386.dir/sanitizer_symbolizer.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.i386.dir/sanitizer_symbolizer_libbacktrace.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.i386.dir/sanitizer_symbolizer_libcdep.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.i386.dir/sanitizer_symbolizer_mac.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.i386.dir/sanitizer_symbolizer_markup.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.i386.dir/sanitizer_symbolizer_posix_libcdep.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.i386.dir/sanitizer_symbolizer_report.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.i386.dir/sanitizer_symbolizer_win.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.i386.dir/sanitizer_unwind_linux_libcdep.cc.o compiler-rt/lib/sanitizer_common/CMakeFiles/RTSanitizerCommonSymbolizer.i386.dir/sanitizer_unwind_win.cc.o compiler-rt/lib/lsan/CMakeFiles/RTLSanCommon.i386.dir/lsan_common.cc.o compiler-rt/lib/lsan/CMakeFiles/RTLSanCommon.i386.dir/lsan_common_linux.cc.o compiler-rt/lib/lsan/CMakeFiles/RTLSanCommon.i386.dir/lsan_common_mac.cc.o compiler-rt/lib/ubsan/CMakeFiles/RTUbsan.i386.dir/ubsan_diag.cc.o compiler-rt/lib/ubsan/CMakeFiles/RTUbsan.i386.dir/ubsan_init.cc.o compiler-rt/lib/ubsan/CMakeFiles/RTUbsan.i386.dir/ubsan_flags.cc.o compiler-rt/lib/ubsan/CMakeFiles/RTUbsan.i386.dir/ubsan_handlers.cc.o compiler-rt/lib/ubsan/CMakeFiles/RTUbsan.i386.dir/ubsan_monitor.cc.o compiler-rt/lib/ubsan/CMakeFiles/RTUbsan.i386.dir/ubsan_value.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_allocator.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_activation.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_debugging.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_descriptions.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_errors.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_fake_stack.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_flags.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_fuchsia.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_globals.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_globals_win.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_interceptors.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_interceptors_memintrinsics.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_linux.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_mac.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_malloc_linux.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_malloc_mac.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_malloc_win.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_memory_profile.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_poisoning.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_posix.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_premap_shadow.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_report.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_rtems.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_rtl.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_shadow_setup.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_stack.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_stats.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_suppressions.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_thread.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_win.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_interceptors_vfork.S.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_new_delete.cc.o compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic_version_script_dummy.i386.dir/dummy.cc.o compiler-rt/lib/ubsan/CMakeFiles/RTUbsan_cxx.i386.dir/ubsan_handlers_cxx.cc.o compiler-rt/lib/ubsan/CMakeFiles/RTUbsan_cxx.i386.dir/ubsan_type_hash.cc.o compiler-rt/lib/ubsan/CMakeFiles/RTUbsan_cxx.i386.dir/ubsan_type_hash_itanium.cc.o compiler-rt/lib/ubsan/CMakeFiles/RTUbsan_cxx.i386.dir/ubsan_type_hash_win.cc.o -L/b/s/w/ir/k/recipe_cleanup/clangv6gSby/llvm_build_dir/lib/clang/9.0.0/i386-linux-gnu/lib  -L/b/s/w/ir/k/cipd/linux-i386/usr/lib/gcc/i586-linux-gnu/4.9  -L/b/s/w/ir/k/cipd/linux-i386/usr/lib/i386-linux-gnu  -L/b/s/w/ir/k/cipd/linux-i386/lib/i386-linux-gnu  -L/b/s/w/ir/k/cipd/linux-i386/usr/lib  -L/b/s/w/ir/k/cipd/linux-i386/lib -Wl,-rpath,"\$ORIGIN/../lib:/b/s/w/ir/k/recipe_cleanup/clangv6gSby/llvm_build_dir/./lib" /b/s/w/ir/k/recipe_cleanup/clangv6gSby/llvm_build_dir/lib/clang/9.0.0/i386-linux-gnu/lib/libunwind.a /b/s/w/ir/k/recipe_cleanup/clangv6gSby/llvm_build_dir/lib/clang/9.0.0/i386-linux-gnu/lib/libc++abi.a /b/s/w/ir/k/recipe_cleanup/clangv6gSby/llvm_build_dir/lib/clang/9.0.0/i386-linux-gnu/lib/libclang_rt.builtins.a -lc -ldl -lrt -lm -lpthread -lc && :
ld.lld: error: can't create dynamic relocation R_386_32 against symbol: __interception::real_vfork in readonly segment; recompile object files with -fPIC or pass '-Wl,-z,notext' to allow text relocations in the output
>>> defined in compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_interceptors.cc.o
>>> referenced by sanitizer_common_interceptors_vfork_i386.inc.S:17 (/b/s/w/ir/k/llvm-project/compiler-rt/lib/asan/../sanitizer_common/sanitizer_common_interceptors_vfork_i386.inc.S:17)
>>>               compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_interceptors_vfork.S.o:(vfork)

ld.lld: error: relocation R_386_PC32 cannot be used against symbol __asan_handle_vfork; recompile with -fPIC
>>> defined in compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_rtl.cc.o
>>> referenced by sanitizer_common_interceptors_vfork_i386.inc.S:34 (/b/s/w/ir/k/llvm-project/compiler-rt/lib/asan/../sanitizer_common/sanitizer_common_interceptors_vfork_i386.inc.S:34)
>>>               compiler-rt/lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_interceptors_vfork.S.o:(vfork)
clang-9: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

The full log can be seen here

Thanks, I'll fix it in a moment.

r355064 should do this.

And D58755 to make sure this never happens again.

r355064 should do this.

That did it, thanks for a quick fix!

Hahnfeld added inline comments.
lib/hwasan/hwasan.cpp
491

This fails test/hwasan/TestCases/Linux/vfork.c for me with ulimit -s unlimited (or anything larger than ulimit -s 131072). What's the best solution here?

eugenis marked an inline comment as done.Feb 28 2019, 12:46 PM
eugenis added inline comments.
lib/hwasan/hwasan.cpp
491

Thanks for bringing this up!
I've removed the failing check in https://reviews.llvm.org/rL355137

Hahnfeld marked an inline comment as done.Mar 1 2019, 3:27 AM
Hahnfeld added inline comments.
lib/hwasan/hwasan.cpp
491

Thanks for your fast fix, it also works for me now :-)