diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2024-06-28 13:31:00 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2024-06-28 12:16:25 +0000 |
| commit | 7c9e8492e6c7882c495b29c53e078327c2a23de5 (patch) | |
| tree | d6c25de8118e3c3d0acd041ea003b9f5f9ad0f13 /executor | |
| parent | 2081f66ad07722ba9a808fa4f0d2ced2822950f7 (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.cc | 2 | ||||
| -rw-r--r-- | executor/executor_test.h | 3 |
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) |
