Commit b59c4bb5 authored by Youness Alaoui's avatar Youness Alaoui Committed by Olivier Crête

Fix crash when discovering peer reflexive candidates in RFC compat

parent 7048b757
......@@ -1318,8 +1318,8 @@ static void priv_add_new_check_pair (NiceAgent *agent, guint stream_id, Componen
}
}
static NiceCandidateTransport
priv_match_transport (NiceCandidateTransport transport)
NiceCandidateTransport
conn_check_match_transport (NiceCandidateTransport transport)
{
switch (transport) {
case NICE_CANDIDATE_TRANSPORT_TCP_ACTIVE:
......@@ -1355,7 +1355,7 @@ static gboolean priv_conn_check_add_for_candidate_pair (NiceAgent *agent, guint
return FALSE;
}
/* note: match pairs only if transport and address family are the same */
if (local->transport == priv_match_transport (remote->transport) &&
if (local->transport == conn_check_match_transport (remote->transport) &&
local->addr.s.addr.sa_family == remote->addr.s.addr.sa_family) {
nice_debug ("Agent %p, Adding check pair between %s and %s", agent,
......@@ -2966,6 +2966,13 @@ gboolean conn_check_handle_inbound_stun (NiceAgent *agent, Stream *stream,
break;
}
}
for (i = component->local_candidates; i; i = i->next) {
NiceCandidate *cand = i->data;
if (cand->sockptr == nicesock) {
local_candidate = cand;
break;
}
}
if (agent->compatibility == NICE_COMPATIBILITY_GOOGLE ||
agent->compatibility == NICE_COMPATIBILITY_MSN ||
......
......@@ -91,5 +91,6 @@ void conn_check_prune_stream (NiceAgent *agent, Stream *stream);
gboolean conn_check_handle_inbound_stun (NiceAgent *agent, Stream *stream, Component *component, NiceSocket *udp_socket, const NiceAddress *from, gchar *buf, guint len);
gint conn_check_compare (const CandidateCheckPair *a, const CandidateCheckPair *b);
void conn_check_remote_candidates_set(NiceAgent *agent);
NiceCandidateTransport conn_check_match_transport (NiceCandidateTransport transport);
#endif /*_NICE_CONNCHECK_H */
......@@ -763,20 +763,27 @@ NiceCandidate *discovery_learn_remote_peer_reflexive_candidate (
Component *component,
guint32 priority,
const NiceAddress *remote_address,
NiceSocket *udp_socket,
NiceSocket *nicesock,
NiceCandidate *local,
NiceCandidate *remote)
{
NiceCandidate *candidate;
/* XXX: for use compiler */
(void)udp_socket;
candidate = nice_candidate_new (NICE_CANDIDATE_TYPE_PEER_REFLEXIVE);
candidate->addr = *remote_address;
candidate->base_addr = *remote_address;
candidate->transport = remote->transport;
if (remote)
candidate->transport = remote->transport;
else if (local)
candidate->transport = conn_check_match_transport (local->transport);
else {
if (nicesock->type == NICE_SOCKET_TYPE_UDP_BSD ||
nicesock->type == NICE_SOCKET_TYPE_TURN)
candidate->transport = NICE_CANDIDATE_TRANSPORT_UDP;
else
candidate->transport = NICE_CANDIDATE_TRANSPORT_TCP_ACTIVE;
}
candidate->stream_id = stream->id;
candidate->component_id = component->id;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment