[svn-commits] oej: branch oej/fixtoheader-1.4 r181648 - in /team/oej/fixtoheader-1.4: ./ ap...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Mar 12 09:32:13 CDT 2009


Author: oej
Date: Thu Mar 12 09:31:58 2009
New Revision: 181648

URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=181648
Log:
Reset automerge, fix conflict

Added:
    team/oej/fixtoheader-1.4/channels/h323/ast_ptlib.h
      - copied unchanged from r181436, branches/1.4/channels/h323/ast_ptlib.h
Modified:
    team/oej/fixtoheader-1.4/   (props changed)
    team/oej/fixtoheader-1.4/apps/app_dahdiras.c
    team/oej/fixtoheader-1.4/apps/app_macro.c
    team/oej/fixtoheader-1.4/apps/app_meetme.c
    team/oej/fixtoheader-1.4/apps/app_queue.c
    team/oej/fixtoheader-1.4/apps/app_rpt.c
    team/oej/fixtoheader-1.4/apps/app_speech_utils.c
    team/oej/fixtoheader-1.4/apps/app_voicemail.c
    team/oej/fixtoheader-1.4/autoconf/ast_check_gnu_make.m4
    team/oej/fixtoheader-1.4/autoconf/ast_check_pwlib.m4
    team/oej/fixtoheader-1.4/autoconf/ast_prog_sed.m4
    team/oej/fixtoheader-1.4/channels/chan_dahdi.c
    team/oej/fixtoheader-1.4/channels/chan_gtalk.c
    team/oej/fixtoheader-1.4/channels/chan_iax2.c
    team/oej/fixtoheader-1.4/channels/chan_local.c
    team/oej/fixtoheader-1.4/channels/chan_sip.c
    team/oej/fixtoheader-1.4/channels/h323/ast_h323.cxx
    team/oej/fixtoheader-1.4/channels/h323/ast_h323.h
    team/oej/fixtoheader-1.4/channels/h323/caps_h323.cxx
    team/oej/fixtoheader-1.4/channels/h323/caps_h323.h
    team/oej/fixtoheader-1.4/channels/h323/chan_h323.h
    team/oej/fixtoheader-1.4/channels/h323/cisco-h225.cxx
    team/oej/fixtoheader-1.4/channels/h323/cisco-h225.h
    team/oej/fixtoheader-1.4/channels/h323/compat_h323.cxx
    team/oej/fixtoheader-1.4/channels/h323/compat_h323.h
    team/oej/fixtoheader-1.4/channels/iax2-parser.h
    team/oej/fixtoheader-1.4/codecs/codec_dahdi.c
    team/oej/fixtoheader-1.4/configs/extensions.conf.sample
    team/oej/fixtoheader-1.4/configs/features.conf.sample
    team/oej/fixtoheader-1.4/configs/queues.conf.sample
    team/oej/fixtoheader-1.4/configs/voicemail.conf.sample
    team/oej/fixtoheader-1.4/configure
    team/oej/fixtoheader-1.4/configure.ac
    team/oej/fixtoheader-1.4/doc/channelvariables.txt
    team/oej/fixtoheader-1.4/formats/format_ilbc.c
    team/oej/fixtoheader-1.4/include/asterisk/astmm.h
    team/oej/fixtoheader-1.4/include/asterisk/channel.h
    team/oej/fixtoheader-1.4/include/asterisk/config.h
    team/oej/fixtoheader-1.4/include/asterisk/dahdi_compat.h
    team/oej/fixtoheader-1.4/include/asterisk/frame.h
    team/oej/fixtoheader-1.4/include/asterisk/manager.h
    team/oej/fixtoheader-1.4/include/asterisk/threadstorage.h
    team/oej/fixtoheader-1.4/include/asterisk/utils.h
    team/oej/fixtoheader-1.4/main/Makefile
    team/oej/fixtoheader-1.4/main/app.c
    team/oej/fixtoheader-1.4/main/ast_expr2.c
    team/oej/fixtoheader-1.4/main/ast_expr2.fl
    team/oej/fixtoheader-1.4/main/ast_expr2.h
    team/oej/fixtoheader-1.4/main/ast_expr2.y
    team/oej/fixtoheader-1.4/main/ast_expr2f.c
    team/oej/fixtoheader-1.4/main/asterisk.c
    team/oej/fixtoheader-1.4/main/callerid.c
    team/oej/fixtoheader-1.4/main/channel.c
    team/oej/fixtoheader-1.4/main/devicestate.c
    team/oej/fixtoheader-1.4/main/editline/configure
    team/oej/fixtoheader-1.4/main/editline/configure.in
    team/oej/fixtoheader-1.4/main/editline/np/unvis.c
    team/oej/fixtoheader-1.4/main/editline/sys.h
    team/oej/fixtoheader-1.4/main/enum.c
    team/oej/fixtoheader-1.4/main/file.c
    team/oej/fixtoheader-1.4/main/frame.c
    team/oej/fixtoheader-1.4/main/jitterbuf.c
    team/oej/fixtoheader-1.4/main/pbx.c
    team/oej/fixtoheader-1.4/main/rtp.c
    team/oej/fixtoheader-1.4/main/udptl.c
    team/oej/fixtoheader-1.4/main/utils.c
    team/oej/fixtoheader-1.4/pbx/ael/ael.tab.c
    team/oej/fixtoheader-1.4/pbx/ael/ael.y
    team/oej/fixtoheader-1.4/pbx/pbx_ael.c
    team/oej/fixtoheader-1.4/pbx/pbx_config.c
    team/oej/fixtoheader-1.4/res/res_features.c
    team/oej/fixtoheader-1.4/res/res_musiconhold.c
    team/oej/fixtoheader-1.4/res/snmp/agent.c
    team/oej/fixtoheader-1.4/utils/Makefile
    team/oej/fixtoheader-1.4/utils/expr2.testinput
    team/oej/fixtoheader-1.4/utils/muted.c

Propchange: team/oej/fixtoheader-1.4/
------------------------------------------------------------------------------
    automerge = http://www.codename-pineapple.org/

Propchange: team/oej/fixtoheader-1.4/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Thu Mar 12 09:31:58 2009
@@ -1,1 +1,1 @@
-/branches/1.4:1-173727
+/branches/1.4:1-181615

Modified: team/oej/fixtoheader-1.4/apps/app_dahdiras.c
URL: http://svn.digium.com/svn-view/asterisk/team/oej/fixtoheader-1.4/apps/app_dahdiras.c?view=diff&rev=181648&r1=181647&r2=181648
==============================================================================
--- team/oej/fixtoheader-1.4/apps/app_dahdiras.c (original)
+++ team/oej/fixtoheader-1.4/apps/app_dahdiras.c Thu Mar 12 09:31:58 2009
@@ -49,6 +49,9 @@
 #include <errno.h>
 #include <stdio.h>
 #include <fcntl.h>
