Skip to content

Commit ca33b18

Browse files
committed
Fix usage of uninitialized memory in swift_addNewDSOImage.
This should address https://bugs.swift.org/browse/SR-6848. Couldn't transform the unsafeGet to get because it would produce an infinite loop.
1 parent b4ce18a commit ca33b18

File tree

7 files changed

+48
-27
lines changed

7 files changed

+48
-27
lines changed

stdlib/public/runtime/ImageInspection.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,15 @@ void initializeDynamicReplacementLookup();
7676

7777
// Callbacks to register metadata from an image to the runtime.
7878
void addImageProtocolsBlockCallback(const void *start, uintptr_t size);
79+
void addImageProtocolsBlockCallbackUnsafe(const void *start, uintptr_t size);
7980
void addImageProtocolConformanceBlockCallback(const void *start,
8081
uintptr_t size);
82+
void addImageProtocolConformanceBlockCallbackUnsafe(const void *start,
83+
uintptr_t size);
8184
void addImageTypeMetadataRecordBlockCallback(const void *start,
8285
uintptr_t size);
86+
void addImageTypeMetadataRecordBlockCallbackUnsafe(const void *start,
87+
uintptr_t size);
8388
void addImageDynamicReplacementBlockCallback(const void *start, uintptr_t size,
8489
const void *start2,
8590
uintptr_t size2);

