aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-10-23 18:11:54 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-10-23 18:11:54 +0000
commit009102fa0d7a8f95ef396d510a9a731f6f9f6f1e (patch)
treed9e5b1a1e53003ce4604c4db148cc3c427702ec5
parentfa889b15ad58ad4d373532dc921f608121f44875 (diff)
Fix segfault when building peer based on IP
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@6846 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-xchannels/chan_iax2.c98
1 files changed, 54 insertions, 44 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 4e50b31d3..e0575500e 100755
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -2129,7 +2129,8 @@ static void update_jbsched(struct chan_iax2_pvt *pvt) {
pvt->jbid = ast_sched_add(sched, when, get_from_jb, (void *)pvt);
}
-static int get_from_jb(void *p) {
+static int get_from_jb(void *p)
+{
/* make sure pvt is valid! */
struct chan_iax2_pvt *pvt = p;
struct iax_frame *fr;
@@ -2152,49 +2153,49 @@ static int get_from_jb(void *p) {
now = ast_tvdiff_ms(tv, pvt->rxcore);
if(now >= (next = jb_next(pvt->jb))) {
- ret = jb_get(pvt->jb,&frame,now,ast_codec_interp_len(pvt->voiceformat));
- switch(ret) {
- case JB_OK:
- /*if(frame.type == JB_TYPE_VOICE && next + 20 != jb_next(pvt->jb)) fprintf(stderr, "NEXT %ld is not %ld+20!\n", jb_next(pvt->jb), next); */
- fr = frame.data;
- __do_deliver(fr);
- break;
- case JB_INTERP:
- {
- struct ast_frame af;
-
- /*if(next + 20 != jb_next(pvt->jb)) fprintf(stderr, "NEXT %ld is not %ld+20!\n", jb_next(pvt->jb), next); */
-
- /* create an interpolation frame */
- /*fprintf(stderr, "Making Interpolation frame\n"); */
- af.frametype = AST_FRAME_VOICE;
- af.subclass = pvt->voiceformat;
- af.datalen = 0;
- af.samples = frame.ms * 8;
- af.mallocd = 0;
- af.src = "IAX2 JB interpolation";
- af.data = NULL;
- af.delivery = ast_tvadd(pvt->rxcore, ast_samp2tv(next, 1000));
- af.offset=AST_FRIENDLY_OFFSET;
-
- /* queue the frame: For consistency, we would call __do_deliver here, but __do_deliver wants an iax_frame,
- * which we'd need to malloc, and then it would free it. That seems like a drag */
- if (iaxs[pvt->callno] && !ast_test_flag(iaxs[pvt->callno], IAX_ALREADYGONE))
- iax2_queue_frame(pvt->callno, &af);
- }
- break;
- case JB_DROP:
- /*if(next != jb_next(pvt->jb)) fprintf(stderr, "NEXT %ld is not next %ld!\n", jb_next(pvt->jb), next); */
- iax2_frame_free(frame.data);
- break;
- case JB_NOFRAME:
- case JB_EMPTY:
- /* do nothing */
- break;
- default:
- /* shouldn't happen */
- break;
- }
+ ret = jb_get(pvt->jb,&frame,now,ast_codec_interp_len(pvt->voiceformat));
+ switch(ret) {
+ case JB_OK:
+ /*if(frame.type == JB_TYPE_VOICE && next + 20 != jb_next(pvt->jb)) fprintf(stderr, "NEXT %ld is not %ld+20!\n", jb_next(pvt->jb), next); */
+ fr = frame.data;
+ __do_deliver(fr);
+ break;
+ case JB_INTERP:
+ {
+ struct ast_frame af;
+
+ /*if(next + 20 != jb_next(pvt->jb)) fprintf(stderr, "NEXT %ld is not %ld+20!\n", jb_next(pvt->jb), next); */
+
+ /* create an interpolation frame */
+ /*fprintf(stderr, "Making Interpolation frame\n"); */
+ af.frametype = AST_FRAME_VOICE;
+ af.subclass = pvt->voiceformat;
+ af.datalen = 0;
+ af.samples = frame.ms * 8;
+ af.mallocd = 0;
+ af.src = "IAX2 JB interpolation";
+ af.data = NULL;
+ af.delivery = ast_tvadd(pvt->rxcore, ast_samp2tv(next, 1000));
+ af.offset=AST_FRIENDLY_OFFSET;
+
+ /* queue the frame: For consistency, we would call __do_deliver here, but __do_deliver wants an iax_frame,
+ * which we'd need to malloc, and then it would free it. That seems like a drag */
+ if (iaxs[pvt->callno] && !ast_test_flag(iaxs[pvt->callno], IAX_ALREADYGONE))
+ iax2_queue_frame(pvt->callno, &af);
+ }
+ break;
+ case JB_DROP:
+ /*if(next != jb_next(pvt->jb)) fprintf(stderr, "NEXT %ld is not next %ld!\n", jb_next(pvt->jb), next); */
+ iax2_frame_free(frame.data);
+ break;
+ case JB_NOFRAME:
+ case JB_EMPTY:
+ /* do nothing */
+ break;
+ default:
+ /* shouldn't happen */
+ break;
+ }
}
update_jbsched(pvt);
ast_mutex_unlock(&iaxsl[pvt->callno]);
@@ -2533,6 +2534,15 @@ static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in
ast_inet_ntoa(iabuf, sizeof(iabuf), sin->sin_addr);
sprintf(porta, "%d", ntohs(sin->sin_port));
var = ast_load_realtime("iaxpeers", "ipaddr", iabuf, "port", porta, NULL);
+ if (var) {
+ /* We'll need the peer name in order to build the structure! */
+ tmp = var;
+ while(tmp) {
+ if (!strcasecmp(tmp->name, "name"))
+ peername = tmp->value;
+ tmp = tmp->next;
+ }
+ }
}
if (!var)
return NULL;