@@ -503,7 +503,8 @@ int server_forward(juice_server_t *server, server_turn_alloc_t *alloc) {
503503 memset (& msg , 0 , sizeof (msg ));
504504 msg .msg_class = STUN_CLASS_INDICATION ;
505505 msg .msg_method = STUN_METHOD_DATA ;
506- msg .peer = record ;
506+ msg .peers_size = 1 ;
507+ msg .peers [0 ] = record ;
507508 msg .data = buffer ;
508509 msg .data_size = len ;
509510 juice_random (msg .transaction_id , STUN_TRANSACTION_ID_SIZE );
@@ -978,7 +979,11 @@ int server_process_turn_create_permission(juice_server_t *server, const stun_mes
978979
979980 JLOG_DEBUG ("Processing STUN CreatePermission request" );
980981
981- if (!msg -> peer .len ) {
982+ // RFC 5766 9.2. Receiving a CreatePermission Request:
983+ // The CreatePermission request MUST contain at least one XOR-PEER-ADDRESS attribute and MAY
984+ // contain multiple such attributes. If no such attribute exists, or if any of these attributes
985+ // are invalid, then a 400 (Bad Request) error is returned.
986+ if (!msg -> peers_size ) {
982987 JLOG_WARN ("Missing peer address in TURN CreatePermission request" );
983988 return -1 ;
984989 }
@@ -995,10 +1000,13 @@ int server_process_turn_create_permission(juice_server_t *server, const stun_mes
9951000 credentials );
9961001 }
9971002
998- if (!turn_set_permission (& alloc -> map , msg -> transaction_id , & msg -> peer , PERMISSION_LIFETIME )) {
999- server_answer_stun_error (server , msg -> transaction_id , src , msg -> msg_method , 500 ,
1000- credentials );
1001- return -1 ;
1003+ for (size_t i = 0 ; i < msg -> peers_size ; ++ i ) {
1004+ const addr_record_t * peer = msg -> peers + i ;
1005+ if (!turn_set_permission (& alloc -> map , msg -> transaction_id , peer , PERMISSION_LIFETIME )) {
1006+ server_answer_stun_error (server , msg -> transaction_id , src , msg -> msg_method , 500 ,
1007+ credentials );
1008+ return -1 ;
1009+ }
10021010 }
10031011
10041012 stun_message_t ans ;
@@ -1020,7 +1028,7 @@ int server_process_turn_channel_bind(juice_server_t *server, const stun_message_
10201028
10211029 JLOG_DEBUG ("Processing STUN ChannelBind request" );
10221030
1023- if (!msg -> peer . len ) {
1031+ if (!msg -> peers_size ) {
10241032 JLOG_WARN ("Missing peer address in TURN ChannelBind request" );
10251033 return -1 ;
10261034 }
@@ -1049,7 +1057,8 @@ int server_process_turn_channel_bind(juice_server_t *server, const stun_message_
10491057 credentials );
10501058 }
10511059
1052- if (!turn_bind_channel (& alloc -> map , & msg -> peer , msg -> transaction_id , channel , BIND_LIFETIME )) {
1060+ const addr_record_t * peer = msg -> peers ;
1061+ if (!turn_bind_channel (& alloc -> map , peer , msg -> transaction_id , channel , BIND_LIFETIME )) {
10531062 server_answer_stun_error (server , msg -> transaction_id , src , msg -> msg_method , 500 ,
10541063 credentials );
10551064 return -1 ;
@@ -1077,7 +1086,7 @@ int server_process_turn_send(juice_server_t *server, const stun_message_t *msg,
10771086 JLOG_WARN ("Missing data in TURN Send indication" );
10781087 return -1 ;
10791088 }
1080- if (!msg -> peer . len ) {
1089+ if (!msg -> peers_size ) {
10811090 JLOG_WARN ("Missing peer address in TURN Send indication" );
10821091 return -1 ;
10831092 }
@@ -1088,14 +1097,15 @@ int server_process_turn_send(juice_server_t *server, const stun_message_t *msg,
10881097 return -1 ;
10891098 }
10901099
1091- if (!turn_has_permission (& alloc -> map , & msg -> peer )) {
1100+ const addr_record_t * peer = msg -> peers ;
1101+ if (!turn_has_permission (& alloc -> map , peer )) {
10921102 JLOG_WARN ("No permission for peer address" );
10931103 return -1 ;
10941104 }
10951105
10961106 JLOG_VERBOSE ("Forwarding datagram to peer, size=%zu" , msg -> data_size );
10971107
1098- int ret = udp_sendto (alloc -> sock , msg -> data , msg -> data_size , & msg -> peer );
1108+ int ret = udp_sendto (alloc -> sock , msg -> data , msg -> data_size , peer );
10991109 if (ret < 0 && sockerrno != SEAGAIN && sockerrno != SEWOULDBLOCK )
11001110 JLOG_WARN ("Forwarding failed, errno=%d" , sockerrno );
11011111
0 commit comments