Skip to content

Commit 620d516

Browse files
committed
[Runtime] Fix MultiPayloadEnumFN case in swift_resolve_resilientAccessors
rdar://112825968 Offsets were wrong, causing invalid memory accesses
1 parent 25b1986 commit 620d516

File tree

2 files changed

+12
-7
lines changed

2 files changed

+12
-7
lines changed

stdlib/public/runtime/BytecodeLayouts.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,9 +1011,9 @@ void swift::swift_resolve_resilientAccessors(uint8_t *layoutStr,
10111011
const uint8_t *fieldLayoutStr,
10121012
const Metadata *fieldType) {
10131013
LayoutStringWriter writer{layoutStr, layoutStrOffset};
1014-
LayoutStringReader reader{fieldLayoutStr, layoutStringHeaderSize};
1014+
LayoutStringReader reader{fieldLayoutStr, 0};
10151015
while (true) {
1016-
size_t currentOffset = reader.offset;
1016+
size_t currentOffset = reader.offset + layoutStringHeaderSize;
10171017
uint64_t size = reader.readBytes<uint64_t>();
10181018
RefCountingKind tag = (RefCountingKind)(size >> 56);
10191019
size &= ~(0xffULL << 56);
@@ -1075,11 +1075,14 @@ void swift::swift_resolve_resilientAccessors(uint8_t *layoutStr,
10751075
writer.writeBytes(getEnumTag);
10761076

10771077
size_t numCases = reader.readBytes<size_t>();
1078-
// skip ref count bytes
1078+
auto refCountBytes = reader.readBytes<size_t>();
1079+
1080+
// skip enum size
10791081
reader.skip(sizeof(size_t));
10801082

1081-
size_t casesBeginOffset =
1082-
layoutStrOffset + reader.offset + (numCases * sizeof(size_t));
1083+
size_t casesBeginOffset = layoutStrOffset + reader.offset +
1084+
layoutStringHeaderSize +
1085+
(numCases * sizeof(size_t));
10831086

10841087
for (size_t j = 0; j < numCases; j++) {
10851088
size_t caseOffset = reader.readBytes<size_t>();
@@ -1090,6 +1093,7 @@ void swift::swift_resolve_resilientAccessors(uint8_t *layoutStr,
10901093
casesBeginOffset + caseOffset,
10911094
caseLayoutString, fieldType);
10921095
}
1096+
reader.skip(refCountBytes);
10931097
break;
10941098
}
10951099

stdlib/public/runtime/Metadata.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2822,8 +2822,9 @@ void swift::_swift_addRefCountStringForMetatype(LayoutStringWriter &writer,
28222822
reader.layoutStr + layoutStringHeaderSize, fieldRefCountBytes);
28232823

28242824
if (fieldFlags & LayoutStringFlags::HasRelativePointers) {
2825-
swift_resolve_resilientAccessors(writer.layoutStr, writer.offset,
2826-
reader.layoutStr, fieldType);
2825+
swift_resolve_resilientAccessors(
2826+
writer.layoutStr, writer.offset,
2827+
reader.layoutStr + layoutStringHeaderSize, fieldType);
28272828
}
28282829

28292830
if (offset) {

0 commit comments

Comments
 (0)