diff --git a/channels/chan_sip.c b/channels/chan_sip.c index e57460c239098ed6f7a75adb49bb5c48840c6322..a69d11783ace8a3f8b48cfab771333118da96996 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; }