[asterisk-commits] bebuild: tag certified-1.8.11-cert4 r369670 - in /certified/tags/1.8.11-cert4...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Thu Jul 5 14:24:59 CDT 2012
Author: bebuild
Date: Thu Jul 5 14:24:55 2012
New Revision: 369670
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=369670
Log:
Commits for 1.8.11-cert4
Removed old SVN logs, updated ChangeLog, merged in changes to
support AST-2012-010 and AST-2012-011
Removed:
certified/tags/1.8.11-cert4/certified-asterisk-1.8.11-cert2-summary.html
certified/tags/1.8.11-cert4/certified-asterisk-1.8.11-cert2-summary.txt
Modified:
certified/tags/1.8.11-cert4/ (props changed)
certified/tags/1.8.11-cert4/.version
certified/tags/1.8.11-cert4/ChangeLog
certified/tags/1.8.11-cert4/apps/app_voicemail.c
certified/tags/1.8.11-cert4/channels/chan_sip.c
certified/tags/1.8.11-cert4/channels/sip/include/sip.h
Propchange: certified/tags/1.8.11-cert4/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Jul 5 14:24:55 2012
@@ -1,2 +1,2 @@
-/branches/1.8:357665,358162,359656,359706,359979,360086,360884,367781,367843
+/branches/1.8:357665,358162,359656,359706,359979,360086,360884,367781,367843,369436,369557,369579,369626,369652
/certified/branches/1.8.11:367846-367847
Modified: certified/tags/1.8.11-cert4/.version
URL: http://svnview.digium.com/svn/asterisk/certified/tags/1.8.11-cert4/.version?view=diff&rev=369670&r1=369669&r2=369670
==============================================================================
--- certified/tags/1.8.11-cert4/.version (original)
+++ certified/tags/1.8.11-cert4/.version Thu Jul 5 14:24:55 2012
@@ -1,1 +1,1 @@
-1.8.11-cert2
+1.8.11-cert4
Modified: certified/tags/1.8.11-cert4/ChangeLog
URL: http://svnview.digium.com/svn/asterisk/certified/tags/1.8.11-cert4/ChangeLog?view=diff&rev=369670&r1=369669&r2=369670
==============================================================================
--- certified/tags/1.8.11-cert4/ChangeLog (original)
+++ certified/tags/1.8.11-cert4/ChangeLog Thu Jul 5 14:24:55 2012
@@ -1,3 +1,11 @@
+2012-07-05 Asterisk Development Team <asteriskteam at digium.com>
+
+ * Certified Asterisk 1.8.11-cert4 Released.
+
+ * AST-2012-010
+
+ * AST-2012-011
+
2012-05-29 Asterisk Development Team <asteriskteam at digium.com>
* Certified Asterisk 1.8.11-cert2 Released.
Modified: certified/tags/1.8.11-cert4/apps/app_voicemail.c
URL: http://svnview.digium.com/svn/asterisk/certified/tags/1.8.11-cert4/apps/app_voicemail.c?view=diff&rev=369670&r1=369669&r2=369670
==============================================================================
--- certified/tags/1.8.11-cert4/apps/app_voicemail.c (original)
+++ certified/tags/1.8.11-cert4/apps/app_voicemail.c Thu Jul 5 14:24:55 2012
@@ -1786,24 +1786,27 @@
static int vm_allocate_dh(struct vm_state *vms, struct ast_vm_user *vmu, int count_msg) {
int arraysize = (vmu->maxmsg > count_msg ? vmu->maxmsg : count_msg);
- if (!vms->dh_arraysize) {
- /* initial allocation */
+
+ /* remove old allocation */
+ if (vms->deleted) {
+ ast_free(vms->deleted);
+ vms->deleted = NULL;
+ }
+ if (vms->heard) {
+ ast_free(vms->heard);
+ vms->heard = NULL;
+ }
+ vms->dh_arraysize = 0;
+
+ if (arraysize > 0) {
if (!(vms->deleted = ast_calloc(arraysize, sizeof(int)))) {
return -1;
}
if (!(vms->heard = ast_calloc(arraysize, sizeof(int)))) {
+ ast_free(vms->deleted);
+ vms->deleted = NULL;
return -1;
}
- vms->dh_arraysize = arraysize;
- } else if (vms->dh_arraysize < arraysize) {
- if (!(vms->deleted = ast_realloc(vms->deleted, arraysize * sizeof(int)))) {
- return -1;
- }
- if (!(vms->heard = ast_realloc(vms->heard, arraysize * sizeof(int)))) {
- return -1;
- }
- memset(vms->deleted, 0, arraysize * sizeof(int));
- memset(vms->heard, 0, arraysize * sizeof(int));
vms->dh_arraysize = arraysize;
}
@@ -6902,9 +6905,15 @@
name = "Unknown Caller";
/* If deleted, show "undeleted" */
-
- if (vms->deleted[vms->curmsg])
- keys[1] = ADSI_KEY_SKT | (ADSI_KEY_APPS + 11);
+#ifdef IMAP_STORAGE
+ ast_mutex_lock(&vms->lock);
+#endif
+ if (vms->deleted[vms->curmsg]) {
+ keys[1] = ADSI_KEY_SKT | (ADSI_KEY_APPS + 11);
+ }
+#ifdef IMAP_STORAGE
+ ast_mutex_unlock(&vms->lock);
+#endif
/* Except "Exit" */
keys[5] = ADSI_KEY_SKT | (ADSI_KEY_APPS + 5);
@@ -6957,8 +6966,15 @@
}
/* If deleted, show "undeleted" */
- if (vms->deleted[vms->curmsg])
+#ifdef IMAP_STORAGE
+ ast_mutex_lock(&vms->lock);
+#endif
+ if (vms->deleted[vms->curmsg]) {
keys[1] = ADSI_KEY_SKT | (ADSI_KEY_APPS + 11);
+ }
+#ifdef IMAP_STORAGE
+ ast_mutex_unlock(&vms->lock);
+#endif
/* Except "Exit" */
keys[5] = ADSI_KEY_SKT | (ADSI_KEY_APPS + 5);
@@ -8137,8 +8153,12 @@
if (!res) {
make_file(vms->fn, sizeof(vms->fn), vms->curdir, vms->curmsg);
+#ifdef IMAP_STORAGE
+ ast_mutex_lock(&vms->lock);
+#endif
vms->heard[vms->curmsg] = 1;
#ifdef IMAP_STORAGE
+ ast_mutex_unlock(&vms->lock);
/*IMAP storage stores any prepended message from a forward
* as a separate file from the rest of the message
*/
@@ -8354,6 +8374,7 @@
}
ast_unlock_path(vms->curdir);
#else /* defined(IMAP_STORAGE) */
+ ast_mutex_lock(&vms->lock);
if (vms->deleted) {
/* Since we now expunge after each delete, deleting in reverse order
* ensures that no reordering occurs between each step. */
@@ -8368,12 +8389,18 @@
#endif
done:
- if (vms->deleted && last_msg_idx) {
+ if (vms->deleted) {
ast_free(vms->deleted);
- }
- if (vms->heard && last_msg_idx) {
+ vms->deleted = NULL;
+ }
+ if (vms->heard) {
ast_free(vms->heard);
- }
+ vms->heard = NULL;
+ }
+ vms->dh_arraysize = 0;
+#ifdef IMAP_STORAGE
+ ast_mutex_unlock(&vms->lock);
+#endif
return 0;
}
@@ -9468,14 +9495,25 @@
res = ast_play_and_wait(chan, "vm-next");
}
if (!res) {
- if (!vms->deleted[vms->curmsg])
+ int curmsg_deleted;
+#ifdef IMAP_STORAGE
+ ast_mutex_lock(&vms->lock);
+#endif
+ curmsg_deleted = vms->deleted[vms->curmsg];
+#ifdef IMAP_STORAGE
+ ast_mutex_unlock(&vms->lock);
+#endif
+ if (!curmsg_deleted) {
res = ast_play_and_wait(chan, "vm-delete");
- else
+ } else {
res = ast_play_and_wait(chan, "vm-undelete");
- if (!res)
+ }
+ if (!res) {
res = ast_play_and_wait(chan, "vm-toforward");
- if (!res)
+ }
+ if (!res) {
res = ast_play_and_wait(chan, "vm-savemessage");
+ }
}
}
if (!res) {
@@ -10668,6 +10706,7 @@
}
vms.starting = 1;
+ vms.curmsg = 0;
break;
case '3': /* Advanced options */
ast_test_suite_event_notify("ADVOPTIONS", "Message: entering advanced options menu");
Modified: certified/tags/1.8.11-cert4/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/certified/tags/1.8.11-cert4/channels/chan_sip.c?view=diff&rev=369670&r1=369669&r2=369670
==============================================================================
--- certified/tags/1.8.11-cert4/channels/chan_sip.c (original)
+++ certified/tags/1.8.11-cert4/channels/chan_sip.c Thu Jul 5 14:24:55 2012
@@ -3878,7 +3878,7 @@
ast_debug(3, "Re-scheduled destruction of SIP call %s\n", p->callid ? p->callid : "<unknown>");
append_history(p, "ReliableXmit", "timeout");
if (sscanf(p->lastmsg, "Tx: %30s", method_str) == 1 || sscanf(p->lastmsg, "Rx: %30s", method_str) == 1) {
- if (method_match(SIP_CANCEL, method_str) || method_match(SIP_BYE, method_str)) {
+ if (p->ongoing_reinvite || method_match(SIP_CANCEL, method_str) || method_match(SIP_BYE, method_str)) {
pvt_set_needdestroy(p, "autodestruct");
}
}
@@ -6248,6 +6248,21 @@
return 0;
}
+static int reinvite_timeout(const void *data)
+{
+ struct sip_pvt *dialog = (struct sip_pvt *) data;
+ struct ast_channel *owner = sip_pvt_lock_full(dialog);
+ dialog->reinviteid = -1;
+ check_pendings(dialog);
+ if (owner) {
+ ast_channel_unlock(owner);
+ ast_channel_unref(owner);
+ }
+ ao2_unlock(dialog);
+ dialog_unref(dialog, "unref for reinvite timeout");
+ return 0;
+}
+
/*! \brief sip_hangup: Hangup SIP call
* Part of PBX interface, called from ast_hangup */
static int sip_hangup(struct ast_channel *ast)
@@ -6447,8 +6462,16 @@
ast_set_flag(&p->flags[0], SIP_PENDINGBYE);
ast_clear_flag(&p->flags[0], SIP_NEEDREINVITE);
AST_SCHED_DEL_UNREF(sched, p->waitid, dialog_unref(p, "when you delete the waitid sched, you should dec the refcount for the stored dialog ptr"));
- if (sip_cancel_destroy(p))
+ if (sip_cancel_destroy(p)) {
ast_log(LOG_WARNING, "Unable to cancel SIP destruction. Expect bad things.\n");
+ }
+ /* If we have an ongoing reinvite, there is a chance that we have gotten a provisional
+ * response, but something weird has happened and we will never receive a final response.
+ * So, just in case, check for pending actions after a bit of time to trigger the pending
+ * bye that we are setting above */
+ if (p->ongoing_reinvite && p->reinviteid < 0) {
+ p->reinviteid = ast_sched_add(sched, 32 * p->timer_t1, reinvite_timeout, dialog_ref(p, "ref for reinvite_timeout"));
+ }
}
}
}
@@ -7770,6 +7793,7 @@
p->method = intended_method;
p->initid = -1;
p->waitid = -1;
+ p->reinviteid = -1;
p->autokillid = -1;
p->request_queue_sched_id = -1;
p->provisional_keepalive_sched_id = -1;
@@ -11930,7 +11954,7 @@
initialize_initreq(p, &req);
p->lastinvite = p->ocseq;
ast_set_flag(&p->flags[0], SIP_OUTGOING); /* Change direction of this dialog */
-
+ p->ongoing_reinvite = 1;
return send_request(p, &req, XMIT_CRITICAL, p->ocseq);
}
@@ -20058,8 +20082,11 @@
static void check_pendings(struct sip_pvt *p)
{
if (ast_test_flag(&p->flags[0], SIP_PENDINGBYE)) {
- /* if we can't BYE, then this is really a pending CANCEL */
- if (p->invitestate == INV_PROCEEDING || p->invitestate == INV_EARLY_MEDIA) {
+ if (p->reinviteid > -1) {
+ /* Outstanding p->reinviteid timeout, so wait... */
+ return;
+ } else if (p->invitestate == INV_PROCEEDING || p->invitestate == INV_EARLY_MEDIA) {
+ /* if we can't BYE, then this is really a pending CANCEL */
p->invitestate = INV_CANCELLED;
transmit_request(p, SIP_CANCEL, p->lastinvite, XMIT_RELIABLE, FALSE);
/* If the cancel occurred on an initial invite, cancel the pending BYE */
@@ -20070,8 +20097,9 @@
INVITE, but do set an autodestruct just in case we never get it. */
} else {
/* We have a pending outbound invite, don't send something
- new in-transaction */
- if (p->pendinginvite)
+ * new in-transaction, unless it is a pending reinvite, then
+ * by the time we are called here, we should probably just hang up. */
+ if (p->pendinginvite && !p->ongoing_reinvite)
return;
if (p->owner) {
@@ -20276,9 +20304,17 @@
if (resp >= 300 && (p->invitestate == INV_CALLING || p->invitestate == INV_PROCEEDING || p->invitestate == INV_EARLY_MEDIA ))
p->invitestate = INV_COMPLETED;
+ if ((resp >= 200 && reinvite)) {
+ p->ongoing_reinvite = 0;
+ if (p->reinviteid > -1) {
+ AST_SCHED_DEL_UNREF(sched, p->reinviteid, dialog_unref(p, "unref dialog for reinvite timeout because of a final response"));
+ }
+ }
+
/* Final response, clear out pending invite */
- if ((resp == 200 || resp >= 300) && p->pendinginvite && seqno == p->pendinginvite)
+ if ((resp == 200 || resp >= 300) && p->pendinginvite && seqno == p->pendinginvite) {
p->pendinginvite = 0;
+ }
/* If this is a response to our initial INVITE, we need to set what we can use
* for this peer.
Modified: certified/tags/1.8.11-cert4/channels/sip/include/sip.h
URL: http://svnview.digium.com/svn/asterisk/certified/tags/1.8.11-cert4/channels/sip/include/sip.h?view=diff&rev=369670&r1=369669&r2=369670
==============================================================================
--- certified/tags/1.8.11-cert4/channels/sip/include/sip.h (original)
+++ certified/tags/1.8.11-cert4/channels/sip/include/sip.h Thu Jul 5 14:24:55 2012
@@ -1065,6 +1065,7 @@
struct sip_auth_container *peerauth;/*!< Realm authentication credentials */
int noncecount; /*!< Nonce-count */
unsigned int stalenonce:1; /*!< Marks the current nonce as responded too */
+ unsigned int ongoing_reinvite:1; /*!< There is a reinvite in progress that might need to be cleaned up */
char lastmsg[256]; /*!< Last Message sent/received */
int amaflags; /*!< AMA Flags */
uint32_t pendinginvite; /*!< Any pending INVITE or state NOTIFY (in subscribe pvt's) ? (seqno of this) */
@@ -1077,6 +1078,7 @@
int initid; /*!< Auto-congest ID if appropriate (scheduler) */
int waitid; /*!< Wait ID for scheduler after 491 or other delays */
+ int reinviteid; /*!< Reinvite in case of provisional, but no final response */
int autokillid; /*!< Auto-kill ID (scheduler) */
int t38id; /*!< T.38 Response ID */
struct sip_refer *refer; /*!< REFER: SIP transfer data structure */
More information about the asterisk-commits
mailing list