summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/tsan/rtl/tsan_rtl_report.cc8
1 files changed, 5 insertions, 3 deletions
diff --git a/lib/tsan/rtl/tsan_rtl_report.cc b/lib/tsan/rtl/tsan_rtl_report.cc
index 0015c4bae..39ad2f9d3 100644
--- a/lib/tsan/rtl/tsan_rtl_report.cc
+++ b/lib/tsan/rtl/tsan_rtl_report.cc
@@ -399,6 +399,11 @@ void ReportRace(ThreadState *thr) {
Shadow s(thr->racy_state[i]);
RestoreStack(s.tid(), s.epoch(), &traces[i]);
}
+ // Failure to restore stack of the current thread
+ // was observed on free() interceptor called from pthread.
+ // Just get the current shadow stack instead.
+ if (traces[0].IsEmpty())
+ traces[0].ObtainCurrent(thr, 0);
if (HandleRacyStacks(thr, traces, addr_min, addr_max))
return;
@@ -408,9 +413,6 @@ void ReportRace(ThreadState *thr) {
rep.AddMemoryAccess(addr, s, &traces[i]);
}
- // Ensure that we have at least something for the current thread.
- DCHECK_EQ(traces[0].IsEmpty(), false);
-
for (uptr i = 0; i < kMop; i++) {
FastState s(thr->racy_state[i]);
ThreadContext *tctx = ctx->threads[s.tid()];