Remove several uses of freed memory

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@10512 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.4
Mark Spencer 20 years ago
parent 206883d12f
commit 72465ade16

@ -2244,11 +2244,12 @@ static int get_from_jb(void *p)
/* while we transition from the old JB to the new one, we can either make two schedule_delivery functions, or /* while we transition from the old JB to the new one, we can either make two schedule_delivery functions, or
* make preprocessor swiss-cheese out of this one. I'm not sure which is less revolting.. */ * make preprocessor swiss-cheese out of this one. I'm not sure which is less revolting.. */
static int schedule_delivery(struct iax_frame *fr, int updatehistory, int fromtrunk) static int schedule_delivery(struct iax_frame *fr, int updatehistory, int fromtrunk, unsigned int *tsout)
{ {
#ifdef NEWJB #ifdef NEWJB
int type, len; int type, len;
int ret; int ret;
int needfree = 0;
#else #else
int x; int x;
int ms; int ms;
@ -2271,7 +2272,7 @@ static int schedule_delivery(struct iax_frame *fr, int updatehistory, int fromtr
/* Attempt to recover wrapped timestamps */ /* Attempt to recover wrapped timestamps */
unwrap_timestamp(fr); unwrap_timestamp(fr);
if (updatehistory) { if (updatehistory) {
#ifndef NEWJB #ifndef NEWJB
@ -2369,8 +2370,10 @@ static int schedule_delivery(struct iax_frame *fr, int updatehistory, int fromtr
} }
if ( (!ast_test_flag(iaxs[fr->callno], IAX_USEJITTERBUF)) ) { if ( (!ast_test_flag(iaxs[fr->callno], IAX_USEJITTERBUF)) ) {
if (tsout)
*tsout = fr->ts;
__do_deliver(fr); __do_deliver(fr);
return 0; return -1;
} }
/* if the user hasn't requested we force the use of the jitterbuffer, and we're bridged to /* if the user hasn't requested we force the use of the jitterbuffer, and we're bridged to
@ -2392,8 +2395,10 @@ static int schedule_delivery(struct iax_frame *fr, int updatehistory, int fromtr
iaxs[fr->callno]->jbid = -1; iaxs[fr->callno]->jbid = -1;
/* deliver this frame now */ /* deliver this frame now */
if (tsout)
*tsout = fr->ts;
__do_deliver(fr); __do_deliver(fr);
return 0; return -1;
} }
@ -2403,7 +2408,7 @@ static int schedule_delivery(struct iax_frame *fr, int updatehistory, int fromtr
ret = jb_put(iaxs[fr->callno]->jb, fr, type, len, fr->ts, ret = jb_put(iaxs[fr->callno]->jb, fr, type, len, fr->ts,
calc_rxstamp(iaxs[fr->callno],fr->ts)); calc_rxstamp(iaxs[fr->callno],fr->ts));
if (ret == JB_DROP) { if (ret == JB_DROP) {
iax2_frame_free(fr); needfree++;
} else if (ret == JB_SCHED) { } else if (ret == JB_SCHED) {
update_jbsched(iaxs[fr->callno]); update_jbsched(iaxs[fr->callno]);
} }
@ -2472,13 +2477,15 @@ static int schedule_delivery(struct iax_frame *fr, int updatehistory, int fromtr
if ((delay > -4) || (fr->af.frametype != AST_FRAME_VOICE)) { if ((delay > -4) || (fr->af.frametype != AST_FRAME_VOICE)) {
if (option_debug && iaxdebug) if (option_debug && iaxdebug)
ast_log(LOG_DEBUG, "schedule_delivery: Delivering immediately (Calculated delay is %d)\n", delay); ast_log(LOG_DEBUG, "schedule_delivery: Delivering immediately (Calculated delay is %d)\n", delay);
if (tsout)
*tsout = fr->ts;
__do_deliver(fr); __do_deliver(fr);
return -1;
} else { } else {
if (option_debug && iaxdebug) if (option_debug && iaxdebug)
ast_log(LOG_DEBUG, "schedule_delivery: Dropping voice packet since %dms delay is too old\n", delay); ast_log(LOG_DEBUG, "schedule_delivery: Dropping voice packet since %dms delay is too old\n", delay);
iaxs[fr->callno]->frames_dropped++; iaxs[fr->callno]->frames_dropped++;
/* Free our iax frame */ needfree++;
iax2_frame_free(fr);
} }
} else { } else {
if (option_debug && iaxdebug) if (option_debug && iaxdebug)
@ -2486,6 +2493,13 @@ static int schedule_delivery(struct iax_frame *fr, int updatehistory, int fromtr
fr->retrans = ast_sched_add(sched, delay, do_deliver, fr); fr->retrans = ast_sched_add(sched, delay, do_deliver, fr);
} }
#endif #endif
if (tsout)
*tsout = fr->ts;
if (needfree) {
/* Free our iax frame */
iax2_frame_free(fr);
return -1;
}
return 0; return 0;
} }
@ -6392,15 +6406,13 @@ static int socket_read(int *id, int fd, short events, void *cbdata)
} else { } else {
duped_fr = iaxfrdup2(&fr); duped_fr = iaxfrdup2(&fr);
if (duped_fr) { if (duped_fr) {
schedule_delivery(duped_fr, updatehistory, 1); schedule_delivery(duped_fr, updatehistory, 1, &fr.ts);
fr.ts = duped_fr->ts;
} }
} }
#else #else
duped_fr = iaxfrdup2(&fr); duped_fr = iaxfrdup2(&fr);
if (duped_fr) { if (duped_fr) {
schedule_delivery(duped_fr, updatehistory, 1); schedule_delivery(duped_fr, updatehistory, 1, &fr.ts);
fr.ts = duped_fr->ts;
} }
#endif #endif
if (iaxs[fr.callno]->last < fr.ts) { if (iaxs[fr.callno]->last < fr.ts) {
@ -7585,15 +7597,13 @@ retryowner2:
} else { } else {
duped_fr = iaxfrdup2(&fr); duped_fr = iaxfrdup2(&fr);
if (duped_fr) { if (duped_fr) {
schedule_delivery(duped_fr, updatehistory, 0); schedule_delivery(duped_fr, updatehistory, 0, &fr.ts);
fr.ts = duped_fr->ts;
} }
} }
#else #else
duped_fr = iaxfrdup2(&fr); duped_fr = iaxfrdup2(&fr);
if (duped_fr) { if (duped_fr) {
schedule_delivery(duped_fr, updatehistory, 0); schedule_delivery(duped_fr, updatehistory, 0, &fr.ts);
fr.ts = duped_fr->ts;
} }
#endif #endif

Loading…
Cancel
Save