From 4ec8d574542597c54c43a067540ba99a0710d977 Mon Sep 17 00:00:00 2001 From: Matthew Jordan Date: Mon, 10 Oct 2011 20:39:39 +0000 Subject: Merged revisions 340165 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/10 ................ r340165 | mjordan | 2011-10-10 15:30:18 -0500 (Mon, 10 Oct 2011) | 20 lines Merged revisions 340164 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.8 ........ r340164 | mjordan | 2011-10-10 15:23:48 -0500 (Mon, 10 Oct 2011) | 13 lines 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/trunk@340166 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_sip.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'channels') diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 0c57d4522..776421503 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -8666,6 +8666,17 @@ static int get_ip_and_port_from_sdp(struct sip_request *req, const enum media_ty 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 If offer is rejected, we will not change any properties of the call Return 0 on success, a negative value on errors. @@ -9283,7 +9294,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action /* Activate a re-invite */ ast_queue_frame(p->owner, &ast_null_frame); 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, S_OR(p->mohsuggest, NULL), !ast_strlen_zero(p->mohsuggest) ? strlen(p->mohsuggest) + 1 : 0); -- cgit v1.2.3