+
+#include "asterisk/dahdi_compat.h"
+
 #ifdef HAVE_CAP
 #include <sys/capability.h>
 #endif /* HAVE_CAP */
@@ -60,8 +63,6 @@
 #include "asterisk/pbx.h"
 #include "asterisk/module.h"
 #include "asterisk/options.h"
-
-#include "asterisk/dahdi_compat.h"
 
 static char *dahdi_app = "DAHDIRAS";
 static char *zap_app = "ZapRAS";

Modified: team/oej/fixtoheader-1.4/apps/app_macro.c
URL: http://svn.digium.com/svn-view/asterisk/team/oej/fixtoheader-1.4/apps/app_macro.c?view=diff&rev=181648&r1=181647&r2=181648
==============================================================================
--- team/oej/fixtoheader-1.4/apps/app_macro.c (original)
+++ team/oej/fixtoheader-1.4/apps/app_macro.c Thu Mar 12 09:31:58 2009
@@ -477,6 +477,23 @@
 		chan->macropriority = 0;
 	}
 
+	/*!\note
+	 * This section is used to restore a behavior that we mistakenly
+	 * changed in issue #6176, then mistakenly reverted in #13962 and
+	 * #13363.  A corresponding change is made in main/pbx.c, where we
+	 * check this variable for existence, then look for the "h" extension
+	 * in that context.
+	 */
+	if (ast_check_hangup(chan) || res < 0) {
+		/* Don't need to lock the channel, as we aren't dereferencing emc.
+		 * The intent here is to grab the deepest context, without overwriting
+		 * in any above context. */
+		const char *emc = pbx_builtin_getvar_helper(chan, "EXIT_MACRO_CONTEXT");
+		if (!emc) {
+			pbx_builtin_setvar_helper(chan, "EXIT_MACRO_CONTEXT", fullmacro);
+		}
+	}
+
 	if (!strcasecmp(chan->context, fullmacro)) {
   		/* If we're leaving the macro normally, restore original information */
 		chan->priority = oldpriority;

Modified: team/oej/fixtoheader-1.4/apps/app_meetme.c
URL: http://svn.digium.com/svn-view/asterisk/team/oej/fixtoheader-1.4/apps/app_meetme.c?view=diff&rev=181648&r1=181647&r2=181648
==============================================================================
--- team/oej/fixtoheader-1.4/apps/app_meetme.c (original)
+++ team/oej/fixtoheader-1.4/apps/app_meetme.c Thu Mar 12 09:31:58 2009
@@ -1502,7 +1502,6 @@
 	int ms;
 	int nfds;
 	int res;
-	int flags;
 	int retryzap;
 	int origfd;
 	int musiconhold = 0;
@@ -1728,24 +1727,13 @@
  zapretry:
 	origfd = chan->fds[0];
 	if (retryzap) {
-		fd = open(DAHDI_FILE_PSEUDO, O_RDWR);
+		/* open pseudo in non-blocking mode */
+		fd = open(DAHDI_FILE_PSEUDO, O_RDWR | O_NONBLOCK);
 		if (fd < 0) {
 			ast_log(LOG_WARNING, "Unable to open pseudo channel: %s\n", strerror(errno));
 			goto outrun;
 		}
 		using_pseudo = 1;
-		/* Make non-blocking */
-		flags = fcntl(fd, F_GETFL);
-		if (flags < 0) {
-			ast_log(LOG_WARNING, "Unable to get flags: %s\n", strerror(errno));
-			close(fd);
-			goto outrun;
-		}
-		if (fcntl(fd, F_SETFL, flags | O_NONBLOCK)) {
-			ast_log(LOG_WARNING, "Unable to set flags: %s\n", strerror(errno));
-			close(fd);
-			goto outrun;
-		}
 		/* Setup buffering information */
 		memset(&bi, 0, sizeof(bi));
 		bi.bufsize = CONF_SIZE/2;
@@ -1921,12 +1909,9 @@
 						ast_waitstream(chan, "");
 			}
 
-			c = ast_waitfor_nandfds(&chan, 1, &fd, nfds, NULL, &outfd, &ms);
-			
-			
 			/* Update the struct with the actual confflags */
 			user->userflags = confflags;
-			
+
 			if (confflags & CONFFLAG_WAITMARKED) {
 				if(currentmarked == 0) {
 					if (lastmarked != 0) {
@@ -2047,6 +2032,8 @@
 			/* Perform an extra hangup check just in case */
 			if (ast_check_hangup(chan))
 				break;
+
+			c = ast_waitfor_nandfds(&chan, 1, &fd, nfds, NULL, &outfd, &ms);
 
 			if (c) {
 				char dtmfstr[2] = "";
@@ -4742,7 +4729,7 @@
 			return -1;
 		}
 		if (ast_add_extension2(context, 0 /* don't replace */, "s", 1,
-			NULL, NULL, slatrunk_app, ast_strdup(trunk->name), ast_free, sla_registrar)) {
+			NULL, NULL, slatrunk_app, ast_strdup(trunk->name), ast_free_ptr, sla_registrar)) {
 			ast_log(LOG_ERROR, "Failed to automatically create extension "
 				"for trunk '%s'!\n", trunk->name);
 			destroy_trunk(trunk);
@@ -4881,7 +4868,7 @@
 		/* The extension for when the handset goes off-hook.
 		 * exten => station1,1,SLAStation(station1) */
 		if (ast_add_extension2(context, 0 /* don't replace */, station->name, 1,
-			NULL, NULL, slastation_app, ast_strdup(station->name), ast_free, sla_registrar)) {
+			NULL, NULL, slastation_app, ast_strdup(station->name), ast_free_ptr, sla_registrar)) {
 			ast_log(LOG_ERROR, "Failed to automatically create extension "
 				"for trunk '%s'!\n", station->name);
 			destroy_station(station);
@@ -4896,7 +4883,7 @@
 			/* Extension for this line button 
 			 * exten => station1_line1,1,SLAStation(station1_line1) */
 			if (ast_add_extension2(context, 0 /* don't replace */, exten, 1,
-				NULL, NULL, slastation_app, ast_strdup(exten), ast_free, sla_registrar)) {
+				NULL, NULL, slastation_app, ast_strdup(exten), ast_free_ptr, sla_registrar)) {
 				ast_log(LOG_ERROR, "Failed to automatically create extension "
 					"for trunk '%s'!\n", station->name);
 				destroy_station(station);

Modified: team/oej/fixtoheader-1.4/apps/app_queue.c
URL: http://svn.digium.com/svn-view/asterisk/team/oej/fixtoheader-1.4/apps/app_queue.c?view=diff&rev=181648&r1=181647&r2=181648
==============================================================================
--- team/oej/fixtoheader-1.4/apps/app_queue.c (original)
+++ team/oej/fixtoheader-1.4/apps/app_queue.c Thu Mar 12 09:31:58 2009
@@ -1485,6 +1485,10 @@
 static int play_file(struct ast_channel *chan, char *filename)
 {
 	int res;
+
+	if (ast_strlen_zero(filename)) {
+		return 0;
+	}
 
 	ast_stopstream(chan);
 

Modified: team/oej/fixtoheader-1.4/apps/app_rpt.c
URL: http://svn.digium.com/svn-view/asterisk/team/oej/fixtoheader-1.4/apps/app_rpt.c?view=diff&rev=181648&r1=181647&r2=181648
==============================================================================
--- team/oej/fixtoheader-1.4/apps/app_rpt.c (original)
+++ team/oej/fixtoheader-1.4/apps/app_rpt.c Thu Mar 12 09:31:58 2009
@@ -260,6 +260,7 @@
 
 #include <signal.h>
 #include <stdio.h>
+#include <stdint.h>
 #include <unistd.h>
 #include <string.h>
 #include <stdlib.h>
@@ -471,7 +472,7 @@
 	int	mode;
 	struct rpt_link mylink;
 	char param[TELEPARAMSIZE];
-	int	submode;
+	intptr_t submode;
 	pthread_t threadid;
 } ;
 
@@ -4144,7 +4145,7 @@
 		strncpy(tele->param, (char *) data, TELEPARAMSIZE - 1);
 		tele->param[TELEPARAMSIZE - 1] = 0;
 	}
-	if (mode == REMXXX) tele->submode = (int) data;
+	if (mode == REMXXX) tele->submode = (intptr_t) data;
 	insque((struct qelem *)tele, (struct qelem *)myrpt->tele.next);
 	rpt_mutex_unlock(&myrpt->lock);
         pthread_attr_init(&attr);
@@ -5098,13 +5099,14 @@
 static int function_cop(struct rpt *myrpt, char *param, char *digitbuf, int command_source, struct rpt_link *mylink)
 {
 	char string[16];
+	int res;
 
 	if(!param)
 		return DC_ERROR;
 	
 	switch(myatoi(param)){
 		case 1: /* System reset */
-			system("killall -9 asterisk");
+			res = system("killall -9 asterisk");
 			return DC_COMPLETE;
 
 		case 2:
@@ -7748,7 +7750,8 @@
 static int function_remote(struct rpt *myrpt, char *param, char *digitbuf, int command_source, struct rpt_link *mylink)
 {
 	char *s,*s1,*s2;
-	int i,j,p,r,ht,k,l,ls2,m,d,offset,offsave, modesave, defmode;
+	int i,j,r,ht,k,l,ls2,m,d,offset,offsave, modesave, defmode=0;
+	intptr_t p;
 	char multimode = 0;
 	char oc,*cp,*cp1,*cp2;
 	char tmp[20], freq[20] = "", savestr[20] = "";

Modified: team/oej/fixtoheader-1.4/apps/app_speech_utils.c
URL: http://svn.digium.com/svn-view/asterisk/team/oej/fixtoheader-1.4/apps/app_speech_utils.c?view=diff&rev=181648&r1=181647&r2=181648
==============================================================================
--- team/oej/fixtoheader-1.4/apps/app_speech_utils.c (original)
+++ team/oej/fixtoheader-1.4/apps/app_speech_utils.c Thu Mar 12 09:31:58 2009
@@ -377,6 +377,8 @@
 	}
 	datastore->data = speech;
 	ast_channel_datastore_add(chan, datastore);
+
+	pbx_builtin_setvar_helper(chan, "ERROR", NULL);
 
 	ast_module_user_remove(u);
 

Modified: team/oej/fixtoheader-1.4/apps/app_voicemail.c
URL: http://svn.digium.com/svn-view/asterisk/team/oej/fixtoheader-1.4/apps/app_voicemail.c?view=diff&rev=181648&r1=181647&r2=181648
==============================================================================
--- team/oej/fixtoheader-1.4/apps/app_voicemail.c (original)
+++ team/oej/fixtoheader-1.4/apps/app_voicemail.c Thu Mar 12 09:31:58 2009
@@ -107,6 +107,8 @@
 #endif
 
 #ifdef IMAP_STORAGE
+#include "asterisk/threadstorage.h"
+
 AST_MUTEX_DEFINE_STATIC(imaptemp_lock);
 static char imaptemp[1024];
 static char imapserver[48];
@@ -122,6 +124,8 @@
 
 struct vm_state;
 struct ast_vm_user;
+
+AST_THREADSTORAGE(ts_vmstate, ts_vmstate_init);
 
 static int init_mailstream (struct vm_state *vms, int box);
 static void write_file (char *filename, char *buffer, unsigned long len);
@@ -1225,6 +1229,7 @@
 		ast_mutex_lock(&vms_p->lock);
 		pgm = mail_newsearchpgm ();
 		hdr = mail_newsearchheader ("X-Asterisk-VM-Extension", (char *)(!ast_strlen_zero(vmu->imapvmshareid) ? vmu->imapvmshareid : mailbox));
+		hdr->next = mail_newsearchheader("X-Asterisk-VM-Context", (char *) S_OR(context, "default"));
 		pgm->header = hdr;
 		if (fold != 1) {
 			pgm->unseen = 1;
@@ -1569,6 +1574,7 @@
 
 	/* Check IMAP folder for Asterisk messages only... */
 	hdr = mail_newsearchheader ("X-Asterisk-VM-Extension", (!ast_strlen_zero(vmu->imapvmshareid) ? vmu->imapvmshareid : vmu->mailbox));
+	hdr->next = mail_newsearchheader("X-Asterisk-VM-Context", vmu->context);
 	pgm->header = hdr;
 	pgm->deleted = 0;
 	pgm->undeleted = 1;
@@ -1613,6 +1619,9 @@
 	mailbox = stream->mailbox;
 	user = get_user_by_mailbox(mailbox);
 	vms = get_vm_state_by_imapuser(user,2);
+	if (!vms) {
+		vms = get_vm_state_by_imapuser(user, 0);
+	}
 	if (vms) {
 		if (option_debug > 2)
 			ast_log (LOG_DEBUG, "saving mailbox message number %lu as message %d. Interactive set to %d\n",number,vms->vmArrayIndex,vms->interactive);
@@ -1827,6 +1836,9 @@
 	mailbox = stream->mailbox;
 	user = get_user_by_mailbox(mailbox);
 	vms = get_vm_state_by_imapuser(user,2);
+	if (!vms) {
+		vms = get_vm_state_by_imapuser(user, 0);
+	}
 	if (vms) {
 		if (option_debug > 2)
 			ast_log (LOG_DEBUG, "User %s usage is %lu, limit is %lu\n",user,usage,limit);
@@ -1897,6 +1909,9 @@
 {
 	struct vm_state *vms_p;
 
+	if ((vms_p = pthread_getspecific(ts_vmstate.key)) && !strcmp(vms_p->imapuser, vmu->imapuser) && !strcmp(vms_p->username, vmu->mailbox)) {
+		return vms_p;
+	}
 	if (option_debug > 4)
 		ast_log(LOG_DEBUG,"Adding new vmstate for %s\n",vmu->imapuser);
 	if (!(vms_p = ast_calloc(1, sizeof(*vms_p))))
@@ -1918,6 +1933,12 @@
 static struct vm_state *get_vm_state_by_imapuser(char *user, int interactive)
 {
 	struct vmstate *vlist = NULL;
+
+	if (interactive) {
+		struct vm_state *vms;
+		vms = pthread_getspecific(ts_vmstate.key);
+		return vms;
+	}
 
 	ast_mutex_lock(&vmstate_lock);
 	vlist = vmstates;
@@ -1954,6 +1975,12 @@
 	struct vmstate *vlist = NULL;
 	const char *local_context = S_OR(context, "default");
 
+	if (interactive) {
+		struct vm_state *vms;
+		vms = pthread_getspecific(ts_vmstate.key);
+		return vms;
+	}
+
 	ast_mutex_lock(&vmstate_lock);
 	vlist = vmstates;
 	if (option_debug > 2) 
@@ -1963,7 +1990,7 @@
 			if (vlist->vms->username && vlist->vms->context) {
 				if (option_debug > 2)
 					ast_log(LOG_DEBUG, "	comparing mailbox %s (i=%d) to vmstate mailbox %s (i=%d)\n",mailbox,interactive,vlist->vms->username,vlist->vms->interactive);
-				if (!strcmp(vlist->vms->username,mailbox) && !(strcmp(vlist->vms->context, local_context)) && vlist->vms->interactive == interactive) {
+				if (!strcmp(vlist->vms->username,mailbox) && !(strcmp(vlist->vms->context, local_context))) {
 					if (option_debug > 2)
 						ast_log(LOG_DEBUG, "	Found it!\n");
 					ast_mutex_unlock(&vmstate_lock);
@@ -2008,9 +2035,13 @@
 			/* get a pointer to the persistent store */
 			vms->persist_vms = altvms;
 			/* Reuse the mailstream? */
+#ifdef REALLY_FAST_EVEN_IF_IT_MEANS_RESOURCE_LEAKS
 			vms->mailstream = altvms->mailstream;
-			/* vms->mailstream = NIL; */
-		}
+#else
+			vms->mailstream = NIL;
+#endif
+		}
+		return;
 	}
 
 	v = (struct vmstate *)malloc(sizeof(struct vmstate));
@@ -2042,6 +2073,10 @@
 			altvms->oldmessages = vms->oldmessages;
 			altvms->updated = 1;
 		}
+		vms->mailstream = mail_close(vms->mailstream);
+
+		/* Interactive states are not stored within the persistent list */
+		return;
 	}
 
 	ast_mutex_lock(&vmstate_lock);
@@ -7324,9 +7359,13 @@
 	adsi_begin(chan, &useadsi);
 
 #ifdef IMAP_STORAGE
+	pthread_once(&ts_vmstate.once, ts_vmstate.key_init);
+	pthread_setspecific(ts_vmstate.key, &vms);
+
 	vms.interactive = 1;
 	vms.updated = 1;
-	ast_copy_string(vms.context, vmu->context, sizeof(vms.context));
+	if (vmu)
+		ast_copy_string(vms.context, vmu->context, sizeof(vms.context));
 	vmstate_insert(&vms);
 	init_vm_state(&vms);
 #endif
@@ -7755,8 +7794,11 @@
 		free(vms.deleted);
 	if (vms.heard)
 		free(vms.heard);
+
+#ifdef IMAP_STORAGE
+	pthread_setspecific(ts_vmstate.key, NULL);
+#endif
 	ast_module_user_remove(u);
-
 	return res;
 }
 
@@ -7863,18 +7905,26 @@
 {
 	struct ast_vm_user *vmu;
 	AST_LIST_TRAVERSE(&users, vmu, list) {
-		if (ast_test_flag((&globalflags), VM_SEARCH) && !strcasecmp(mbox, vmu->mailbox))
-			break;
-		if (context && (!strcasecmp(context, vmu->context)) && (!strcasecmp(mbox, vmu->mailbox)))
-			break;
+		if (ast_test_flag((&globalflags), VM_SEARCH) && !strcasecmp(mbox, vmu->mailbox)) {
+			if (strcasecmp(vmu->context, context)) {
+				ast_log(LOG_WARNING, "\nIt has been detected that you have defined mailbox '%s' in separate\
+						\n\tcontexts and that you have the 'searchcontexts' option on. This type of\
+						\n\tconfiguration creates an ambiguity that you likely do not want. Please\
+						\n\tamend your voicemail.conf file to avoid this situation.\n", mbox);
+			}
+			ast_log(LOG_WARNING, "Ignoring duplicated mailbox %s\n", mbox);
+			return NULL;
+		}
+		if (!strcasecmp(context, vmu->context) && !strcasecmp(mbox, vmu->mailbox)) {
+			ast_log(LOG_WARNING, "Ignoring duplicated mailbox %s in context %s\n", mbox, context);
+			return NULL;
+		}
 	}
 	
-	if (!vmu) {
-		if ((vmu = ast_calloc(1, sizeof(*vmu)))) {
-			ast_copy_string(vmu->context, context, sizeof(vmu->context));
-			ast_copy_string(vmu->mailbox, mbox, sizeof(vmu->mailbox));
-			AST_LIST_INSERT_TAIL(&users, vmu, list);
-		}
+	if ((vmu = ast_calloc(1, sizeof(*vmu)))) {
+		ast_copy_string(vmu->context, context, sizeof(vmu->context));
+		ast_copy_string(vmu->mailbox, mbox, sizeof(vmu->mailbox));
+		AST_LIST_INSERT_TAIL(&users, vmu, list);
 	}
 	return vmu;
 }

Modified: team/oej/fixtoheader-1.4/autoconf/ast_check_gnu_make.m4
URL: http://svn.digium.com/svn-view/asterisk/team/oej/fixtoheader-1.4/autoconf/ast_check_gnu_make.m4?view=diff&rev=181648&r1=181647&r2=181648
==============================================================================
--- team/oej/fixtoheader-1.4/autoconf/ast_check_gnu_make.m4 (original)
+++ team/oej/fixtoheader-1.4/autoconf/ast_check_gnu_make.m4 Thu Mar 12 09:31:58 2009
@@ -1,20 +1,20 @@
-AC_DEFUN([AST_CHECK_GNU_MAKE], [AC_CACHE_CHECK(for GNU make, GNU_MAKE,
-   GNU_MAKE='Not Found' ;
-   GNU_MAKE_VERSION_MAJOR=0 ;
-   GNU_MAKE_VERSION_MINOR=0 ;
+AC_DEFUN([AST_CHECK_GNU_MAKE], [AC_CACHE_CHECK([for GNU make], [ac_cv_GNU_MAKE],
+   ac_cv_GNU_MAKE='Not Found' ;
+   ac_cv_GNU_MAKE_VERSION_MAJOR=0 ;
+   ac_cv_GNU_MAKE_VERSION_MINOR=0 ;
    for a in make gmake gnumake ; do
       if test -z "$a" ; then continue ; fi ;
       if ( sh -c "$a --version" 2> /dev/null | grep GNU  2>&1 > /dev/null ) ;  then
-         GNU_MAKE=$a ;
-         GNU_MAKE_VERSION_MAJOR=`$GNU_MAKE --version | grep "GNU Make" | cut -f3 -d' ' | cut -f1 -d'.'`
-         GNU_MAKE_VERSION_MINOR=`$GNU_MAKE --version | grep "GNU Make" | cut -f2 -d'.' | cut -c1-2`
+         ac_cv_GNU_MAKE=$a ;
+         ac_cv_GNU_MAKE_VERSION_MAJOR=`$ac_cv_GNU_MAKE --version | grep "GNU Make" | cut -f3 -d' ' | cut -f1 -d'.'`
+         ac_cv_GNU_MAKE_VERSION_MINOR=`$ac_cv_GNU_MAKE --version | grep "GNU Make" | cut -f2 -d'.' | cut -c1-2`
          break;
       fi
    done ;
 ) ;
-if test  "x$GNU_MAKE" = "xNot Found"  ; then
+if test  "x$ac_cv_GNU_MAKE" = "xNot Found"  ; then
    AC_MSG_ERROR( *** Please install GNU make.  It is required to build Asterisk!)
    exit 1
 fi
-AC_SUBST([GNU_MAKE])
+AC_SUBST([GNU_MAKE], [$ac_cv_GNU_MAKE])
 ])

Modified: team/oej/fixtoheader-1.4/autoconf/ast_check_pwlib.m4
URL: http://svn.digium.com/svn-view/asterisk/team/oej/fixtoheader-1.4/autoconf/ast_check_pwlib.m4?view=diff&rev=181648&r1=181647&r2=181648
==============================================================================
--- team/oej/fixtoheader-1.4/autoconf/ast_check_pwlib.m4 (original)
+++ team/oej/fixtoheader-1.4/autoconf/ast_check_pwlib.m4 Thu Mar 12 09:31:58 2009
@@ -103,12 +103,12 @@
     else
       AC_CHECK_HEADER(/usr/local/include/ptlib.h, HAS_PWLIB=1, )
       if test "${HAS_PWLIB:-unset}" != "unset" ; then
-        AC_PATH_PROG(PTLIB_CONFIG, ptlib-config, , /usr/local/bin)
-        if test "${PTLIB_CONFIG:-unset}" = "unset" ; then
-          AC_PATH_PROG(PTLIB_CONFIG, ptlib-config, , /usr/local/share/pwlib/make)
+        AC_PATH_PROG(PTLIB_CONFIG, ptlib-config, , /usr/local/bin$PATH_SEPARATOR/usr/local/share/pwlib/make)
+        PWLIB_INCDIR="/usr/local/include"
+        PWLIB_LIBDIR=`${PTLIB_CONFIG} --pwlibdir 2>/dev/null`
+        if test "${PWLIB_LIBDIR:-unset}" = "unset"; then
+          PWLIB_LIBDIR=`${PTLIB_CONFIG} --ptlibdir 2>/dev/null`
         fi
-        PWLIB_INCDIR="/usr/local/include"
-        PWLIB_LIBDIR=`${PTLIB_CONFIG} --pwlibdir`
         if test "${PWLIB_LIBDIR:-unset}" = "unset"; then
           if test "x$LIB64" != "x"; then
             PWLIB_LIBDIR="/usr/local/lib64"
@@ -121,9 +121,12 @@
       else
         AC_CHECK_HEADER(/usr/include/ptlib.h, HAS_PWLIB=1, )
         if test "${HAS_PWLIB:-unset}" != "unset" ; then
-          AC_PATH_PROG(PTLIB_CONFIG, ptlib-config, , /usr/share/pwlib/make)
+          AC_PATH_PROG(PTLIB_CONFIG, ptlib-config, , /usr/bin$PATH_SEPARATOR/usr/share/pwlib/make)
           PWLIB_INCDIR="/usr/include"
-          PWLIB_LIBDIR=`${PTLIB_CONFIG} --pwlibdir`
+          PWLIB_LIBDIR=`${PTLIB_CONFIG} --pwlibdir 2>/dev/null`
+          if test "${PWLIB_LIBDIR:-unset}" = "unset"; then
+            PWLIB_LIBDIR=`${PTLIB_CONFIG} --ptlibdir 2>/dev/null`
+          fi
           if test "${PWLIB_LIBDIR:-unset}" = "unset"; then
             if test "x$LIB64" != "x"; then
               PWLIB_LIBDIR="/usr/lib64"
@@ -188,8 +191,14 @@
 ])
 
 AC_DEFUN([AST_CHECK_PWLIB_VERSION], [
+	if test "x$7" != "x"; then
+	   	VNAME="$7"
+       	else
+	   	VNAME="$2_VERSION"
+	fi
+
 	if test "${HAS_$2:-unset}" != "unset"; then
-		$2_VERSION=`grep "$2_VERSION" ${$2_INCDIR}/$3 | sed -e 's/[[[:space:]]]\{1,\}/ /g' | cut -f3 -d ' ' | sed -e 's/"//g'`
+		$2_VERSION=`grep "$VNAME" ${$2_INCDIR}/$3 | sed -e 's/[[[:space:]]]\{1,\}/ /g' | cut -f3 -d ' ' | sed -e 's/"//g'`
 		$2_MAJOR_VERSION=`echo ${$2_VERSION} | cut -f1 -d.`
 		$2_MINOR_VERSION=`echo ${$2_VERSION} | cut -f2 -d.`
 		$2_BUILD_NUMBER=`echo ${$2_VERSION} | cut -f3 -d.`

Modified: team/oej/fixtoheader-1.4/autoconf/ast_prog_sed.m4
URL: http://svn.digium.com/svn-view/asterisk/team/oej/fixtoheader-1.4/autoconf/ast_prog_sed.m4?view=diff&rev=181648&r1=181647&r2=181648
==============================================================================
--- team/oej/fixtoheader-1.4/autoconf/ast_prog_sed.m4 (original)
+++ team/oej/fixtoheader-1.4/autoconf/ast_prog_sed.m4 Thu Mar 12 09:31:58 2009
@@ -12,7 +12,7 @@
      done
      echo "$ac_script" | sed 99q >conftest.sed
      $as_unset ac_script || ac_script=
-     _AC_PATH_PROG_FEATURE_CHECK(SED, [sed gsed],
+     ifdef([_AC_PATH_PROGS_FEATURE_CHECK], [_AC_PATH_PROGS_FEATURE_CHECK], [_AC_PATH_PROG_FEATURE_CHECK])(SED, [sed gsed],
 	[_AC_FEATURE_CHECK_LENGTH([ac_path_SED], [ac_cv_path_SED],
 		["$ac_path_SED" -f conftest.sed])])])
  SED="$ac_cv_path_SED"

Modified: team/oej/fixtoheader-1.4/channels/chan_dahdi.c
URL: http://svn.digium.com/svn-view/asterisk/team/oej/fixtoheader-1.4/channels/chan_dahdi.c?view=diff&rev=181648&r1=181647&r2=181648
==============================================================================
--- team/oej/fixtoheader-1.4/channels/chan_dahdi.c (original)
+++ team/oej/fixtoheader-1.4/channels/chan_dahdi.c Thu Mar 12 09:31:58 2009
@@ -12087,13 +12087,11 @@
 	cfg = ast_config_load("users.conf");
 	if (cfg) {
 		char *cat;
-		const char *chans;
 		process_dahdi(&conf, "", ast_variable_browse(cfg, "general"), 1, 1);
 		for (cat = ast_category_browse(cfg, NULL); cat ; cat = ast_category_browse(cfg, cat)) {
 			if (!strcasecmp(cat, "general"))
 				continue;
-			chans = ast_variable_retrieve(cfg, cat, "dahdichan");
-			if (!ast_strlen_zero(chans)) {
+			if (!ast_strlen_zero(ast_variable_retrieve(cfg, cat, "dahdichan")) || !ast_strlen_zero(ast_variable_retrieve(cfg, cat, "zapchan"))) {
 				struct dahdi_chan_conf sect_conf;
 				memcpy(&sect_conf, &conf, sizeof(sect_conf));
 

Modified: team/oej/fixtoheader-1.4/channels/chan_gtalk.c
URL: http://svn.digium.com/svn-view/asterisk/team/oej/fixtoheader-1.4/channels/chan_gtalk.c?view=diff&rev=181648&r1=181647&r2=181648
==============================================================================
--- team/oej/fixtoheader-1.4/channels/chan_gtalk.c (original)
+++ team/oej/fixtoheader-1.4/channels/chan_gtalk.c Thu Mar 12 09:31:58 2009
@@ -49,6 +49,7 @@
 #include <sys/signal.h>
 #include <iksemel.h>
 #include <pthread.h>
+#include <ctype.h>
 
 #ifdef HAVE_GNUTLS
 #include <gcrypt.h>
@@ -411,6 +412,7 @@
 	int pref_codec = 0;
 	int alreadysent = 0;
 	int codecs_num = 0;
+	char *lowerto = NULL;
 
 	iq = iks_new("iq");
 	gtalk = iks_new("session");
@@ -462,7 +464,14 @@
 
 	iks_insert_attrib(gtalk, "xmlns", "http://www.google.com/session");
 	iks_insert_attrib(gtalk, "type",initiator ? "initiate": "accept");
-	iks_insert_attrib(gtalk, "initiator", initiator ? from : to);
+	/* put the initiator attribute to lower case if we receive the call 
+	 * otherwise GoogleTalk won't establish the session */
+	if (!initiator) {
+	        char c;
+	        char *t = lowerto = ast_strdupa(to);
+		while (((c = *t) != '/') && (*t++ = tolower(c)));
+	}
+	iks_insert_attrib(gtalk, "initiator", initiator ? from : lowerto);
 	iks_insert_attrib(gtalk, "id", sid);
 	iks_insert_node(iq, gtalk);
 	iks_insert_node(gtalk, dcodecs);
@@ -481,6 +490,8 @@
 static int gtalk_invite_response(struct gtalk_pvt *p, char *to , char *from, char *sid, int initiator)
 {
 	iks *iq, *session, *transport;
+	char *lowerto = NULL;
+
 	iq = iks_new("iq");
 	session = iks_new("session");
 	transport = iks_new("transport");
@@ -501,7 +512,14 @@
 	ast_aji_increment_mid(p->parent->connection->mid);
 	iks_insert_attrib(session, "type", "transport-accept");
 	iks_insert_attrib(session, "id", sid);
-	iks_insert_attrib(session, "initiator", initiator ? from : to);
+	/* put the initiator attribute to lower case if we receive the call 
+	 * otherwise GoogleTalk won't establish the session */
+	if (!initiator) {
+	        char c;
+		char *t = lowerto = ast_strdupa(to);
+		while (((c = *t) != '/') && (*t++ = tolower(c)));
+	}
+	iks_insert_attrib(session, "initiator", initiator ? from : lowerto);
 	iks_insert_attrib(session, "xmlns", "http://www.google.com/session");
 	iks_insert_attrib(transport, "xmlns", "http://www.google.com/transport/p2p");
 	iks_insert_node(iq,session);
@@ -795,6 +813,7 @@
 	struct in_addr us;
 	iks *iq, *gtalk, *candidate, *transport;
 	char user[17], pass[17], preference[5], port[7];
+	char *lowerfrom = NULL;
 
 
 	iq = iks_new("iq");
@@ -873,7 +892,14 @@
 		ast_aji_increment_mid(c->mid);
 		iks_insert_attrib(gtalk, "type", "transport-info");
 		iks_insert_attrib(gtalk, "id", sid);
-		iks_insert_attrib(gtalk, "initiator", (p->initiator) ? to : from);
+		/* put the initiator attribute to lower case if we receive the call 
+		 * otherwise GoogleTalk won't establish the session */
+		if (!p->initiator) {
+		        char c;
+			char *t = lowerfrom = ast_strdupa(from);
+			while (((c = *t) != '/') && (*t++ = tolower(c)));
+		}
+		iks_insert_attrib(gtalk, "initiator", (p->initiator) ? to : lowerfrom);
 		iks_insert_attrib(gtalk, "xmlns", GOOGLE_NS);
 		iks_insert_attrib(candidate, "name", tmp->name);
 		iks_insert_attrib(candidate, "address", tmp->ip);
@@ -1074,6 +1100,7 @@
 {
 	iks *request, *session = NULL;
 	int res = -1;
+	char *lowerthem = NULL;
 
 	request = iks_new("iq");
 	if (request) {
@@ -1086,7 +1113,14 @@
 		if (session) {
 			iks_insert_attrib(session, "type", action);
 			iks_insert_attrib(session, "id", p->sid);
-			iks_insert_attrib(session, "initiator", p->initiator ? p->us : p->them);
+			/* put the initiator attribute to lower case if we receive the call 
+			 * otherwise GoogleTalk won't establish the session */
+			if (!p->initiator) {
+			        char c;
+				char *t = lowerthem = ast_strdupa(p->them);
+				while (((c = *t) != '/') && (*t++ = tolower(c)));
+			}
+			iks_insert_attrib(session, "initiator", p->initiator ? p->us : lowerthem);
 			iks_insert_attrib(session, "xmlns", "http://www.google.com/session");
 			iks_insert_node(request, session);
 			iks_send(client->connection->p, request);
@@ -1500,6 +1534,7 @@
 	struct gtalk *client = p->parent;
 	iks *iq, *gtalk, *dtmf;
 	char buffer[2] = {digit, '\0'};
+	char *lowerthem = NULL;
 	iq = iks_new("iq");
 	gtalk = iks_new("gtalk");
 	dtmf = iks_new("dtmf");
@@ -1521,7 +1556,14 @@
 	ast_aji_increment_mid(client->connection->mid);
 	iks_insert_attrib(gtalk, "xmlns", "http://jabber.org/protocol/gtalk");
 	iks_insert_attrib(gtalk, "action", "session-info");
-	iks_insert_attrib(gtalk, "initiator", p->initiator ? p->us: p->them);
+	/* put the initiator attribute to lower case if we receive the call 
+	 * otherwise GoogleTalk won't establish the session */
+	if (!p->initiator) {
+	        char c;
+	        char *t = lowerthem = ast_strdupa(p->them);
+	        while (((c = *t) != '/') && (*t++ = tolower(c)));
+	}
+	iks_insert_attrib(gtalk, "initiator", p->initiator ? p->us: lowerthem);
 	iks_insert_attrib(gtalk, "sid", p->sid);
 	iks_insert_attrib(dtmf, "xmlns", "http://jabber.org/protocol/gtalk/info/dtmf");
 	iks_insert_attrib(dtmf, "code", buffer);

Modified: team/oej/fixtoheader-1.4/channels/chan_iax2.c
URL: http://svn.digium.com/svn-view/asterisk/team/oej/fixtoheader-1.4/channels/chan_iax2.c?view=diff&rev=181648&r1=181647&r2=181648
==============================================================================
--- team/oej/fixtoheader-1.4/channels/chan_iax2.c (original)
+++ team/oej/fixtoheader-1.4/channels/chan_iax2.c Thu Mar 12 09:31:58 2009
@@ -175,7 +175,7 @@
 int (*iax2_regfunk)(const char *username, int onoff) = NULL;
 
 /* Ethernet, etc */
-#define IAX_CAPABILITY_FULLBANDWIDTH 	0xFFFF
+#define IAX_CAPABILITY_FULLBANDWIDTH 	(0xFFFF & ~AST_FORMAT_AUDIO_UNDEFINED)
 /* T1, maybe ISDN */
 #define IAX_CAPABILITY_MEDBANDWIDTH 	(IAX_CAPABILITY_FULLBANDWIDTH & 	\
 					 ~AST_FORMAT_SLINEAR &			\
@@ -576,7 +576,9 @@
 	int encmethods;
 	/*! Encryption AES-128 Key */
 	aes_encrypt_ctx ecx;
-	/*! Decryption AES-128 Key */
+	/*! Decryption AES-128 Key corresponding to ecx */
+	aes_decrypt_ctx mydcx;
+	/*! Decryption AES-128 Key used to decrypt peer frames */
 	aes_decrypt_ctx dcx;
 	/*! 32 bytes of semi-random data */
 	unsigned char semirand[32];
@@ -868,6 +870,11 @@
 static struct iax2_user *build_user(const char *name, struct ast_variable *v, struct ast_variable *alt, int temponly);
 static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, time_t regtime);
 static void prune_peers(void);
+static void prune_users(void);
+static int decode_frame(aes_decrypt_ctx *dcx, struct ast_iax2_full_hdr *fh, struct ast_frame *f, int *datalen);
+static int encrypt_frame(aes_encrypt_ctx *ecx, struct ast_iax2_full_hdr *fh, unsigned char *poo, int *datalen);
+static void build_ecx_key(const unsigned char *digest, struct chan_iax2_pvt *pvt);
+ 
 
 static const struct ast_channel_tech iax2_tech = {
 	.type = "IAX2",
@@ -1183,6 +1190,15 @@
 {
 	ao2_ref(peer, -1);
 	return NULL;
+}
+
+static struct iax2_user *find_user(const char *name)
+{
+	struct iax2_user tmp_user = {
+		.name = name,
+	};
+
+	return ao2_find(users, &tmp_user, OBJ_POINTER);
 }
 
 static inline struct iax2_user *user_ref(struct iax2_user *user)
@@ -2244,11 +2260,22 @@
 {
 	/* Called with iaxsl lock held, and iaxs[callno] non-NULL */
 	struct ast_iax2_full_hdr *fh = f->data;
+	struct ast_frame af;
+
+	/* if frame is encrypted. decrypt before updating it. */
+	if (f->encmethods) {
+		decode_frame(&f->mydcx, fh, &af, &f->datalen);
+	}
 	/* Mark this as a retransmission */
 	fh->dcallno = ntohs(IAX_FLAG_RETRANS | f->dcallno);
 	/* Update iseqno */
 	f->iseqno = iaxs[f->callno]->iseqno;
 	fh->iseqno = f->iseqno;
+
+	/* Now re-encrypt the frame */
+	if (f->encmethods) {
+		encrypt_frame(&f->ecx, fh, f->semirand, &f->datalen);
+	}
 	return 0;
 }
 
@@ -2345,26 +2372,44 @@
 
 static int iax2_prune_realtime(int fd, int argc, char *argv[])
 {
-	struct iax2_peer *peer;
+	struct iax2_peer *peer = NULL;
+	struct iax2_user *user = NULL;
 
 	if (argc != 4)
         return RESULT_SHOWUSAGE;
 	if (!strcmp(argv[3],"all")) {
-		reload_config();
+		prune_users();
+		prune_peers();
 		ast_cli(fd, "OK cache is flushed.\n");
-	} else if ((peer = find_peer(argv[3], 0))) {
-		if(ast_test_flag(peer, IAX_RTCACHEFRIENDS)) {
-			ast_set_flag(peer, IAX_RTAUTOCLEAR);
-			expire_registry(peer_ref(peer));
-			ast_cli(fd, "OK peer %s was removed from the cache.\n", argv[3]);
-		} else {
-			ast_cli(fd, "SORRY peer %s is not eligible for this operation.\n", argv[3]);
-		}
-		peer_unref(peer);
+		return RESULT_SUCCESS;
+	}
+	peer = find_peer(argv[3], 0);
+	user = find_user(argv[3]);
+	if (peer || user) {
+		if (peer) {
+			if (ast_test_flag(peer, IAX_RTCACHEFRIENDS)) {
+				ast_set_flag(peer, IAX_RTAUTOCLEAR);
+				expire_registry(peer_ref(peer));
+				ast_cli(fd, "Peer %s was removed from the cache.\n", argv[3]);
+			} else {
+				ast_cli(fd, "Peer %s is not eligible for this operation.\n", argv[3]);
+			}
+			peer_unref(peer);
+		}
+		if (user) {
+			if (ast_test_flag(user, IAX_RTCACHEFRIENDS)) {
+				ast_set_flag(user, IAX_RTAUTOCLEAR);
+				ast_cli(fd, "User %s was removed from the cache.\n", argv[3]);
+			} else {
+				ast_cli(fd, "User %s is not eligible for this operation.\n", argv[3]);
+			}
+			ao2_unlink(users,user);
+			user_unref(user);
+		}
 	} else {
-		ast_cli(fd, "SORRY peer %s was not found in the cache.\n", argv[3]);
-	}
-	
+		ast_cli(fd, "%s was not found in the cache.\n", argv[3]);
+	}
+
 	return RESULT_SUCCESS;
 }
 
@@ -3749,7 +3794,7 @@
 			res = AST_BRIDGE_COMPLETE;
 			break;
 		}
-		if ((f->frametype == AST_FRAME_CONTROL) && !(flags & AST_BRIDGE_IGNORE_SIGS)) {
+		if ((f->frametype == AST_FRAME_CONTROL) && !(flags & AST_BRIDGE_IGNORE_SIGS) && (f->subclass != AST_CONTROL_SRCUPDATE)) {
 			*fo = f;
 			*rc = who;
 			res =  AST_BRIDGE_COMPLETE;
@@ -3757,10 +3802,11 @@
 		}
 		other = (who == c0) ? c1 : c0;  /* the 'other' channel */
 		if ((f->frametype == AST_FRAME_VOICE) ||
-		    (f->frametype == AST_FRAME_TEXT) ||
-		    (f->frametype == AST_FRAME_VIDEO) || 
-		    (f->frametype == AST_FRAME_IMAGE) ||
-		    (f->frametype == AST_FRAME_DTMF)) {
+			(f->frametype == AST_FRAME_TEXT) ||
+			(f->frametype == AST_FRAME_VIDEO) || 
+			(f->frametype == AST_FRAME_IMAGE) ||
+			(f->frametype == AST_FRAME_DTMF) ||
+			(f->frametype == AST_FRAME_CONTROL)) {
 			/* monitored dtmf take out of the bridge.
 			 * check if we monitor the specific source.
 			 */
@@ -4260,10 +4306,19 @@
 	return 0;
 }
 
-static void build_enc_keys(const unsigned char *digest, aes_encrypt_ctx *ecx, aes_decrypt_ctx *dcx)
-{
-	aes_encrypt_key128(digest, ecx);
-	aes_decrypt_key128(digest, dcx);
+static void build_encryption_keys(const unsigned char *digest, struct chan_iax2_pvt *pvt)
+{
+	build_ecx_key(digest, pvt);
+	aes_decrypt_key128(digest, &pvt->dcx);
+}
+  
+static void build_ecx_key(const unsigned char *digest, struct chan_iax2_pvt *pvt)
+{
+	/* it is required to hold the corresponding decrypt key to our encrypt key
+	 * in the pvt struct because queued frames occasionally need to be decrypted and
+	 * re-encrypted when updated for a retransmission */
+	aes_encrypt_key128(digest, &pvt->ecx);
+	aes_decrypt_key128(digest, &pvt->mydcx);
 }
 
 static void memcpy_decrypt(unsigned char *dst, const unsigned char *src, int len, aes_decrypt_ctx *dcx)
@@ -4416,7 +4471,7 @@
 			MD5Update(&md5, (unsigned char *)iaxs[callno]->challenge, strlen(iaxs[callno]->challenge));
 			MD5Update(&md5, (unsigned char *)tmppw, strlen(tmppw));
 			MD5Final(digest, &md5);
-			build_enc_keys(digest, &iaxs[callno]->ecx, &iaxs[callno]->dcx);
+			build_encryption_keys(digest, iaxs[callno]);
 			res = decode_frame(&iaxs[callno]->dcx, fh, f, datalen);
 			if (!res) {
 				ast_set_flag(iaxs[callno], IAX_KEYPOPULATED);
@@ -4511,6 +4566,7 @@
 	fr->callno = pvt->callno;
 	fr->transfer = transfer;
 	fr->final = final;
+	fr->encmethods = 0;
 	if (!sendmini) {
 		/* We need a full frame */
 		if (seqno > -1)
@@ -4564,6 +4620,10 @@
 						iax_showframe(fr, NULL, 2, &pvt->addr, fr->datalen - sizeof(struct ast_iax2_full_hdr));
 				}
 				encrypt_frame(&pvt->ecx, fh, pvt->semirand, &fr->datalen);
+				fr->encmethods = pvt->encmethods;
+				fr->ecx = pvt->ecx;
+				fr->mydcx = pvt->mydcx;
+				memcpy(fr->semirand, pvt->semirand, sizeof(fr->semirand));
 			} else
 				ast_log(LOG_WARNING, "Supposed to send packet encrypted, but no key?\n");
 		}
@@ -5756,7 +5816,7 @@
 	return res;
 }
 
-static int authenticate(const char *challenge, const char *secret, const char *keyn, int authmethods, struct iax_ie_data *ied, struct sockaddr_in *sin, aes_encrypt_ctx *ecx, aes_decrypt_ctx *dcx)
+static int authenticate(const char *challenge, const char *secret, const char *keyn, int authmethods, struct iax_ie_data *ied, struct sockaddr_in *sin, struct chan_iax2_pvt *pvt)
 {
 	int res = -1;
 	int x;
@@ -5796,8 +5856,9 @@
 			/* If they support md5, authenticate with it.  */
 			for (x=0;x<16;x++)
 				sprintf(digres + (x << 1),  "%2.2x", digest[x]); /* safe */
-			if (ecx && dcx)
-				build_enc_keys(digest, ecx, dcx);
+			if (pvt) {
+				build_encryption_keys(digest, pvt);
+			}
 			iax_ie_append_str(ied, IAX_IE_MD5_RESULT, digres);
 			res = 0;
 		} else if (authmethods & IAX_AUTH_PLAINTEXT) {
@@ -5838,7 +5899,7 @@
 	/* Check for override RSA authentication first */
 	if (!ast_strlen_zero(override) || !ast_strlen_zero(okey)) {
 		/* Normal password authentication */
-		res = authenticate(p->challenge, override, okey, authmethods, &ied, sin, &p->ecx, &p->dcx);
+		res = authenticate(p->challenge, override, okey, authmethods, &ied, sin, p);
 	} else {
 		struct ao2_iterator i = ao2_iterator_init(peers, 0);
 		while ((peer = ao2_iterator_next(&i))) {
@@ -5849,7 +5910,7 @@

[... 7349 lines stripped ...]



More information about the svn-commits mailing list