Author: coreyfarrell Date: Tue Oct 28 15:55:04 2014 New Revision: 426528 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=426528 Log: res_fax: Resolve T38 gateway frame leak.
When frames are translated by a fax gateway they need to be freed. The existing call to ast_frfree was unreachable. This change reorganizes fax_gateway_framehook to ensure that ast_frfree is called when needed. ASTERISK-24457 #close Reported by: Corey Farrell Review: https://reviewboard.asterisk.org/r/4115/ ........ Merged revisions 426527 from http://svn.asterisk.org/svn/asterisk/branches/11 Modified: branches/12/ (props changed) branches/12/res/res_fax.c Propchange: branches/12/ ------------------------------------------------------------------------------ Binary property 'branch-11-merged' - no diff available. Modified: branches/12/res/res_fax.c URL: http://svnview.digium.com/svn/asterisk/branches/12/res/res_fax.c?view=diff&rev=426528&r1=426527&r2=426528 ============================================================================== --- branches/12/res/res_fax.c (original) +++ branches/12/res/res_fax.c Tue Oct 28 15:55:04 2014 @@ -3233,25 +3233,25 @@ /* in gateway mode, gateway some packets */ if (gateway->t38_state == T38_STATE_NEGOTIATED) { + struct ast_trans_pvt *readtrans; /* framehooks are called in __ast_read() before frame format * translation is done, so we need to translate here */ - if ((f->frametype == AST_FRAME_VOICE) && (f->subclass.format.id != AST_FORMAT_SLINEAR)) { - if (ast_channel_readtrans(active) && (f = ast_translate(ast_channel_readtrans(active), f, 1)) == NULL) { + if ((f->frametype == AST_FRAME_VOICE) && (f->subclass.format.id != AST_FORMAT_SLINEAR) + && (readtrans = ast_channel_readtrans(active))) { + if ((f = ast_translate(readtrans, f, 1)) == NULL) { f = &ast_null_frame; return f; } - } - - /* XXX we ignore the return value here, perhaps we should - * disable the gateway if a write fails. I am not sure how a - * write would fail, or even if a failure would be fatal so for - * now we'll just ignore the return value. */ - gateway->s->tech->write(gateway->s, f); - if ((f->frametype == AST_FRAME_VOICE) && (f->subclass.format.id != AST_FORMAT_SLINEAR) && ast_channel_readtrans(active)) { - /* Only free the frame if we translated / duplicated it - otherwise, - * let whatever is outside the frame hook do it */ + /* XXX we ignore the return value here, perhaps we should + * disable the gateway if a write fails. I am not sure how a + * write would fail, or even if a failure would be fatal so for + * now we'll just ignore the return value. */ + gateway->s->tech->write(gateway->s, f); ast_frfree(f); - } + } else { + gateway->s->tech->write(gateway->s, f); + } + f = &ast_null_frame; return f; } -- _____________________________________________________________________ -- Bandwidth and Colocation Provided by http://www.api-digital.com -- svn-commits mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/svn-commits
