diff options
author | mnicholson <mnicholson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-12-21 16:02:52 +0000 |
---|---|---|
committer | mnicholson <mnicholson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-12-21 16:02:52 +0000 |
commit | 36f72a751eb517a5a3154208970e28d482861f74 (patch) | |
tree | 5414c92cdb6d4fba921308ec8d5f1b665f46179a /channels | |
parent | 53ba5c22ee9f5fd9af8b1849bc4e1a8787566040 (diff) |
Merged revisions 299353 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8
................
r299353 | mnicholson | 2010-12-21 09:25:03 -0600 (Tue, 21 Dec 2010) | 30 lines
Merged revisions 299242 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.6.2
................
r299242 | mnicholson | 2010-12-20 15:25:35 -0600 (Mon, 20 Dec 2010) | 23 lines
Merged revisions 299194,299198,299220 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r299194 | mnicholson | 2010-12-20 14:45:38 -0600 (Mon, 20 Dec 2010) | 6 lines
Respond as soon as possible with a 202 Accepted to refer requests.
This change also plugs a few memory leaks that can occur when parking sip calls.
ABE-2656
........
r299198 | mnicholson | 2010-12-20 15:00:44 -0600 (Mon, 20 Dec 2010) | 2 lines
Remove changes to via processing that were not supposed to go into the last commit.
........
r299220 | mnicholson | 2010-12-20 15:21:39 -0600 (Mon, 20 Dec 2010) | 4 lines
Use ast_free() instead of free()
ABE-2656
........
................
................
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@299355 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_sip.c | 51 |
1 files changed, 26 insertions, 25 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index d5747189e..304c2e65e 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -20293,7 +20293,7 @@ static void *sip_park_thread(void *stuff) if (!transferee || !transferer) { ast_log(LOG_ERROR, "Missing channels for parking! Transferer %s Transferee %s\n", transferer ? "<available>" : "<missing>", transferee ? "<available>" : "<missing>" ); deinit_req(&d->req); - free(d); + ast_free(d); return NULL; } ast_debug(4, "SIP Park: Transferer channel %s, Transferee %s\n", transferer->name, transferee->name); @@ -20302,7 +20302,7 @@ static void *sip_park_thread(void *stuff) ast_log(LOG_WARNING, "Masquerade failed.\n"); transmit_response(transferer->tech_pvt, "503 Internal error", &req); deinit_req(&d->req); - free(d); + ast_free(d); return NULL; } @@ -20321,7 +20321,6 @@ static void *sip_park_thread(void *stuff) /* Any way back to the current call??? */ /* Transmit response to the REFER request */ - transmit_response(transferer->tech_pvt, "202 Accepted", &req); if (!res) { /* Transfer succeeded */ append_history(transferer->tech_pvt, "SIPpark", "Parked call on %d", ext); @@ -20336,7 +20335,7 @@ static void *sip_park_thread(void *stuff) /* Do not hangup call */ } deinit_req(&d->req); - free(d); + ast_free(d); return NULL; } @@ -20417,23 +20416,24 @@ static int sip_park(struct ast_channel *chan1, struct ast_channel *chan2, struct } return -1; } - if ((d = ast_calloc(1, sizeof(*d)))) { - - /* Save original request for followup */ - copy_request(&d->req, req); - d->chan1 = transferee; /* Transferee */ - d->chan2 = transferer; /* Transferer */ - d->seqno = seqno; - d->parkexten = parkexten; - if (ast_pthread_create_detached_background(&th, NULL, sip_park_thread, d) < 0) { - /* Could not start thread */ - deinit_req(&d->req); - ast_free(d); /* We don't need it anymore. If thread is created, d will be free'd - by sip_park_thread() */ - return 0; - } + if (!(d = ast_calloc(1, sizeof(*d)))) { + return -1; } - return -1; + + /* Save original request for followup */ + copy_request(&d->req, req); + d->chan1 = transferee; /* Transferee */ + d->chan2 = transferer; /* Transferer */ + d->seqno = seqno; + d->parkexten = parkexten; + if (ast_pthread_create_detached_background(&th, NULL, sip_park_thread, d) < 0) { + /* Could not start thread */ + deinit_req(&d->req); + ast_free(d); /* We don't need it anymore. If thread is created, d will be free'd + by sip_park_thread() */ + return -1; + } + return 0; } /*! \brief Turn off generator data @@ -21953,7 +21953,6 @@ static int local_attended_transfer(struct sip_pvt *transferer, struct sip_dual * transferer->refer->replaces_callid_fromtag))) { if (transferer->refer->localtransfer) { /* We did not find the refered call. Sorry, can't accept then */ - transmit_response(transferer, "202 Accepted", req); /* Let's fake a response from someone else in order to follow the standard */ transmit_notify_with_sipfrag(transferer, seqno, "481 Call leg/transaction does not exist", TRUE); @@ -21968,7 +21967,6 @@ static int local_attended_transfer(struct sip_pvt *transferer, struct sip_dual * } /* Ok, we can accept this transfer */ - transmit_response(transferer, "202 Accepted", req); append_history(transferer, "Xfer", "Refer accepted"); if (!targetcall_pvt->owner) { /* No active channel */ ast_debug(4, "SIP attended transfer: Error: No owner of target call\n"); @@ -22342,6 +22340,9 @@ static int handle_request_refer(struct sip_pvt *p, struct sip_request *req, int ast_set_flag(&p->flags[0], SIP_GOTREFER); + /* From here on failures will be indicated with NOTIFY requests */ + transmit_response(p, "202 Accepted", req); + /* Attended transfer: Find all call legs and bridge transferee with target*/ if (p->refer->attendedtransfer) { if ((res = local_attended_transfer(p, ¤t, req, seqno, nounlock))) @@ -22379,13 +22380,13 @@ static int handle_request_refer(struct sip_pvt *p, struct sip_request *req, int p->refer->refer_to); if (sipdebug) ast_debug(4, "SIP transfer to parking: trying to park %s. Parked by %s\n", current.chan2->name, current.chan1->name); - sip_park(current.chan2, current.chan1, req, seqno, p->refer->refer_to); + if (sip_park(current.chan2, current.chan1, req, seqno, p->refer->refer_to)) { + transmit_notify_with_sipfrag(p, seqno, "500 Internal Server Error", TRUE); + } return res; } /* Blind transfers and remote attended xfers */ - transmit_response(p, "202 Accepted", req); - if (current.chan1 && current.chan2) { ast_debug(3, "chan1->name: %s\n", current.chan1->name); pbx_builtin_setvar_helper(current.chan1, "BLINDTRANSFER", current.chan2->name); |