Skip to content

Commit a70e606

Browse files
authored
Fix an OOB read in the demangler (#31793)
A malformed mangled name that ends in a truncated symbolic reference could trigger a read beyond the end of the name. This is because the code that grabs the next four bytes bypasses the existing bounds checks. Insert an explicit bounds check to guard against this.
1 parent ed17e9d commit a70e606

File tree

2 files changed

+7
-6
lines changed

2 files changed

+7
-6
lines changed

include/swift/Demangling/Demangler.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -565,8 +565,7 @@ class Demangler : public NodeFactory {
565565
NodePointer demangleValueWitness();
566566

567567
NodePointer demangleTypeMangling();
568-
NodePointer demangleSymbolicReference(unsigned char rawKind,
569-
const void *at);
568+
NodePointer demangleSymbolicReference(unsigned char rawKind);
570569

571570
bool demangleBoundGenerics(Vector<NodePointer> &TypeListList,
572571
NodePointer &RetroactiveConformances);

lib/Demangling/Demangler.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -677,12 +677,14 @@ NodePointer Demangler::demangleTypeMangling() {
677677
return TypeMangling;
678678
}
679679

680-
NodePointer Demangler::demangleSymbolicReference(unsigned char rawKind,
681-
const void *at) {
680+
NodePointer Demangler::demangleSymbolicReference(unsigned char rawKind) {
682681
// The symbolic reference is a 4-byte machine integer encoded in the following
683682
// four bytes.
683+
if (Pos + 4 > Text.size())
684+
return nullptr;
685+
const void *at = Text.data() + Pos;
684686
int32_t value;
685-
memcpy(&value, Text.data() + Pos, 4);
687+
memcpy(&value, at, 4);
686688
Pos += 4;
687689

688690
// Map the encoded kind to a specific kind and directness.
@@ -734,7 +736,7 @@ NodePointer Demangler::demangleOperator() {
734736
goto recur;
735737
case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
736738
case 9: case 0xA: case 0xB: case 0xC:
737-
return demangleSymbolicReference((unsigned char)c, Text.data() + Pos);
739+
return demangleSymbolicReference((unsigned char)c);
738740
case 'A': return demangleMultiSubstitutions();
739741
case 'B': return demangleBuiltinType();
740742
case 'C': return demangleAnyGenericType(Node::Kind::Class);

0 commit comments

Comments
 (0)