From 8ccc1ad0f71d0587edfbc4c637d6d8de196fe7df Mon Sep 17 00:00:00 2001 From: Andreas Gampe Date: Wed, 22 Jun 2016 20:05:59 -0700 Subject: [PATCH] Rootdir: Add more asan.options support Extend the asan.options file to read binary-specific configuration from files out of /system. For early services, the system image location is important as /data may not be available when they are started. Add a template that turns most sanitization off. At this point in time, it is, however, impossible to get to a zero overhead state after the fact. The template is meant to adapt a build after the fact, and work around issues with LOCAL_SANITIZE := never. Add a Make variable and rule copying the template to the path and name expected by ASAN. Add SANITIZE_LITE to automatically add a large set of options files. Bug: 29498013 Change-Id: I8e9e6929a55cee3f3fa0acb377a886bfa7006c91 --- rootdir/Android.mk | 69 ++++++++++++++++++++++++++++++- rootdir/asan.options | 1 + rootdir/asan.options.off.template | 7 ++++ 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 rootdir/asan.options.off.template diff --git a/rootdir/Android.mk b/rootdir/Android.mk index fd2b8b08c..94f5cb7fb 100644 --- a/rootdir/Android.mk +++ b/rootdir/Android.mk @@ -26,6 +26,7 @@ include $(BUILD_PREBUILT) ####################################### # asan.options ifneq ($(filter address,$(SANITIZE_TARGET)),) + include $(CLEAR_VARS) LOCAL_MODULE := asan.options @@ -34,6 +35,72 @@ LOCAL_SRC_FILES := $(LOCAL_MODULE) LOCAL_MODULE_PATH := $(TARGET_OUT) include $(BUILD_PREBUILT) + +# Modules for asan.options.X files. + +ASAN_OPTIONS_FILES := + +define create-asan-options-module +include $$(CLEAR_VARS) +LOCAL_MODULE := asan.options.$(1) +ASAN_OPTIONS_FILES += asan.options.$(1) +LOCAL_MODULE_CLASS := ETC +# The asan.options.off.template tries to turn off as much of ASAN as is possible. +LOCAL_SRC_FILES := asan.options.off.template +LOCAL_MODULE_PATH := $(TARGET_OUT) +include $$(BUILD_PREBUILT) +endef + +# Pretty comprehensive set of native services. This list is helpful if all that's to be checked is an +# app. +ifeq ($(SANITIZE_LITE),true) +SANITIZE_ASAN_OPTIONS_FOR := \ + adbd \ + ATFWD-daemon \ + audioserver \ + bridgemgrd \ + cameraserver \ + cnd \ + debuggerd \ + debuggerd64 \ + dex2oat \ + drmserver \ + fingerprintd \ + gatekeeperd \ + installd \ + keystore \ + lmkd \ + logcat \ + logd \ + lowi-server \ + media.codec \ + mediadrmserver \ + media.extractor \ + mediaserver \ + mm-qcamera-daemon \ + mpdecision \ + netmgrd \ + perfd \ + perfprofd \ + qmuxd \ + qseecomd \ + rild \ + sdcard \ + servicemanager \ + slim_daemon \ + surfaceflinger \ + thermal-engine \ + time_daemon \ + update_engine \ + vold \ + wpa_supplicant \ + zip +endif + +ifneq ($(SANITIZE_ASAN_OPTIONS_FOR),) + $(foreach binary, $(SANITIZE_ASAN_OPTIONS_FOR), $(eval $(call create-asan-options-module,$(binary)))) +endif + endif ####################################### @@ -47,7 +114,7 @@ LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT) EXPORT_GLOBAL_ASAN_OPTIONS := ifneq ($(filter address,$(SANITIZE_TARGET)),) EXPORT_GLOBAL_ASAN_OPTIONS := export ASAN_OPTIONS include=/system/asan.options - LOCAL_REQUIRED_MODULES := asan.options + LOCAL_REQUIRED_MODULES := asan.options $(ASAN_OPTIONS_FILES) endif # Put it here instead of in init.rc module definition, # because init.rc is conditionally included. diff --git a/rootdir/asan.options b/rootdir/asan.options index 43896a1ba..70e0ecaf9 100644 --- a/rootdir/asan.options +++ b/rootdir/asan.options @@ -3,3 +3,4 @@ detect_odr_violation=0 alloc_dealloc_mismatch=0 allocator_may_return_null=1 detect_container_overflow=0 +include_if_exists=/system/asan.options.%b diff --git a/rootdir/asan.options.off.template b/rootdir/asan.options.off.template new file mode 100644 index 000000000..59a12490a --- /dev/null +++ b/rootdir/asan.options.off.template @@ -0,0 +1,7 @@ +quarantine_size_mb=0 +max_redzone=16 +poison_heap=false +poison_partial=false +poison_array_cookie=false +alloc_dealloc_mismatch=false +new_delete_type_mismatch=false