summaryrefslogtreecommitdiff
path: root/lib/sanitizer_common/sanitizer_quarantine.h
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2016-04-14 09:52:33 +0000
committerDmitry Vyukov <dvyukov@google.com>2016-04-14 09:52:33 +0000
commitefe2dceaeff6d238ba258640b17e5847848bbe60 (patch)
treedc46d4c2a2ef0912aba7f1ae30ad2f19a45c2215 /lib/sanitizer_common/sanitizer_quarantine.h
parent069018ca7afd04b1ca67d2311241c92d8878ff65 (diff)
asan: fix out-of-bounds access in quarantine
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@266288 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_quarantine.h')
-rw-r--r--lib/sanitizer_common/sanitizer_quarantine.h6
1 files changed, 4 insertions, 2 deletions
diff --git a/lib/sanitizer_common/sanitizer_quarantine.h b/lib/sanitizer_common/sanitizer_quarantine.h
index 9e0bf2d18..095c80654 100644
--- a/lib/sanitizer_common/sanitizer_quarantine.h
+++ b/lib/sanitizer_common/sanitizer_quarantine.h
@@ -101,10 +101,12 @@ class Quarantine {
void NOINLINE DoRecycle(Cache *c, Callback cb) {
while (QuarantineBatch *b = c->DequeueBatch()) {
const uptr kPrefetch = 16;
+ COMPILER_CHECK(kPrefetch <= ARRAY_SIZE(b->batch));
for (uptr i = 0; i < kPrefetch; i++)
PREFETCH(b->batch[i]);
- for (uptr i = 0; i < b->count; i++) {
- PREFETCH(b->batch[i + kPrefetch]);
+ for (uptr i = 0, count = b->count; i < count; i++) {
+ if (i + kPrefetch < count)
+ PREFETCH(b->batch[i + kPrefetch]);
cb.Recycle((Node*)b->batch[i]);
}
cb.Deallocate(b);