aboutsummaryrefslogtreecommitdiffstats
path: root/executor
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2024-06-28 13:31:00 +0200
committerDmitry Vyukov <dvyukov@google.com>2024-06-28 12:16:25 +0000
commit7c9e8492e6c7882c495b29c53e078327c2a23de5 (patch)
treed6c25de8118e3c3d0acd041ea003b9f5f9ad0f13 /executor
parent2081f66ad07722ba9a808fa4f0d2ced2822950f7 (diff)
executor: don't trace PCs as comparisons
Currnetly we always write PCs into the buffer even if tracing comparisons. Such bogus data will fail comparison consistentcy checks (type/pc) and executor will crash. Don't trace PCs as comparisons.
Diffstat (limited to 'executor')
-rw-r--r--executor/executor.cc2
-rw-r--r--executor/executor_test.h3
2 files changed, 4 insertions, 1 deletions
diff --git a/executor/executor.cc b/executor/executor.cc
index cf80d7491..616e86752 100644
--- a/executor/executor.cc
+++ b/executor/executor.cc
@@ -340,6 +340,8 @@ struct cover_t {
uint32 mmap_alloc_size;
char* data;
char* data_end;
+ // Currently collecting comparisons.
+ bool collect_comps;
// Note: On everything but darwin the first value in data is the count of
// recorded PCs, followed by the PCs. We therefore set data_offset to the
// size of one PC.
diff --git a/executor/executor_test.h b/executor/executor_test.h
index 870dcb397..a5eda15d2 100644
--- a/executor/executor_test.h
+++ b/executor/executor_test.h
@@ -43,7 +43,7 @@ extern "C" notrace void __sanitizer_cov_trace_pc(void)
unsigned long ip = (unsigned long)__builtin_return_address(0);
// Convert to what is_kernel_pc will accept as valid coverage;
ip = kernel_text_start | (ip & kernel_text_mask);
- if (current_thread == nullptr || current_thread->cov.data == nullptr)
+ if (current_thread == nullptr || current_thread->cov.data == nullptr || current_thread->cov.collect_comps)
return;
unsigned long* start = (unsigned long*)current_thread->cov.data;
unsigned long* end = (unsigned long*)current_thread->cov.data_end;
@@ -61,6 +61,7 @@ static void cover_open(cover_t* cov, bool extra)
static void cover_enable(cover_t* cov, bool collect_comps, bool extra)
{
+ cov->collect_comps = collect_comps;
}
static void cover_reset(cover_t* cov)