Skip to content

Commit bcc309e

Browse files
[Runtime] Memset Extradata fully before copy from pattern.
The third argument of memset needs a size in *bytes* not words.
1 parent ea56a63 commit bcc309e

File tree

3 files changed

+7
-1
lines changed

3 files changed

+7
-1
lines changed

include/swift/ABI/Metadata.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3224,6 +3224,8 @@ class TargetGenericMetadataPatternTrailingObjects :
32243224
/// metadata header (e.g. after the last members declared in StructMetadata).
32253225
/// In class metadata, this section is relative to the end of the entire
32263226
/// class metadata.
3227+
///
3228+
/// See also: [pre-5.2-extra-data-zeroing]
32273229
const GenericMetadataPartialPattern *getExtraDataPattern() const {
32283230
assert(asSelf()->hasExtraDataPattern());
32293231
return this->template getTrailingObjects<GenericMetadataPartialPattern>();

lib/IRGen/GenMeta.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2225,6 +2225,7 @@ namespace {
22252225
void layout() {
22262226
asImpl().layoutHeader();
22272227

2228+
// See also: [pre-5.2-extra-data-zeroing]
22282229
if (asImpl().hasExtraDataPattern()) {
22292230
asImpl().addExtraDataPattern();
22302231
}

stdlib/public/runtime/Metadata.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,10 @@ initializeClassMetadataFromPattern(ClassMetadata *metadata,
404404
auto extraDataPattern = pattern->getExtraDataPattern();
405405

406406
// Zero memory up to the offset.
407-
memset(metadataExtraData, 0, size_t(extraDataPattern->OffsetInWords));
407+
// [pre-5.2-extra-data-zeroing] Before Swift 5.2, the runtime did not
408+
// correctly zero the zero-prefix of the extra-data pattern.
409+
memset(metadataExtraData, 0,
410+
size_t(extraDataPattern->OffsetInWords) * sizeof(void *));
408411

409412
// Copy the pattern into the rest of the extra data.
410413
copyMetadataPattern(metadataExtraData, extraDataPattern);

0 commit comments

Comments
 (0)