From 511730407d183a6ea1f1a366b22012d65f2d866f Mon Sep 17 00:00:00 2001
From: Mark Spencer <markster@digium.com>
Date: Sun, 6 Apr 2003 04:41:16 +0000
Subject: [PATCH] Fix tag handling on CANCEL (and maybe others)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@755 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 channels/chan_sip.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index e57460c239..a69d11783a 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -1928,13 +1928,17 @@ static int reqprep(struct sip_request *req, struct sip_pvt *p, char *msg, int in
 	ot = get_header(orig, "To");
 	of = get_header(orig, "From");
 
-	if (!strstr(ot, "tag=")) {
+	/* Add tag *unless* this is a CANCEL, in which case we need to send it exactly
+	   as our original request, including tag (or presumably lack thereof) */
+	if (!strstr(ot, "tag=") && strcasecmp(msg, "CANCEL")) {
 		/* Add the proper tag if we don't have it already.  If they have specified
 		   their tag, use it.  Otherwise, use our own tag */
-		if (strlen(p->theirtag))
+		if (!p->outgoing && strlen(p->theirtag))
 			snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
-		else
+		else if (p->outgoing)
 			snprintf(newto, sizeof(newto), "%s;tag=%08x", ot, p->tag);
+		else
+			snprintf(newto, sizeof(newto), "%s", ot);
 		ot = newto;
 	}
 
-- 
GitLab