diff --git a/channels/chan_local.c b/channels/chan_local.c index ddad32ae4667925e60f97aadb99b4af3f2993486..44af9fc82f983b4ef453782bc29e84a4fc533f21 100755 --- a/channels/chan_local.c +++ b/channels/chan_local.c @@ -115,7 +115,6 @@ static int local_write(struct ast_channel *ast, struct ast_frame *f) { struct local_pvt *p = ast->pvt->pvt; int res = -1; - ast_pthread_mutex_lock(&p->lock); int isoutbound = IS_OUTBOUND(ast, p); /* Just queue for delivery to the other side */ diff --git a/channels/chan_sip.c b/channels/chan_sip.c index c8c25f0e60128e68f8baf0180d1eb0f83b9c4dc9..e57460c239098ed6f7a75adb49bb5c48840c6322 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -900,7 +900,7 @@ static int sip_hangup(struct ast_channel *ast) p->needdestroy = 0; sip_scheddestroy(p, 15000); } else - transmit_response_reliable(p, "480 Temporarily Unavailable", &p->initreq); + transmit_response_reliable(p, "403 Forbidden", &p->initreq); } else { /* Send a hangup */ transmit_request(p, "BYE", 1, 1); @@ -3996,7 +3996,17 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc transmit_request(p, "BYE", 1, 1); p->alreadygone = 1; } - } else if (!strcasecmp(cmd, "CANCEL") || !strcasecmp(cmd, "BYE")) { + } else if (!strcasecmp(cmd, "CANCEL")) { + p->alreadygone = 1; + if (p->rtp) { + /* Immediately stop RTP */ + ast_rtp_stop(p->rtp); + } + if (p->owner) + ast_queue_hangup(p->owner, 0); + transmit_response(p, "200 OK", req); + transmit_response_reliable(p, "487 Request Terminated", &p->initreq); + } else if (!strcasecmp(cmd, "BYE")) { copy_request(&p->initreq, req); p->alreadygone = 1; if (p->rtp) {