Updated chan_sip to place calls on hold if SDP address in INVITE is ANY

This patch fixes the case where an INVITE is received with c=0.0.0.0 or ::.
In this case, the call should be placed on hold.  Previously, we checked for
the address being null; this patch keeps that behavior but also checks for
the ANY IP addresses.

Review: https://reviewboard.asterisk.org/r/1504/

(closes issue ASTERISK-18086)
Reported by: James Bottomley
Tested by: Matt Jordan


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@340164 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Matthew Jordan
2011-10-10 20:23:48 +00:00
parent de9e8e501e
commit 21bb14654b

View File

@@ -8494,6 +8494,17 @@ static int get_ip_and_port_from_sdp(struct sip_request *req, const enum media_ty
return 0; return 0;
} }
/*! \internal
* \brief Returns whether or not the address is null or ANY / unspecified (0.0.0.0 or ::)
* \retval TRUE if the address is null or any
* \retval FALSE if the address it not null or any
* \note In some circumstances, calls should be placed on hold if either of these conditions exist.
*/
static int sockaddr_is_null_or_any(const struct ast_sockaddr *addr)
{
return ast_sockaddr_isnull(addr) || ast_sockaddr_is_any(addr);
}
/*! \brief Process SIP SDP offer, select formats and activate RTP channels /*! \brief Process SIP SDP offer, select formats and activate RTP channels
If offer is rejected, we will not change any properties of the call If offer is rejected, we will not change any properties of the call
Return 0 on success, a negative value on errors. Return 0 on success, a negative value on errors.
@@ -9075,7 +9086,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action
/* Activate a re-invite */ /* Activate a re-invite */
ast_queue_frame(p->owner, &ast_null_frame); ast_queue_frame(p->owner, &ast_null_frame);
change_hold_state(p, req, FALSE, sendonly); change_hold_state(p, req, FALSE, sendonly);
} else if ((ast_sockaddr_isnull(sa) && ast_sockaddr_isnull(vsa) && ast_sockaddr_isnull(tsa) && ast_sockaddr_isnull(isa)) || (sendonly && sendonly != -1)) { } else if ((sockaddr_is_null_or_any(sa) && sockaddr_is_null_or_any(vsa) && sockaddr_is_null_or_any(tsa) && sockaddr_is_null_or_any(isa)) || (sendonly && sendonly != -1)) {
ast_queue_control_data(p->owner, AST_CONTROL_HOLD, ast_queue_control_data(p->owner, AST_CONTROL_HOLD,
S_OR(p->mohsuggest, NULL), S_OR(p->mohsuggest, NULL),
!ast_strlen_zero(p->mohsuggest) ? strlen(p->mohsuggest) + 1 : 0); !ast_strlen_zero(p->mohsuggest) ? strlen(p->mohsuggest) + 1 : 0);