From 851ac1431c4cc342865e56a3412a02f45c232255 Mon Sep 17 00:00:00 2001 From: lmadsen Date: Mon, 13 Dec 2010 17:18:57 +0000 Subject: Update ChangeLog and .version file. Merge fixes for CDR crash and chan_gtalk fixup. git-svn-id: http://svn.digium.com/svn/asterisk/tags/1.8.1.1@298203 f38db490-d61c-443f-a65b-d21fe96a405b --- .version | 2 +- ChangeLog | 28 ++++++++++++++++++++++++++++ channels/chan_gtalk.c | 45 ++++++++++++++++++++++++++++++++++++++++----- main/features.c | 10 +++++++--- 4 files changed, 76 insertions(+), 9 deletions(-) diff --git a/.version b/.version index a8fdfda1c..312917f51 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -1.8.1 +1.8.1.1 diff --git a/ChangeLog b/ChangeLog index 1f8cf4755..6a62bde29 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,31 @@ +2010-12-13 Leif Madsen + + * Asterisk 1.8.1.1 Released. + +2010-12-09 15:32:20 -0600 David Vossel + + * Fixes issue with outbound google voice calls not working. + + Thanks to az1234 and nevermind_quack for their input in helping debug + the issue. + + (closes issue #18412) + Reported by: nevermind_quack + Patches: + fix uploaded by dvossel (license 671) + +2010-12-09 14:48:44 -0600 Terry Wilson + + * Don't crash after Set(CDR(userfield)=...) in ast_bridge_call + + Instead of setting peer->cdr = NULL, set it to not post. + + (closes issue #18415) + Reported by: macbrody + Patches: + patch-18415 uploaded by jsolares (license 1167) + Tested by: jsolares, twilson + 2010-12-02 Leif Madsen * Asterisk 1.8.1 Released. diff --git a/channels/chan_gtalk.c b/channels/chan_gtalk.c index 05d493a00..a4a8683f2 100644 --- a/channels/chan_gtalk.c +++ b/channels/chan_gtalk.c @@ -193,6 +193,8 @@ static int gtalk_update_stun(struct gtalk *client, struct gtalk_pvt *p); /* static char *gtalk_do_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a); */ static char *gtalk_show_channels(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a); static int gtalk_update_externip(void); +static int gtalk_parser(void *data, ikspak *pak); +static int gtalk_create_candidates(struct gtalk *client, struct gtalk_pvt *p, char *sid, char *from, char *to); /*! \brief PBX interface structure for channel registration */ static const struct ast_channel_tech gtalk_tech = { @@ -458,12 +460,46 @@ static int gtalk_invite(struct gtalk_pvt *p, char *to, char *from, char *sid, in static int gtalk_ringing_ack(void *data, ikspak *pak) { struct gtalk_pvt *p = data; + struct ast_channel *owner; - if (p->ringrule) + ast_mutex_lock(&p->lock); + + if (p->ringrule) { iks_filter_remove_rule(p->parent->connection->f, p->ringrule); + } p->ringrule = NULL; - if (p->owner) - ast_queue_control(p->owner, AST_CONTROL_RINGING); + + /* this may be a redirect */ + if (!strcmp(S_OR(iks_find_attrib(pak->x, "type"), ""), "error")) { + char *name = NULL; + char *redirect = NULL; + iks *traversenodes = NULL; + traversenodes = pak->query; + while (traversenodes) { + if (!(name = iks_name(traversenodes))) { + break; + } + if (!strcasecmp(name, "error") && + (redirect = iks_find_cdata(traversenodes, "redirect")) && + (redirect = strstr(redirect, "xmpp:"))) { + redirect += 5; + ast_log(LOG_DEBUG, "redirect %s\n", redirect); + ast_copy_string(p->them, redirect, sizeof(p->them)); + + gtalk_invite(p, p->them, p->us, p->sid, 1); + break; + } + traversenodes = iks_next_tag(traversenodes); + } + } + gtalk_create_candidates(p->parent, p, p->sid, p->them, p->us); + owner = p->owner; + ast_mutex_unlock(&p->lock); + + if (owner) { + ast_queue_control(owner, AST_CONTROL_RINGING); + } + return IKS_FILTER_EAT; } @@ -965,7 +1001,7 @@ static struct gtalk_pvt *gtalk_alloc(struct gtalk *client, const char *us, const if (resources) { snprintf(idroster, sizeof(idroster), "%s/%s", them, resources->resource); } else if ((*them == '+') || (strstr(them, "@voice.google.com"))) { - snprintf(idroster, sizeof(idroster), "%s/srvres", them); + snprintf(idroster, sizeof(idroster), "%s", them); } else { ast_log(LOG_ERROR, "no gtalk capable clients to talk to.\n"); return NULL; @@ -1775,7 +1811,6 @@ static int gtalk_call(struct ast_channel *ast, char *dest, int timeout) } gtalk_invite(p, p->them, p->us, p->sid, 1); - gtalk_create_candidates(p->parent, p, p->sid, p->them, p->us); return 0; } diff --git a/main/features.c b/main/features.c index 2c9954c24..220a6eb11 100644 --- a/main/features.c +++ b/main/features.c @@ -3091,6 +3091,7 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast int hasfeatures=0; int hadfeatures=0; int autoloopflag; + int we_disabled_peer_cdr = 0; struct ast_option_header *aoh; struct ast_cdr *bridge_cdr = NULL; struct ast_cdr *orig_peer_cdr = NULL; @@ -3158,9 +3159,9 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast ast_cdr_appenduserfield(chan, tmp); } else ast_cdr_setuserfield(chan, peer->cdr->userfield); - /* free the peer's cdr without ast_cdr_free complaining */ - ast_free(peer->cdr); - peer->cdr = NULL; + /* Don't delete the CDR; just disable it. */ + ast_set_flag(peer->cdr, AST_CDR_FLAG_POST_DISABLED); + we_disabled_peer_cdr = 1; } ast_copy_string(orig_channame,chan->name,sizeof(orig_channame)); ast_copy_string(orig_peername,peer->name,sizeof(orig_peername)); @@ -3600,6 +3601,9 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast ast_cdr_specialized_reset(new_peer_cdr, 0); } } else { + if (we_disabled_peer_cdr) { + ast_clear_flag(peer->cdr, AST_CDR_FLAG_POST_DISABLED); + } ast_cdr_specialized_reset(peer->cdr, 0); /* nothing changed, reset the peer cdr */ } } -- cgit v1.2.3