stdlib/public/runtime/ImageInspectionCOFF.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ void swift::initializeProtocolLookup() {
4848
const swift::MetadataSections::Range &protocols =
4949
sections->swift5_protocols;
5050
if (protocols.length)
51-
addImageProtocolsBlockCallback(reinterpret_cast<void *>(protocols.start),
52-
protocols.length);
51+
addImageProtocolsBlockCallbackUnsafe(
52+
reinterpret_cast<void *>(protocols.start), protocols.length);
5353

5454
if (sections->next == registered)
5555
break;
@@ -63,8 +63,8 @@ void swift::initializeProtocolConformanceLookup() {
6363
const swift::MetadataSections::Range &conformances =
6464
sections->swift5_protocol_conformances;
6565
if (conformances.length)
66-
addImageProtocolConformanceBlockCallback(reinterpret_cast<void *>(conformances.start),
67-
conformances.length);
66+
addImageProtocolConformanceBlockCallbackUnsafe(
67+
reinterpret_cast<void *>(conformances.start), conformances.length);
6868

6969
if (sections->next == registered)
7070
break;
@@ -78,8 +78,8 @@ void swift::initializeTypeMetadataRecordLookup() {
7878
const swift::MetadataSections::Range &type_metadata =
7979
sections->swift5_type_metadata;
8080
if (type_metadata.length)
81-
addImageTypeMetadataRecordBlockCallback(reinterpret_cast<void *>(type_metadata.start),
82-
type_metadata.length);
81+
addImageTypeMetadataRecordBlockCallbackUnsafe(
82+
reinterpret_cast<void *>(type_metadata.start), type_metadata.length);
8383

8484
if (sections->next == registered)
8585
break;

stdlib/public/runtime/ImageInspectionELF.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ void swift::initializeProtocolLookup() {
4848
const swift::MetadataSections::Range &protocols =
4949
sections->swift5_protocols;
5050
if (protocols.length)
51-
addImageProtocolsBlockCallback(reinterpret_cast<void *>(protocols.start),
52-
protocols.length);
51+
addImageProtocolsBlockCallbackUnsafe(
52+
reinterpret_cast<void *>(protocols.start), protocols.length);
5353

5454
if (sections->next == registered)
5555
break;
@@ -62,8 +62,8 @@ void swift::initializeProtocolConformanceLookup() {
6262
const swift::MetadataSections::Range &conformances =
6363
sections->swift5_protocol_conformances;
6464
if (conformances.length)
65-
addImageProtocolConformanceBlockCallback(reinterpret_cast<void *>(conformances.start),
66-
conformances.length);
65+
addImageProtocolConformanceBlockCallbackUnsafe(
66+
reinterpret_cast<void *>(conformances.start), conformances.length);
6767

6868
if (sections->next == registered)
6969
break;
@@ -77,8 +77,8 @@ void swift::initializeTypeMetadataRecordLookup() {
7777
const swift::MetadataSections::Range &type_metadata =
7878
sections->swift5_type_metadata;
7979
if (type_metadata.length)
80-
addImageTypeMetadataRecordBlockCallback(reinterpret_cast<void *>(type_metadata.start),
81-
type_metadata.length);
80+
addImageTypeMetadataRecordBlockCallbackUnsafe(
81+
reinterpret_cast<void *>(type_metadata.start), type_metadata.length);
8282

8383
if (sections->next == registered)
8484
break;

stdlib/public/runtime/ImageInspectionMachO.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -133,20 +133,19 @@ void addImageCallback2Sections(const mach_header *mh, intptr_t vmaddr_slide) {
133133
#endif
134134

135135
void swift::initializeProtocolLookup() {
136-
REGISTER_FUNC(
137-
addImageCallback<TextSegment, ProtocolsSection,
138-
addImageProtocolsBlockCallback>);
136+
REGISTER_FUNC(addImageCallback<TextSegment, ProtocolsSection,
137+
addImageProtocolsBlockCallbackUnsafe>);
139138
}
140139

141140
void swift::initializeProtocolConformanceLookup() {
142141
REGISTER_FUNC(
143-
addImageCallback<TextSegment, ProtocolConformancesSection,
144-
addImageProtocolConformanceBlockCallback>);
142+
addImageCallback<TextSegment, ProtocolConformancesSection,
143+
addImageProtocolConformanceBlockCallbackUnsafe>);
145144
}
146145
void swift::initializeTypeMetadataRecordLookup() {
147146
REGISTER_FUNC(
148-
addImageCallback<TextSegment, TypeMetadataRecordSection,
149-
addImageTypeMetadataRecordBlockCallback>);
147+
addImageCallback<TextSegment, TypeMetadataRecordSection,
148+
addImageTypeMetadataRecordBlockCallbackUnsafe>);
150149
}
151150

152151
void swift::initializeDynamicReplacementLookup() {

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,8 @@ _registerTypeMetadataRecords(TypeMetadataPrivateState &T,
214214
T.SectionsToScan.push_back(TypeMetadataSection{begin, end});
215215
}
216216

217-
void swift::addImageTypeMetadataRecordBlockCallback(const void *records,
218-
uintptr_t recordsSize) {
217+
void swift::addImageTypeMetadataRecordBlockCallbackUnsafe(
218+
const void *records, uintptr_t recordsSize) {
219219
assert(recordsSize % sizeof(TypeMetadataRecord) == 0
220220
&& "weird-sized type metadata section?!");
221221

@@ -234,6 +234,12 @@ void swift::addImageTypeMetadataRecordBlockCallback(const void *records,
234234
recordsBegin, recordsEnd);
235235
}
236236

237+
void swift::addImageTypeMetadataRecordBlockCallback(const void *records,
238+
uintptr_t recordsSize) {
239+
TypeMetadataRecords.get();
240+
addImageTypeMetadataRecordBlockCallbackUnsafe(records, recordsSize);
241+
}
242+
237243
void
238244
swift::swift_registerTypeMetadataRecords(const TypeMetadataRecord *begin,
239245
const TypeMetadataRecord *end) {
@@ -694,8 +700,8 @@ _registerProtocols(ProtocolMetadataPrivateState &C,
694700
C.SectionsToScan.push_back(ProtocolSection{begin, end});
695701
}
696702

697-
void swift::addImageProtocolsBlockCallback(const void *protocols,
698-
uintptr_t protocolsSize) {
703+
void swift::addImageProtocolsBlockCallbackUnsafe(const void *protocols,
704+
uintptr_t protocolsSize) {
699705
assert(protocolsSize % sizeof(ProtocolRecord) == 0 &&
700706
"protocols section not a multiple of ProtocolRecord");
701707

@@ -711,6 +717,12 @@ void swift::addImageProtocolsBlockCallback(const void *protocols,
711717
recordsBegin, recordsEnd);
712718
}
713719

720+
void swift::addImageProtocolsBlockCallback(const void *protocols,
721+
uintptr_t protocolsSize) {
722+
Protocols.get();
723+
addImageProtocolsBlockCallbackUnsafe(protocols, protocolsSize);
724+
}
725+
714726
void swift::swift_registerProtocols(const ProtocolRecord *begin,
715727
const ProtocolRecord *end) {
716728
auto &C = Protocols.get();

stdlib/public/runtime/ProtocolConformance.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,8 +327,8 @@ _registerProtocolConformances(ConformanceState &C,
327327
C.SectionsToScan.push_back(ConformanceSection{begin, end});
328328
}
329329

330-
void swift::addImageProtocolConformanceBlockCallback(const void *conformances,
331-
uintptr_t conformancesSize) {
330+
void swift::addImageProtocolConformanceBlockCallbackUnsafe(
331+
const void *conformances, uintptr_t conformancesSize) {
332332
assert(conformancesSize % sizeof(ProtocolConformanceRecord) == 0 &&
333333
"conformances section not a multiple of ProtocolConformanceRecord");
334334

@@ -345,6 +345,13 @@ void swift::addImageProtocolConformanceBlockCallback(const void *conformances,
345345
recordsBegin, recordsEnd);
346346
}
347347

348+
void swift::addImageProtocolConformanceBlockCallback(
349+
const void *conformances, uintptr_t conformancesSize) {
350+
Conformances.get();
351+
addImageProtocolConformanceBlockCallbackUnsafe(conformances,
352+
conformancesSize);
353+
}
354+
348355
void
349356
swift::swift_registerProtocolConformances(const ProtocolConformanceRecord *begin,
350357
const ProtocolConformanceRecord *end){

test/Sanitizers/sanitizer_coverage.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
// REQUIRES: CPU=x86_64
1111
// UNSUPPORTED: remote_run
1212

13-
// XFAIL: linux
14-
1513
func sayHello() {
1614
print("Hello")
1715
}

0 commit comments

Comments
 (0)