[asan] Read extra flags from a system property on activation on Android.

llvm-svn: 200550
This commit is contained in:
Evgeniy Stepanov 2014-01-31 14:36:55 +00:00
parent 36b18dfe64
commit 01cd8ae204
5 changed files with 27 additions and 0 deletions

View File

@ -57,6 +57,8 @@ void AsanActivate() {
common_flags()->malloc_context_size = common_flags()->malloc_context_size =
asan_deactivated_flags.malloc_context_size; asan_deactivated_flags.malloc_context_size;
ParseExtraActivationFlags();
asan_is_deactivated = false; asan_is_deactivated = false;
VReport( VReport(
1, 1,

View File

@ -87,6 +87,8 @@ void PlatformTSDDtor(void *tsd);
void AppendToErrorMessageBuffer(const char *buffer); void AppendToErrorMessageBuffer(const char *buffer);
void ParseExtraActivationFlags();
// Platfrom-specific options. // Platfrom-specific options.
#if SANITIZER_MAC #if SANITIZER_MAC
bool PlatformHasDifferentMemcpyAndMemmove(); bool PlatformHasDifferentMemcpyAndMemmove();

View File

@ -209,6 +209,17 @@ void InitializeFlags(Flags *f, const char *env) {
} }
} }
// Parse flags that may change between startup and activation.
// On Android they come from a system property.
// On other platforms this is no-op.
void ParseExtraActivationFlags() {
char buf[100];
GetExtraActivationFlags(buf, sizeof(buf));
ParseFlagsFromString(flags(), buf);
if (buf[0] != '\0')
VReport(1, "Extra activation flags: %s\n", buf);
}
// -------------------------- Globals --------------------- {{{1 // -------------------------- Globals --------------------- {{{1
int asan_inited; int asan_inited;
bool asan_init_is_running; bool asan_init_is_running;
@ -413,6 +424,10 @@ static void AsanInitInternal() {
// initialization steps look at flags(). // initialization steps look at flags().
const char *options = GetEnv("ASAN_OPTIONS"); const char *options = GetEnv("ASAN_OPTIONS");
InitializeFlags(flags(), options); InitializeFlags(flags(), options);
if (!flags()->start_deactivated)
ParseExtraActivationFlags();
__sanitizer_set_report_path(common_flags()->log_path); __sanitizer_set_report_path(common_flags()->log_path);
__asan_option_detect_stack_use_after_return = __asan_option_detect_stack_use_after_return =
flags()->detect_stack_use_after_return; flags()->detect_stack_use_after_return;

View File

@ -506,8 +506,10 @@ F IndirectExternCall(F f) {
#if SANITIZER_ANDROID #if SANITIZER_ANDROID
void AndroidLogWrite(const char *buffer); void AndroidLogWrite(const char *buffer);
void GetExtraActivationFlags(char *buf, uptr size);
#else #else
INLINE void AndroidLogWrite(const char *buffer_unused) {} INLINE void AndroidLogWrite(const char *buffer_unused) {}
INLINE void GetExtraActivationFlags(char *buf, uptr size) { *buf = '\0'; }
#endif #endif
} // namespace __sanitizer } // namespace __sanitizer

View File

@ -51,6 +51,7 @@
#if SANITIZER_ANDROID #if SANITIZER_ANDROID
#include <android/log.h> #include <android/log.h>
#include <sys/system_properties.h>
#endif #endif
// <linux/time.h> // <linux/time.h>
@ -697,6 +698,11 @@ uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
void AndroidLogWrite(const char *buffer) { void AndroidLogWrite(const char *buffer) {
__android_log_write(ANDROID_LOG_INFO, NULL, buffer); __android_log_write(ANDROID_LOG_INFO, NULL, buffer);
} }
void GetExtraActivationFlags(char *buf, uptr size) {
CHECK(size > PROP_VALUE_MAX);
__system_property_get("asan.options", buf);
}
#endif #endif
bool IsDeadlySignal(int signum) { bool IsDeadlySignal(int signum) {