aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlmadsen <lmadsen@f38db490-d61c-443f-a65b-d21fe96a405b>2010-12-13 17:18:57 +0000
committerlmadsen <lmadsen@f38db490-d61c-443f-a65b-d21fe96a405b>2010-12-13 17:18:57 +0000
commit851ac1431c4cc342865e56a3412a02f45c232255 (patch)
tree29c113dac6fc9b76602604a620900250dff271d9
parent098da6ea6fa85d1439388348a1bd1b748357b833 (diff)
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
-rw-r--r--.version2
-rw-r--r--ChangeLog28
-rw-r--r--channels/chan_gtalk.c45
-rw-r--r--main/features.c10
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 <lmadsen@digium.com>
+
+ * Asterisk 1.8.1.1 Released.
+
+2010-12-09 15:32:20 -0600 David Vossel <dvossel@digium.com>
+
+ * 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 <twilson@digium.com>
+
+ * 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 <lmadsen@digium.com>
* 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 */
}
}