diff options
author | Jakob Kummerow <jkummerow@chromium.org> | 2014-12-03 10:40:41 +0100 |
---|---|---|
committer | Jakob Kummerow <jkummerow@chromium.org> | 2014-12-03 09:40:50 +0000 |
commit | 887005895a11123fdc0d4c3b2e8e53cc8dd7c27a (patch) | |
tree | aa6282a6579c7d0a8cd9079e98fedba8e88ec945 | |
parent | d2f16971bdcc2899e0939815005f43253e3e7410 (diff) | |
download | v8-887005895a11123fdc0d4c3b2e8e53cc8dd7c27a.tar.gz |
Version 3.30.33.8 (cherry-pick)
Merged 65f4716b3fe8ccbb879e11312b565f6cc3a85fab
Handle store buffer slot overwrite during object promotion.
R=jarin@chromium.org
BUG=
Review URL: https://codereview.chromium.org/774153002
Cr-Commit-Position: refs/branch-heads/3.30@{#25262}
-rw-r--r-- | src/heap/heap.cc | 12 | ||||
-rw-r--r-- | src/version.cc | 2 |
2 files changed, 12 insertions, 2 deletions
diff --git a/src/heap/heap.cc b/src/heap/heap.cc index 5c8cd4528..c4eed9ce2 100644 --- a/src/heap/heap.cc +++ b/src/heap/heap.cc @@ -2038,7 +2038,17 @@ class ScavengingVisitor : public StaticVisitorBase { // Order is important: slot might be inside of the target if target // was allocated over a dead object and slot comes from the store // buffer. - *slot = target; + + // Unfortunately, the allocation can also write over the slot if the slot + // was in free space and the allocation wrote free list data (such as the + // free list map or entry size) over the slot. We guard against this by + // checking that the slot still points to the object being moved. This + // should be sufficient because neither the free list map nor the free + // list entry size should look like a new space pointer (the former is an + // old space pointer, the latter is word-aligned). + if (*slot == object) { + *slot = target; + } MigrateObject(heap, object, target, object_size); if (object_contents == POINTER_OBJECT) { diff --git a/src/version.cc b/src/version.cc index 258d7593c..0e3a188f5 100644 --- a/src/version.cc +++ b/src/version.cc @@ -35,7 +35,7 @@ #define MAJOR_VERSION 3 #define MINOR_VERSION 30 #define BUILD_NUMBER 33 -#define PATCH_LEVEL 7 +#define PATCH_LEVEL 8 // Use 1 for candidates and 0 otherwise. // (Boolean macro values are not supported by all preprocessors.) #define IS_CANDIDATE_VERSION 0 |