MCPcopy Create free account
hub / github.com/ddnet/ddnet / StunMessageParse

Function StunMessageParse

src/engine/shared/stun.cpp:35–158  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

33}
34
35bool StunMessageParse(const unsigned char *pMessage, size_t MessageSize, const CStunData *pData, bool *pSuccess, NETADDR *pAddr)
36{
37 *pSuccess = false;
38 mem_zero(pAddr, sizeof(*pAddr));
39 if(MessageSize < 20)
40 {
41 return true;
42 }
43 bool Parsed = true;
44 // STUN Success/Error Response Type 1: Binding
45 Parsed = Parsed && pMessage[0] == 0x01 && (pMessage[1] == 0x01 || pMessage[1] == 0x11);
46 uint16_t MessageLength = (pMessage[2] << 8) | pMessage[3];
47 Parsed = Parsed && MessageSize >= 20 + (size_t)MessageLength && MessageLength % 4 == 0;
48 // Magic Cookie: 0x2112A442
49 Parsed = Parsed && pMessage[4] == 0x21 && pMessage[5] == 0x12;
50 Parsed = Parsed && pMessage[6] == 0xA4 && pMessage[7] == 0x42;
51 // Transaction ID
52 Parsed = Parsed && mem_comp(pMessage + 8, pData->m_aSecret, sizeof(pData->m_aSecret)) == 0;
53 if(!Parsed)
54 {
55 return true;
56 }
57
58 *pSuccess = pMessage[1] == 0x01;
59
60 MessageSize = 20 + MessageLength;
61 size_t Offset = 20;
62 bool FoundAddr = false;
63 while(true)
64 {
65 // STUN attribute format (from RFC 5389, section 15, figure 4):
66 //
67 // 0 1 2 3
68 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
69 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
70 // | Type | Length |
71 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
72 // | Value (variable) ....
73 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
74 if(MessageSize == Offset)
75 {
76 break;
77 }
78 else if(MessageSize < Offset + 4)
79 {
80 return true;
81 }
82 uint16_t Type = (pMessage[Offset] << 8) | pMessage[Offset + 1];
83 uint16_t Length = (pMessage[Offset + 2] << 8) | pMessage[Offset + 3];
84 if(MessageSize < Offset + 4 + Length)
85 {
86 return true;
87 }
88 if(*pSuccess && Type == 0x0020) // XOR-MAPPED-ADDRESS
89 {
90 // STUN XOR-MAPPED-ADDRESS attribute format (from RFC 5389, section 15,
91 // figure 6):
92 //

Callers 2

mainFunction · 0.85
OnPacketMethod · 0.85

Calls 3

mem_zeroFunction · 0.85
mem_compFunction · 0.85
mem_copyFunction · 0.85

Tested by

no test coverage detected