@@ -96,6 +96,60 @@ struct RecordsTests {
9696 _ = try name. appendBuffer ( & buffer, offset: 0 )
9797 }
9898 }
99+
100+ @Test ( " Lowercase labels on init " )
101+ func lowercaseLabelsOnInit( ) {
102+ let name = DNSName ( " EXAMPLE.COM " )
103+ #expect( name. labels == [ " example " , " com " ] )
104+ }
105+
106+ @Test ( " Lowercase labels on init with trailing dot " )
107+ func lowercaseLabelsOnInitTrailingDot( ) {
108+ let name = DNSName ( " Example.Com. " )
109+ #expect( name. labels == [ " example " , " com " ] )
110+ }
111+
112+ @Test ( " Lowercase labels from wire format " )
113+ func lowercaseLabelsFromWire( ) throws {
114+ // Wire-encode "EXAMPLE.COM" with uppercase bytes, then decode
115+ let upper = DNSName ( labels: [ " EXAMPLE " , " COM " ] )
116+ var buffer = [ UInt8] ( repeating: 0 , count: 64 )
117+ _ = try upper. appendBuffer ( & buffer, offset: 0 )
118+
119+ var parsed = DNSName ( )
120+ _ = try parsed. bindBuffer ( & buffer, offset: 0 )
121+ #expect( parsed. labels == [ " example " , " com " ] )
122+ }
123+
124+ @Test ( " Reject forward compression pointer " )
125+ func rejectForwardCompressionPointer( ) throws {
126+ // Craft a packet with a forward compression pointer at offset 12 pointing to offset 20
127+ // Header (12 bytes) + pointer bytes
128+ var buffer = [ UInt8] ( repeating: 0 , count: 32 )
129+ // At offset 0: compression pointer to offset 20 (forward)
130+ buffer [ 0 ] = 0xC0
131+ buffer [ 1 ] = 0x14 // points to offset 20, which is > 0
132+
133+ #expect( throws: DNSBindError . self) {
134+ var b = buffer
135+ var name = DNSName ( )
136+ _ = try name. bindBuffer ( & b, offset: 0 )
137+ }
138+ }
139+
140+ @Test ( " Reject self-referential compression pointer " )
141+ func rejectSelfReferentialCompressionPointer( ) throws {
142+ var buffer = [ UInt8] ( repeating: 0 , count: 16 )
143+ // At offset 0: compression pointer pointing back to offset 0 (same location)
144+ buffer [ 0 ] = 0xC0
145+ buffer [ 1 ] = 0x00 // points to offset 0 == current offset, not prior
146+
147+ #expect( throws: DNSBindError . self) {
148+ var b = buffer
149+ var name = DNSName ( )
150+ _ = try name. bindBuffer ( & b, offset: 0 )
151+ }
152+ }
99153 }
100154
101155 // MARK: - Question Tests
0 commit comments