Skip to content

Commit 37c6414

Browse files
authored
Fix usage of uninitialized memory in swift_addNewDSOImage. (#26275)
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 5b4cd81 commit 37c6414

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
@@ -249,8 +249,8 @@ static void _forEachTypeMetadataSectionAfter(
249249
}
250250
}
251251

252-
void swift::addImageTypeMetadataRecordBlockCallback(const void *records,
253-
uintptr_t recordsSize) {
252+
void swift::addImageTypeMetadataRecordBlockCallbackUnsafe(
253+
const void *records, uintptr_t recordsSize) {
254254
assert(recordsSize % sizeof(TypeMetadataRecord) == 0
255255
&& "weird-sized type metadata section?!");
256256

@@ -269,6 +269,12 @@ void swift::addImageTypeMetadataRecordBlockCallback(const void *records,
269269
recordsBegin, recordsEnd);
270270
}
271271

272+
void swift::addImageTypeMetadataRecordBlockCallback(const void *records,
273+
uintptr_t recordsSize) {
274+
TypeMetadataRecords.get();
275+
addImageTypeMetadataRecordBlockCallbackUnsafe(records, recordsSize);
276+
}
277+
272278
void
273279
swift::swift_registerTypeMetadataRecords(const TypeMetadataRecord *begin,
274280
const TypeMetadataRecord *end) {
@@ -831,8 +837,8 @@ _registerProtocols(ProtocolMetadataPrivateState &C,
831837
C.SectionsToScan.push_back(ProtocolSection{begin, end});
832838
}
833839

834-
void swift::addImageProtocolsBlockCallback(const void *protocols,
835-
uintptr_t protocolsSize) {
840+
void swift::addImageProtocolsBlockCallbackUnsafe(const void *protocols,
841+
uintptr_t protocolsSize) {
836842
assert(protocolsSize % sizeof(ProtocolRecord) == 0 &&
837843
"protocols section not a multiple of ProtocolRecord");
838844

@@ -848,6 +854,12 @@ void swift::addImageProtocolsBlockCallback(const void *protocols,
848854
recordsBegin, recordsEnd);
849855
}
850856

857+
void swift::addImageProtocolsBlockCallback(const void *protocols,
858+
uintptr_t protocolsSize) {
859+
Protocols.get();
860+
addImageProtocolsBlockCallbackUnsafe(protocols, protocolsSize);
861+
}
862+
851863
void swift::swift_registerProtocols(const ProtocolRecord *begin,
852864
const ProtocolRecord *end) {
853865
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)