@@ -447,19 +447,32 @@ SCUDO_TYPED_TEST(ScudoCombinedDeathTest, ReallocateSame) {
447
447
// returns the same chunk. This requires that all the sizes we iterate on use
448
448
// the same block size, but that should be the case for MaxSize - 64 with our
449
449
// default class size maps.
450
- constexpr scudo::uptr ReallocSize =
450
+ constexpr scudo::uptr InitialSize =
451
451
TypeParam::Primary::SizeClassMap::MaxSize - 64 ;
452
- void *P = Allocator->allocate (ReallocSize, Origin);
453
452
const char Marker = ' A' ;
454
- memset (P, Marker, ReallocSize);
453
+ Allocator->setFillContents (scudo::PatternOrZeroFill);
454
+
455
+ void *P = Allocator->allocate (InitialSize, Origin);
456
+ scudo::uptr CurrentSize = InitialSize;
455
457
for (scudo::sptr Delta = -32 ; Delta < 32 ; Delta += 8 ) {
458
+ memset (P, Marker, CurrentSize);
456
459
const scudo::uptr NewSize =
457
- static_cast <scudo::uptr>(static_cast <scudo::sptr>(ReallocSize ) + Delta);
460
+ static_cast <scudo::uptr>(static_cast <scudo::sptr>(InitialSize ) + Delta);
458
461
void *NewP = Allocator->reallocate (P, NewSize);
459
462
EXPECT_EQ (NewP, P);
460
- for (scudo::uptr I = 0 ; I < ReallocSize - 32 ; I++)
463
+
464
+ // Verify that existing contents have been preserved.
465
+ for (scudo::uptr I = 0 ; I < scudo::Min (CurrentSize, NewSize); I++)
461
466
EXPECT_EQ ((reinterpret_cast <char *>(NewP))[I], Marker);
467
+
468
+ // Verify that new bytes are set according to FillContentsMode.
469
+ for (scudo::uptr I = CurrentSize; I < NewSize; I++) {
470
+ unsigned char V = (reinterpret_cast <unsigned char *>(NewP))[I];
471
+ EXPECT_TRUE (V == scudo::PatternFillByte || V == 0 );
472
+ }
473
+
462
474
checkMemoryTaggingMaybe (Allocator, NewP, NewSize, 0 );
475
+ CurrentSize = NewSize;
463
476
}
464
477
Allocator->deallocate (P, Origin);
465
478
}
0 commit comments