-
Notifications
You must be signed in to change notification settings - Fork 13.5k
Reland "[scudo] Apply filling when realloc shrinks and re-grows a block in-place" #95838
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
…ck in-place" Reland of llvm#93212, which has been reverted in commit bddd8ea.
@llvm/pr-subscribers-compiler-rt-sanitizer Author: Fabio D'Urso (fabio-d) ChangesReland of #93212, which has been reverted in Full diff: https://github.com/llvm/llvm-project/pull/95838.diff 2 Files Affected:
diff --git a/compiler-rt/lib/scudo/standalone/combined.h b/compiler-rt/lib/scudo/standalone/combined.h
index f9ed36581f8d3..73da686287747 100644
--- a/compiler-rt/lib/scudo/standalone/combined.h
+++ b/compiler-rt/lib/scudo/standalone/combined.h
@@ -565,6 +565,20 @@ class Allocator {
storeSecondaryAllocationStackMaybe(Options, OldPtr, NewSize);
}
}
+
+ // If we have reduced the size, set the extra bytes to the fill value
+ // so that we are ready to grow it again in the future.
+ if (NewSize < OldSize) {
+ const FillContentsMode FillContents =
+ TSDRegistry.getDisableMemInit() ? NoFill
+ : Options.getFillContentsMode();
+ if (FillContents != NoFill) {
+ memset(reinterpret_cast<char *>(OldTaggedPtr) + NewSize,
+ FillContents == ZeroFill ? 0 : PatternFillByte,
+ OldSize - NewSize);
+ }
+ }
+
return OldTaggedPtr;
}
}
diff --git a/compiler-rt/lib/scudo/standalone/tests/combined_test.cpp b/compiler-rt/lib/scudo/standalone/tests/combined_test.cpp
index 1a36155bcd423..655dc87cbac64 100644
--- a/compiler-rt/lib/scudo/standalone/tests/combined_test.cpp
+++ b/compiler-rt/lib/scudo/standalone/tests/combined_test.cpp
@@ -447,19 +447,32 @@ SCUDO_TYPED_TEST(ScudoCombinedDeathTest, ReallocateSame) {
// returns the same chunk. This requires that all the sizes we iterate on use
// the same block size, but that should be the case for MaxSize - 64 with our
// default class size maps.
- constexpr scudo::uptr ReallocSize =
+ constexpr scudo::uptr InitialSize =
TypeParam::Primary::SizeClassMap::MaxSize - 64;
- void *P = Allocator->allocate(ReallocSize, Origin);
const char Marker = 'A';
- memset(P, Marker, ReallocSize);
+ Allocator->setFillContents(scudo::PatternOrZeroFill);
+
+ void *P = Allocator->allocate(InitialSize, Origin);
+ scudo::uptr CurrentSize = InitialSize;
for (scudo::sptr Delta = -32; Delta < 32; Delta += 8) {
+ memset(P, Marker, CurrentSize);
const scudo::uptr NewSize =
- static_cast<scudo::uptr>(static_cast<scudo::sptr>(ReallocSize) + Delta);
+ static_cast<scudo::uptr>(static_cast<scudo::sptr>(InitialSize) + Delta);
void *NewP = Allocator->reallocate(P, NewSize);
EXPECT_EQ(NewP, P);
- for (scudo::uptr I = 0; I < ReallocSize - 32; I++)
+
+ // Verify that existing contents have been preserved.
+ for (scudo::uptr I = 0; I < scudo::Min(CurrentSize, NewSize); I++)
EXPECT_EQ((reinterpret_cast<char *>(NewP))[I], Marker);
+
+ // Verify that new bytes are set according to FillContentsMode.
+ for (scudo::uptr I = CurrentSize; I < NewSize; I++) {
+ EXPECT_EQ((reinterpret_cast<unsigned char *>(NewP))[I],
+ scudo::PatternFillByte);
+ }
+
checkMemoryTaggingMaybe(Allocator, NewP, NewSize, 0);
+ CurrentSize = NewSize;
}
Allocator->deallocate(P, Origin);
}
|
Co-authored-by: ChiaHungDuan <[email protected]>
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/101/builds/287 Here is the relevant piece of the build log for the reference:
|
…ck in-place" (llvm#95838) Reland of llvm#93212, which had been reverted in commit bddd8ea.
Reland of #93212, which has been reverted in
commit bddd8ea.