[asterisk-dev] res_fax_spandsp segfaults during fax detection - FIXED?
Michal Rybárik
michal at rybarik.sk
Thu Jan 30 21:38:09 CST 2014
Dear Pavel,
On 01/30/2014 06:55 AM, Pavel Troller wrote:
>> I probably found what causes random segfaults during fax detection with
>> spandsp... Many thanks for your contributions and brainstorming about this,
>> it helped a lot. If you have such issue, please test this possible fix and
>> let me know...
>>
>> At res_fax.c, somewhere around line 3070, you'll find (at least for
>> Asterisk 11)
>> case AST_FORMAT_ALAW:
>> case AST_FORMAT_ULAW:
>> Comment out these two lines, recompile, reload and test.
> As I understand the code, by commenting out these lines, we'll just abandon
> the frame hook for A/ULAW samples, so we'll never gateway them then... Yes,
> it will probabaly stop segfaulting, but as a side-effect, it will stop
> gatewaying as well :-). Of course I may be wrong, I just had a little look
> there...
I tested this fix before posting to the list, and T38 gatewaying is
working with it, at least in my setup (between DAHDI and SIP). I tested
both ways (SIP->DAHDI, DAHDI->SIP) and fax receipt was successful.
Gateway is enabled in sip.conf, in peer section:
setvar=FAXOPT(t38gateway)=yes,20
> However, it seems that there is really a bug in the hook.
> - On line 3130, we are attempting to translate the frames before we write
> them to the faxing engine (on line 3141). It's OK.
> - BUT: On line 3122, we are calling fax_gateway_detect_v21() with
> UNTRANSLATED frames, which is FATAL - this detection can handle only linear
> format similarly as real faxing, so we have to translate non-linear formats
> (A/ULAW) for it as well! By not doing this, we probably
> 1) prevent successful detection of V.21, so it doesn't work either
> 2) In rare cases, crash the whole thing, because the detection code always
> tries to read 320 bytes from 160byte buffer (as Michal pointed out below).
> Once again, I may be wrong, but I think it's in accordance with all the
> symptoms we have already collected.
.... it seems that you really don't like my quick fix :o)) OK, then
forget it, and try this instead:
# diff res/res_fax.c.orig res/res_fax.c
2963a2964
> struct ast_frame *tmpframe = &ast_null_frame;
3117a3119,3131
>
> if (f->subclass.format.id != AST_FORMAT_SLINEAR) {
>
> if (ast_channel_readtrans(active) && (tmpframe
= ast_translate(ast_channel_readtrans(active), f, 0)) == NULL) {
> ast_debug(5, "frame translation to
slinear failed, v21 detection skipped\n");
> return f; // translation unsuccessful,
dont start v21 detection
> }
> ast_debug(5, "frame translated to slinear for
v21 detection\n");
> fax_gateway_detect_v21(gateway, chan, peer,
active, tmpframe);
> ast_frfree(tmpframe);
> return f;
> }
>
This code will translate non-slinear frames to slinear, just before they
are sent to libspandsp for v21detection. With this patch applied, v21
detection is done also for RTP (SIP) alaw/ulaw frames, so maybe SIP/G711
<-> SIP/T38 gateway will work too. I tested DAHDI <-> SIP/T38, gateway
works both ways, voice calls too. Is it better now? :o)
--
Michal Rybarik
More information about the asterisk-dev
mailing list