[asterisk-commits] oej: branch oej/darjeeling-prack-1.8 r428143 - in /team/oej/darjeeling-prack-...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon Nov 17 10:41:01 CST 2014
Author: oej
Date: Mon Nov 17 10:40:50 2014
New Revision: 428143
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=428143
Log:
Resolving conflict, resetting automerge
Added:
team/oej/darjeeling-prack-1.8/contrib/Makefile
- copied unchanged from r427380, branches/1.8/contrib/Makefile
Modified:
team/oej/darjeeling-prack-1.8/ (props changed)
team/oej/darjeeling-prack-1.8/Makefile
team/oej/darjeeling-prack-1.8/apps/app_voicemail.c
team/oej/darjeeling-prack-1.8/channels/chan_sip.c
team/oej/darjeeling-prack-1.8/channels/sip/include/reqresp_parser.h
team/oej/darjeeling-prack-1.8/channels/sip/reqresp_parser.c
team/oej/darjeeling-prack-1.8/include/asterisk/stringfields.h
team/oej/darjeeling-prack-1.8/main/app.c
team/oej/darjeeling-prack-1.8/main/utils.c
Propchange: team/oej/darjeeling-prack-1.8/
------------------------------------------------------------------------------
automerge = Is-there-life-off-net?
Propchange: team/oej/darjeeling-prack-1.8/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Mon Nov 17 10:40:50 2014
@@ -1,1 +1,1 @@
-/branches/1.8:1-426494
+/branches/1.8:1-428142
Modified: team/oej/darjeeling-prack-1.8/Makefile
URL: http://svnview.digium.com/svn/asterisk/team/oej/darjeeling-prack-1.8/Makefile?view=diff&rev=428143&r1=428142&r2=428143
==============================================================================
--- team/oej/darjeeling-prack-1.8/Makefile (original)
+++ team/oej/darjeeling-prack-1.8/Makefile Mon Nov 17 10:40:50 2014
@@ -216,7 +216,7 @@
_ASTCFLAGS+=$(OPTIONS)
MOD_SUBDIRS:=channels pbx apps codecs formats cdr cel bridges funcs tests main res addons $(LOCAL_MOD_SUBDIRS)
-OTHER_SUBDIRS:=utils agi
+OTHER_SUBDIRS:=utils agi contrib
SUBDIRS:=$(OTHER_SUBDIRS) $(MOD_SUBDIRS)
SUBDIRS_INSTALL:=$(SUBDIRS:%=%-install)
SUBDIRS_CLEAN:=$(SUBDIRS:%=%-clean)
@@ -685,7 +685,7 @@
rm -f contrib/scripts/asterisk.logrotate.tmp
config:
- @if [ "${OSARCH}" = "linux-gnu" ]; then \
+ @if [ "${OSARCH}" = "linux-gnu" -o "${OSARCH}" = "kfreebsd-gnu" ]; then \
if [ -f /etc/redhat-release -o -f /etc/fedora-release ]; then \
cat contrib/init.d/rc.redhat.asterisk | sed 's|__ASTERISK_ETC_DIR__|$(ASTETCDIR)|;s|__ASTERISK_SBIN_DIR__|$(ASTSBINDIR)|;s|__ASTERISK_VARRUN_DIR__|$(ASTVARRUNDIR)|;' > contrib/init.d/rc.asterisk.tmp ; \
$(INSTALL) -m 755 contrib/init.d/rc.asterisk.tmp "$(DESTDIR)/etc/rc.d/init.d/asterisk" ; \
Modified: team/oej/darjeeling-prack-1.8/apps/app_voicemail.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/darjeeling-prack-1.8/apps/app_voicemail.c?view=diff&rev=428143&r1=428142&r2=428143
==============================================================================
--- team/oej/darjeeling-prack-1.8/apps/app_voicemail.c (original)
+++ team/oej/darjeeling-prack-1.8/apps/app_voicemail.c Mon Nov 17 10:40:50 2014
@@ -706,7 +706,8 @@
#ifdef IMAP_STORAGE
ast_mutex_t lock;
int updated; /*!< decremented on each mail check until 1 -allows delay */
- long msgArray[VMSTATE_MAX_MSG_ARRAY];
+ long *msgArray;
+ unsigned msg_array_max;
MAILSTREAM *mailstream;
int vmArrayIndex;
char imapuser[80]; /*!< IMAP server login */
@@ -2115,6 +2116,7 @@
free_user(vmu);
return -1;
}
+ ast_assert(msgnum < vms->msg_array_max);
/* check if someone is accessing this box right now... */
vms_p = get_vm_state_by_imapuser(vmu->imapuser, 1);
@@ -2739,6 +2741,17 @@
}
ast_debug(3, "saving mailbox message number %lu as message %d. Interactive set to %d\n", number, vms->vmArrayIndex, vms->interactive);
+
+ /* Ensure we have room for the next message. */
+ if (vms->vmArrayIndex >= vms->msg_array_max) {
+ long *new_mem = ast_realloc(vms->msgArray, 2 * vms->msg_array_max * sizeof(long));
+ if (!new_mem) {
+ return;
+ }
+ vms->msgArray = new_mem;
+ vms->msg_array_max *= 2;
+ }
+
vms->msgArray[vms->vmArrayIndex++] = number;
}
@@ -3016,6 +3029,7 @@
}
if (option_debug > 4)
ast_log(AST_LOG_DEBUG, "Adding new vmstate for %s\n", vmu->imapuser);
+ /* XXX: Is this correctly freed always? */
if (!(vms_p = ast_calloc(1, sizeof(*vms_p))))
return NULL;
ast_copy_string(vms_p->imapuser, vmu->imapuser, sizeof(vms_p->imapuser));
@@ -3128,6 +3142,7 @@
vms->newmessages = altvms->newmessages;
vms->oldmessages = altvms->oldmessages;
vms->vmArrayIndex = altvms->vmArrayIndex;
+ /* XXX: no msgArray copying? */
vms->lastmsg = altvms->lastmsg;
vms->curmsg = altvms->curmsg;
/* get a pointer to the persistent store */
@@ -3186,10 +3201,14 @@
if (vc) {
ast_mutex_destroy(&vc->vms->lock);
+ ast_free(vc->vms->msgArray);
+ vc->vms->msgArray = NULL;
+ vc->vms->msg_array_max = 0;
+ /* XXX: is no one supposed to free vms itself? */
ast_free(vc);
- }
- else
+ } else {
ast_log(AST_LOG_ERROR, "No vmstate found for user:%s, mailbox %s\n", vms->imapuser, vms->username);
+ }
}
static void set_update(MAILSTREAM * stream)
@@ -3211,11 +3230,13 @@
static void init_vm_state(struct vm_state *vms)
{
- int x;
+ vms->msg_array_max = VMSTATE_MAX_MSG_ARRAY;
+ vms->msgArray = ast_calloc(vms->msg_array_max, sizeof(long));
+ if (!vms->msgArray) {
+ /* Out of mem? This can't be good. */
+ vms->msg_array_max = 0;
+ }
vms->vmArrayIndex = 0;
- for (x = 0; x < VMSTATE_MAX_MSG_ARRAY; x++) {
- vms->msgArray[x] = 0;
- }
ast_mutex_init(&vms->lock);
}
Modified: team/oej/darjeeling-prack-1.8/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/darjeeling-prack-1.8/channels/chan_sip.c?view=diff&rev=428143&r1=428142&r2=428143
==============================================================================
--- team/oej/darjeeling-prack-1.8/channels/chan_sip.c (original)
+++ team/oej/darjeeling-prack-1.8/channels/chan_sip.c Mon Nov 17 10:40:50 2014
@@ -21267,6 +21267,8 @@
}
break;
+ case 414: /* Bad request URI */
+ case 493: /* Undecipherable */
case 404: /* Not found */
xmitres = transmit_request(p, SIP_ACK, seqno, XMIT_UNRELIABLE, FALSE);
if (p->owner && !req->ignore) {
@@ -21489,12 +21491,16 @@
ASTOBJ_UNREF(p->mwi, sip_subscribe_mwi_destroy);
pvt_set_needdestroy(p, "received 481 response");
break;
+
+ case 400: /* Bad Request */
+ case 414: /* Request URI too long */
+ case 493: /* Undecipherable */
case 500:
case 501:
ast_log(LOG_WARNING, "Subscription failed for MWI. The remote side may have suffered a heart attack.\n");
p->mwi->call = NULL;
ASTOBJ_UNREF(p->mwi, sip_subscribe_mwi_destroy);
- pvt_set_needdestroy(p, "received 500/501 response");
+ pvt_set_needdestroy(p, "received serious error (500/501/493/414/400) response");
break;
}
}
@@ -21668,11 +21674,14 @@
}
manager_event(EVENT_FLAG_SYSTEM, "Registry", "ChannelType: SIP\r\nUsername: %s\r\nDomain: %s\r\nStatus: %s\r\n", r->username, r->hostname, regstate2str(r->regstate));
break;
- case 479: /* SER: Not able to process the URI - address is wrong in register*/
- ast_log(LOG_WARNING, "Got error 479 on register to %s@%s, giving up (check config)\n", p->registry->username, p->registry->hostname);
- pvt_set_needdestroy(p, "received 479 response");
+ case 400: /* Bad request */
+ case 414: /* Request URI too long */
+ case 493: /* Undecipherable */
+ case 479: /* Kamailio/OpenSIPS: Not able to process the URI - address is wrong in register*/
+ ast_log(LOG_WARNING, "Got error %d on register to %s@%s, giving up (check config)\n", resp, p->registry->username, p->registry->hostname);
+ pvt_set_needdestroy(p, "received 4xx response");
if (r->call)
- r->call = dialog_unref(r->call, "unsetting registry->call pointer-- case 479");
+ r->call = dialog_unref(r->call, "unsetting registry->call pointer-- case 4xx");
r->regstate = REG_STATE_REJECTED;
AST_SCHED_DEL_UNREF(sched, r->timeout, registry_unref(r, "reg ptr unref from handle_response_register 479"));
break;
@@ -22141,6 +22150,9 @@
pvt_set_needdestroy(p, "received 403 response");
}
break;
+ case 400: /* Bad Request */
+ case 414: /* Request URI too long */
+ case 493: /* Undecipherable */
case 404: /* Not found */
if (p->registry && sipmethod == SIP_REGISTER)
handle_response_register(p, resp, rest, req, seqno);
@@ -23420,7 +23432,9 @@
int reinvite = 0;
struct ast_party_redirecting redirecting;
struct ast_set_party_redirecting update_redirecting;
-
+ int supported_start = 0;
+ int require_start = 0;
+ char unsupported[256] = { 0, };
struct {
char exten[AST_MAX_EXTENSION];
char context[AST_MAX_CONTEXT];
@@ -23430,11 +23444,9 @@
/* Find out what they support */
if (!p->sipoptions) {
- int start = 0;
const char *supported = NULL;
-
do {
- supported = __get_header(req, "Supported", &start);
+ supported = __get_header(req, "Supported", &supported_start);
if (!ast_strlen_zero(supported)) {
p->sipoptions |= parse_sip_options(supported, NULL, 0);
}
@@ -23442,23 +23454,26 @@
}
/* Find out what they require */
- required = get_header(req, "Require");
- if (!ast_strlen_zero(required)) {
- char unsupported[256] = { 0, };
- required_profile = parse_sip_options(required, unsupported, ARRAY_LEN(unsupported));
-
- /* If there are any options required that we do not support,
- * then send a 420 with only those unsupported options listed */
- if (!ast_strlen_zero(unsupported)) {
- transmit_response_with_unsupported(p, "420 Bad extension (unsupported)", req, unsupported);
- ast_log(LOG_WARNING, "Received SIP INVITE with unsupported required extension: required:%s unsupported:%s\n", required, unsupported);
- p->invitestate = INV_COMPLETED;
- if (!p->lastinvite)
- sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
- res = 0;
- goto request_invite_cleanup;
- }
- }
+ do {
+ required = __get_header(req, "Require", &require_start);
+ if (!ast_strlen_zero(required)) {
+ required_profile |= parse_sip_options(required, unsupported, ARRAY_LEN(unsupported));
+ }
+ } while (!ast_strlen_zero(required));
+
+ /* If there are any options required that we do not support,
+ * then send a 420 with only those unsupported options listed */
+ if (!ast_strlen_zero(unsupported)) {
+ transmit_response_with_unsupported(p, "420 Bad extension (unsupported)", req, unsupported);
+ ast_log(LOG_WARNING, "Received SIP INVITE with unsupported required extension: required:%s unsupported:%s\n", required, unsupported);
+ p->invitestate = INV_COMPLETED;
+ if (!p->lastinvite) {
+ sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
+ }
+ res = -1;
+ goto request_invite_cleanup;
+ }
+
/* The option tags may be present in Supported: or Require: headers.
Include the Require: option tags for further processing as well */
Modified: team/oej/darjeeling-prack-1.8/channels/sip/include/reqresp_parser.h
URL: http://svnview.digium.com/svn/asterisk/team/oej/darjeeling-prack-1.8/channels/sip/include/reqresp_parser.h?view=diff&rev=428143&r1=428142&r2=428143
==============================================================================
--- team/oej/darjeeling-prack-1.8/channels/sip/include/reqresp_parser.h (original)
+++ team/oej/darjeeling-prack-1.8/channels/sip/include/reqresp_parser.h Mon Nov 17 10:40:50 2014
@@ -152,6 +152,11 @@
* \param option list
* \param unsupported out buffer (optional)
* \param unsupported out buffer length (optional)
+ *
+ * \note Because this function can be called multiple times, it will append
+ * whatever options are specified in \c options to \c unsupported. Callers
+ * of this function should make sure the unsupported buffer is clear before
+ * calling this function.
*/
unsigned int parse_sip_options(const char *options, char *unsupported, size_t unsupported_len);
Modified: team/oej/darjeeling-prack-1.8/channels/sip/reqresp_parser.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/darjeeling-prack-1.8/channels/sip/reqresp_parser.c?view=diff&rev=428143&r1=428142&r2=428143
==============================================================================
--- team/oej/darjeeling-prack-1.8/channels/sip/reqresp_parser.c (original)
+++ team/oej/darjeeling-prack-1.8/channels/sip/reqresp_parser.c Mon Nov 17 10:40:50 2014
@@ -1590,17 +1590,12 @@
size_t outlen = unsupported_len;
char *cur_out = out;
- if (out && (outlen > 0)) {
- memset(out, 0, outlen);
- }
-
if (ast_strlen_zero(options) )
return 0;
temp = ast_strdupa(options);
ast_debug(3, "Begin: parsing SIP \"Required:\" or \"Supported: %s\"\n", options);
-
for (next = temp; next; next = sep) {
found = FALSE;
supported = FALSE;
@@ -1760,6 +1755,7 @@
/* Test with unsupported char buffer */
AST_LIST_TRAVERSE(&testdatalist, testdataptr, list) {
+ memset(unsupported, 0, sizeof(unsupported));
option_profile = parse_sip_options(testdataptr->input_options, unsupported, ARRAY_LEN(unsupported));
if (option_profile != testdataptr->expected_profile ||
strcmp(unsupported, testdataptr->expected_unsupported)) {
Modified: team/oej/darjeeling-prack-1.8/include/asterisk/stringfields.h
URL: http://svnview.digium.com/svn/asterisk/team/oej/darjeeling-prack-1.8/include/asterisk/stringfields.h?view=diff&rev=428143&r1=428142&r2=428143
==============================================================================
--- team/oej/darjeeling-prack-1.8/include/asterisk/stringfields.h (original)
+++ team/oej/darjeeling-prack-1.8/include/asterisk/stringfields.h Mon Nov 17 10:40:50 2014
@@ -319,14 +319,16 @@
const char *__d__ = (data); \
size_t __dlen__ = (__d__) ? strlen(__d__) + 1 : 1; \
ast_string_field *__p__ = (ast_string_field *) (ptr); \
+ ast_string_field target = *__p__; \
if (__dlen__ == 1) { \
__ast_string_field_release_active((x)->__field_mgr_pool, *__p__); \
*__p__ = __ast_string_field_empty; \
} else if ((__dlen__ <= AST_STRING_FIELD_ALLOCATION(*__p__)) || \
(!__ast_string_field_ptr_grow(&(x)->__field_mgr, &(x)->__field_mgr_pool, __dlen__, __p__)) || \
- (*__p__ = __ast_string_field_alloc_space(&(x)->__field_mgr, &(x)->__field_mgr_pool, __dlen__))) { \
- if (*__p__ != (*ptr)) { \
- __ast_string_field_release_active((x)->__field_mgr_pool, (*ptr)); \
+ (target = __ast_string_field_alloc_space(&(x)->__field_mgr, &(x)->__field_mgr_pool, __dlen__))) { \
+ if (target != *__p__) { \
+ __ast_string_field_release_active((x)->__field_mgr_pool, *__p__); \
+ *__p__ = target; \
} \
memcpy(* (void **) __p__, __d__, __dlen__); \
} \
Modified: team/oej/darjeeling-prack-1.8/main/app.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/darjeeling-prack-1.8/main/app.c?view=diff&rev=428143&r1=428142&r2=428143
==============================================================================
--- team/oej/darjeeling-prack-1.8/main/app.c (original)
+++ team/oej/darjeeling-prack-1.8/main/app.c Mon Nov 17 10:40:50 2014
@@ -1121,17 +1121,19 @@
ast_truncstream(others[x]);
ast_closestream(others[x]);
}
- }
-
- if (prepend && outmsg) {
+ } else if (outmsg) {
struct ast_filestream *realfiles[AST_MAX_FORMATS];
struct ast_frame *fr;
for (x = 0; x < fmtcnt; x++) {
snprintf(comment, sizeof(comment), "Opening the real file %s.%s\n", recordfile, sfmt[x]);
realfiles[x] = ast_readfile(recordfile, sfmt[x], comment, O_RDONLY, 0, 0);
- if (!others[x] || !realfiles[x]) {
+ if (!others[x]) {
break;
+ }
+ if (!realfiles[x]) {
+ ast_closestream(others[x]);
+ continue;
}
/*!\note Same logic as above. */
if (dspsilence) {
@@ -1149,7 +1151,15 @@
ast_verb(4, "Recording Format: sfmts=%s, prependfile %s, recordfile %s\n", sfmt[x], prependfile, recordfile);
ast_filedelete(prependfile, sfmt[x]);
}
- }
+ } else {
+ for (x = 0; x < fmtcnt; x++) {
+ if (!others[x]) {
+ break;
+ }
+ ast_closestream(others[x]);
+ }
+ }
+
if (rfmt && ast_set_read_format(chan, rfmt)) {
ast_log(LOG_WARNING, "Unable to restore format %s to channel '%s'\n", ast_getformatname(rfmt), chan->name);
}
Modified: team/oej/darjeeling-prack-1.8/main/utils.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/darjeeling-prack-1.8/main/utils.c?view=diff&rev=428143&r1=428142&r2=428143
==============================================================================
--- team/oej/darjeeling-prack-1.8/main/utils.c (original)
+++ team/oej/darjeeling-prack-1.8/main/utils.c Mon Nov 17 10:40:50 2014
@@ -1919,9 +1919,13 @@
for (pool = pool_head, prev = NULL; pool; prev = pool, pool = pool->prev) {
if ((ptr >= pool->base) && (ptr <= (pool->base + pool->size))) {
pool->active -= AST_STRING_FIELD_ALLOCATION(ptr);
- if ((pool->active == 0) && prev) {
- prev->prev = pool->prev;
- ast_free(pool);
+ if (pool->active == 0) {
+ if (prev) {
+ prev->prev = pool->prev;
+ ast_free(pool);
+ } else {
+ pool->used = 0;
+ }
}
break;
}
@@ -1964,6 +1968,11 @@
res = vsnprintf(target, available, format, ap1);
if (res < 0) {
/* Are we out of memory? */
+ return;
+ }
+ if (res == 0) {
+ __ast_string_field_release_active(*pool_head, *ptr);
+ *ptr = __ast_string_field_empty;
return;
}
needed = (size_t)res + 1; /* NUL byte */
More information about the asterisk-commits
mailing list