diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2016-04-14 09:52:33 +0000 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@google.com> | 2016-04-14 09:52:33 +0000 |
commit | efe2dceaeff6d238ba258640b17e5847848bbe60 (patch) | |
tree | dc46d4c2a2ef0912aba7f1ae30ad2f19a45c2215 /lib/sanitizer_common/sanitizer_quarantine.h | |
parent | 069018ca7afd04b1ca67d2311241c92d8878ff65 (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.h | 6 |
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); |