Skip to content

Commit f278447

Browse files
authored
Fix an OOB read in the demangler (swiftlang#31793) (swiftlang#31973)
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 3656afe commit f278447

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
@@ -564,8 +564,7 @@ class Demangler : public NodeFactory {
564564
NodePointer demangleValueWitness();
565565

566566
NodePointer demangleTypeMangling();
567-
NodePointer demangleSymbolicReference(unsigned char rawKind,
568-
const void *at);
567+
NodePointer demangleSymbolicReference(unsigned char rawKind);
569568

570569
bool demangleBoundGenerics(Vector<NodePointer> &TypeListList,
571570
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)