Skip to content

Commit 91d547f

Browse files
authored
[Runtime] Properly handle unaligned reads in readTagBytes for layout strings (#66506)
1 parent 24e3fe0 commit 91d547f

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

stdlib/public/runtime/BytecodeLayouts.cpp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -182,12 +182,21 @@ static uint64_t readTagBytes(uint8_t *addr, uint8_t byteCount) {
182182
switch (byteCount) {
183183
case 1:
184184
return addr[0];
185-
case 2:
186-
return ((uint16_t *)addr)[0];
187-
case 4:
188-
return ((uint32_t *)addr)[0];
189-
case 8:
190-
return ((uint64_t *)addr)[0];
185+
case 2: {
186+
uint16_t res = 0;
187+
memcpy(&res, addr, sizeof(uint16_t));
188+
return res;
189+
}
190+
case 4: {
191+
uint32_t res = 0;
192+
memcpy(&res, addr, sizeof(uint32_t));
193+
return res;
194+
}
195+
case 8: {
196+
uint64_t res = 0;
197+
memcpy(&res, addr, sizeof(uint64_t));
198+
return res;
199+
}
191200
default:
192201
swift_unreachable("Unsupported tag byte length.");
193202
}
@@ -608,7 +617,8 @@ void swift::swift_resolve_resilientAccessors(uint8_t *layoutStr,
608617
writeBytes(layoutStr, writeOffset, getEnumTag);
609618

610619
size_t numCases = readBytes<size_t>(fieldLayoutStr, i);
611-
size_t refCountBytes = readBytes<size_t>(fieldLayoutStr, i);
620+
// skip ref count bytes
621+
i += sizeof(size_t);
612622

613623
size_t casesBeginOffset =
614624
layoutStrOffset + i + (numCases * sizeof(size_t));

0 commit comments

Comments
 (0)