@@ -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,9 +979,15 @@ 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" );
983- 		return  -1 ;
988+ 		return  server_answer_stun_error (server , msg -> transaction_id , src , msg -> msg_method ,
989+ 		                                400 , // Bad request 
990+ 		                                credentials );
984991	}
985992
986993	server_turn_alloc_t  * alloc  =  find_allocation (server -> allocs , server -> allocs_count , src , false);
@@ -995,10 +1002,13 @@ int server_process_turn_create_permission(juice_server_t *server, const stun_mes
9951002		                                credentials );
9961003	}
9971004
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 ;
1005+ 	for  (size_t  i  =  0 ; i  <  msg -> peers_size ; ++ i ) {
1006+ 		const  addr_record_t  * peer  =  msg -> peers  +  i ;
1007+ 		if  (!turn_set_permission (& alloc -> map , msg -> transaction_id , peer , PERMISSION_LIFETIME )) {
1008+ 			server_answer_stun_error (server , msg -> transaction_id , src , msg -> msg_method , 500 ,
1009+ 			                         credentials );
1010+ 			return  -1 ;
1011+ 		}
10021012	}
10031013
10041014	stun_message_t  ans ;
@@ -1020,13 +1030,17 @@ int server_process_turn_channel_bind(juice_server_t *server, const stun_message_
10201030
10211031	JLOG_DEBUG ("Processing STUN ChannelBind request" );
10221032
1023- 	if  (!msg -> peer . len ) {
1033+ 	if  (!msg -> peers_size ) {
10241034		JLOG_WARN ("Missing peer address in TURN ChannelBind request" );
1025- 		return  -1 ;
1035+ 		return  server_answer_stun_error (server , msg -> transaction_id , src , msg -> msg_method ,
1036+ 		                                400 , // Bad request 
1037+ 		                                credentials );
10261038	}
10271039	if  (!msg -> channel_number ) {
10281040		JLOG_WARN ("Missing channel number in TURN ChannelBind request" );
1029- 		return  -1 ;
1041+ 		return  server_answer_stun_error (server , msg -> transaction_id , src , msg -> msg_method ,
1042+ 		                                400 , // Bad request 
1043+ 		                                credentials );
10301044	}
10311045
10321046	server_turn_alloc_t  * alloc  =  find_allocation (server -> allocs , server -> allocs_count , src , false);
@@ -1049,7 +1063,8 @@ int server_process_turn_channel_bind(juice_server_t *server, const stun_message_
10491063		                                credentials );
10501064	}
10511065
1052- 	if  (!turn_bind_channel (& alloc -> map , & msg -> peer , msg -> transaction_id , channel , BIND_LIFETIME )) {
1066+ 	const  addr_record_t  * peer  =  msg -> peers ;
1067+ 	if  (!turn_bind_channel (& alloc -> map , peer , msg -> transaction_id , channel , BIND_LIFETIME )) {
10531068		server_answer_stun_error (server , msg -> transaction_id , src , msg -> msg_method , 500 ,
10541069		                         credentials );
10551070		return  -1 ;
@@ -1077,7 +1092,7 @@ int server_process_turn_send(juice_server_t *server, const stun_message_t *msg,
10771092		JLOG_WARN ("Missing data in TURN Send indication" );
10781093		return  -1 ;
10791094	}
1080- 	if  (!msg -> peer . len ) {
1095+ 	if  (!msg -> peers_size ) {
10811096		JLOG_WARN ("Missing peer address in TURN Send indication" );
10821097		return  -1 ;
10831098	}
@@ -1088,14 +1103,15 @@ int server_process_turn_send(juice_server_t *server, const stun_message_t *msg,
10881103		return  -1 ;
10891104	}
10901105
1091- 	if  (!turn_has_permission (& alloc -> map , & msg -> peer )) {
1106+ 	const  addr_record_t  * peer  =  msg -> peers ;
1107+ 	if  (!turn_has_permission (& alloc -> map , peer )) {
10921108		JLOG_WARN ("No permission for peer address" );
10931109		return  -1 ;
10941110	}
10951111
10961112	JLOG_VERBOSE ("Forwarding datagram to peer, size=%zu" , msg -> data_size );
10971113
1098- 	int  ret  =  udp_sendto (alloc -> sock , msg -> data , msg -> data_size , & msg -> peer );
1114+ 	int  ret  =  udp_sendto (alloc -> sock , msg -> data , msg -> data_size , peer );
10991115	if  (ret  <  0  &&  sockerrno  !=  SEAGAIN  &&  sockerrno  !=  SEWOULDBLOCK )
11001116		JLOG_WARN ("Forwarding failed, errno=%d" , sockerrno );
11011117
0 commit comments