Skip to content

Commit cdf945d

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

File tree

2 files changed

+10
-5
lines changed

2 files changed

+10
-5
lines changed

stdlib/public/runtime/BytecodeLayouts.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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)