aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_iax2.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-04-24 15:16:48 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-04-24 15:16:48 +0000
commit59969dc2e014eaf4ac5a3650cc99aa631a4cd606 (patch)
treee1f02f5668edcf9c579264ac0803227f67c304b7 /channels/chan_iax2.c
parent2ca9e255a262a00c8e537fbb2c1bb8ff55ebb7b9 (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-xchannels/chan_iax2.c62
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]);
}