mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-25 07:01:09 +00:00
Fix tag checking in get_sip_pvt_byid_locked when
in pedantic mode. The problem was that the wrong tags would be compared depending on the direction of the call. (closes issue #13353) Reported by: flefoll Patches: chan_sip.c.br14.139015.patch-refer-pedantic uploaded by flefoll (license 244) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@140299 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -9007,10 +9007,7 @@ static int get_destination(struct sip_pvt *p, struct sip_request *oreq)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Lock interface lock and find matching pvt lock
|
/*! \brief Lock interface lock and find matching pvt lock
|
||||||
- Their tag is fromtag, our tag is to-tag
|
|
||||||
- This means that in some transactions, totag needs to be their tag :-)
|
|
||||||
depending upon the direction
|
|
||||||
*/
|
*/
|
||||||
static struct sip_pvt *get_sip_pvt_byid_locked(const char *callid, const char *totag, const char *fromtag)
|
static struct sip_pvt *get_sip_pvt_byid_locked(const char *callid, const char *totag, const char *fromtag)
|
||||||
{
|
{
|
||||||
@@ -9025,7 +9022,6 @@ static struct sip_pvt *get_sip_pvt_byid_locked(const char *callid, const char *t
|
|||||||
for (sip_pvt_ptr = iflist; sip_pvt_ptr; sip_pvt_ptr = sip_pvt_ptr->next) {
|
for (sip_pvt_ptr = iflist; sip_pvt_ptr; sip_pvt_ptr = sip_pvt_ptr->next) {
|
||||||
if (!strcmp(sip_pvt_ptr->callid, callid)) {
|
if (!strcmp(sip_pvt_ptr->callid, callid)) {
|
||||||
int match = 1;
|
int match = 1;
|
||||||
char *ourtag = sip_pvt_ptr->tag;
|
|
||||||
|
|
||||||
/* Go ahead and lock it (and its owner) before returning */
|
/* Go ahead and lock it (and its owner) before returning */
|
||||||
ast_mutex_lock(&sip_pvt_ptr->lock);
|
ast_mutex_lock(&sip_pvt_ptr->lock);
|
||||||
@@ -9034,8 +9030,21 @@ static struct sip_pvt *get_sip_pvt_byid_locked(const char *callid, const char *t
|
|||||||
(With a forking SIP proxy, several call legs share the
|
(With a forking SIP proxy, several call legs share the
|
||||||
call id, but have different tags)
|
call id, but have different tags)
|
||||||
*/
|
*/
|
||||||
if (pedanticsipchecking && (strcmp(fromtag, sip_pvt_ptr->theirtag) || (!ast_strlen_zero(totag) && strcmp(totag, ourtag))))
|
if (pedanticsipchecking) {
|
||||||
match = 0;
|
const char *pvt_fromtag, *pvt_totag;
|
||||||
|
|
||||||
|
if (ast_test_flag(&sip_pvt_ptr->flags[1], SIP_PAGE2_OUTGOING_CALL)) {
|
||||||
|
/* Outgoing call tags : from is "our", to is "their" */
|
||||||
|
pvt_fromtag = sip_pvt_ptr->tag ;
|
||||||
|
pvt_totag = sip_pvt_ptr->theirtag ;
|
||||||
|
} else {
|
||||||
|
/* Incoming call tags : from is "their", to is "our" */
|
||||||
|
pvt_fromtag = sip_pvt_ptr->theirtag ;
|
||||||
|
pvt_totag = sip_pvt_ptr->tag ;
|
||||||
|
}
|
||||||
|
if (ast_strlen_zero(fromtag) || strcmp(fromtag, pvt_fromtag) || (!ast_strlen_zero(totag) && strcmp(totag, pvt_totag)))
|
||||||
|
match = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (!match) {
|
if (!match) {
|
||||||
ast_mutex_unlock(&sip_pvt_ptr->lock);
|
ast_mutex_unlock(&sip_pvt_ptr->lock);
|
||||||
@@ -9044,7 +9053,7 @@ static struct sip_pvt *get_sip_pvt_byid_locked(const char *callid, const char *t
|
|||||||
|
|
||||||
if (option_debug > 3 && totag)
|
if (option_debug > 3 && totag)
|
||||||
ast_log(LOG_DEBUG, "Matched %s call - their tag is %s Our tag is %s\n",
|
ast_log(LOG_DEBUG, "Matched %s call - their tag is %s Our tag is %s\n",
|
||||||
ast_test_flag(&sip_pvt_ptr->flags[0], SIP_OUTGOING) ? "OUTGOING": "INCOMING",
|
ast_test_flag(&sip_pvt_ptr->flags[1], SIP_PAGE2_OUTGOING_CALL) ? "OUTGOING": "INCOMING",
|
||||||
sip_pvt_ptr->theirtag, sip_pvt_ptr->tag);
|
sip_pvt_ptr->theirtag, sip_pvt_ptr->tag);
|
||||||
|
|
||||||
/* deadlock avoidance... */
|
/* deadlock avoidance... */
|
||||||
|
Reference in New Issue
Block a user