diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-04-24 15:16:48 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-04-24 15:16:48 +0000 |
commit | 59969dc2e014eaf4ac5a3650cc99aa631a4cd606 (patch) | |
tree | e1f02f5668edcf9c579264ac0803227f67c304b7 /channels/chan_iax2.c | |
parent | 2ca9e255a262a00c8e537fbb2c1bb8ff55ebb7b9 (diff) |
Make sure call is valid when handling mini-frame.
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@2754 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_iax2.c')
-rwxr-xr-x | channels/chan_iax2.c | 62 |
1 files changed, 32 insertions, 30 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 1624b26b7..c0f538c84 100755 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -4556,43 +4556,45 @@ static int socket_read(int *id, int fd, short events, void *cbdata) drop it, since we don't have a scallno to use for an INVAL */ /* Process as a mini frame */ f.frametype = AST_FRAME_VOICE; - if (iaxs[fr.callno]->voiceformat > 0) { - f.subclass = iaxs[fr.callno]->voiceformat; - f.datalen = len; - if (f.datalen >= 0) { - if (f.datalen) - f.data = ptr; - else - f.data = NULL; - fr.ts = fix_peerts(peer, fr.callno, ts); - /* Don't pass any packets until we're started */ - if ((iaxs[fr.callno]->state & IAX_STATE_STARTED)) { - /* Common things */ - f.src = "IAX2"; - f.mallocd = 0; - f.offset = 0; - if (f.datalen && (f.frametype == AST_FRAME_VOICE)) - f.samples = get_samples(&f); + if (iaxs[fr.callno]) { + if (iaxs[fr.callno]->voiceformat > 0) { + f.subclass = iaxs[fr.callno]->voiceformat; + f.datalen = len; + if (f.datalen >= 0) { + if (f.datalen) + f.data = ptr; else - f.samples = 0; - fr.outoforder = 0; - iax_frame_wrap(&fr, &f); + f.data = NULL; + fr.ts = fix_peerts(peer, fr.callno, ts); + /* Don't pass any packets until we're started */ + if ((iaxs[fr.callno]->state & IAX_STATE_STARTED)) { + /* Common things */ + f.src = "IAX2"; + f.mallocd = 0; + f.offset = 0; + if (f.datalen && (f.frametype == AST_FRAME_VOICE)) + f.samples = get_samples(&f); + else + f.samples = 0; + fr.outoforder = 0; + iax_frame_wrap(&fr, &f); #ifdef BRIDGE_OPTIMIZATION - if (iaxs[fr.callno]->bridgecallno) { - forward_delivery(&fr); - } else { - schedule_delivery(iaxfrdup2(&fr), 1, updatehistory); - } + if (iaxs[fr.callno]->bridgecallno) { + forward_delivery(&fr); + } else { + schedule_delivery(iaxfrdup2(&fr), 1, updatehistory); + } #else - schedule_delivery(iaxfrdup2(&fr), 1, updatehistory); + schedule_delivery(iaxfrdup2(&fr), 1, updatehistory); #endif + } + } else { + ast_log(LOG_WARNING, "Datalen < 0?\n"); } } else { - ast_log(LOG_WARNING, "Datalen < 0?\n"); + ast_log(LOG_WARNING, "Received trunked frame before first full voice frame\n "); + iax2_vnak(fr.callno); } - } else { - ast_log(LOG_WARNING, "Received trunked frame before first full voice frame\n "); - iax2_vnak(fr.callno); } ast_mutex_unlock(&iaxsl[fr.callno]); } |