[asterisk-bugs] [Asterisk 0013060]: [patch] crash can occur when ast_channel_free() tries to free a chan_iax2 tech_pvt

noreply at bugs.digium.com noreply at bugs.digium.com
Fri Jul 11 20:14:33 CDT 2008


A NOTE has been added to this issue. 
====================================================================== 
http://bugs.digium.com/view.php?id=13060 
====================================================================== 
Reported By:                jpgrayson
Assigned To:                
====================================================================== 
Project:                    Asterisk
Issue ID:                   13060
Category:                   Channels/chan_iax2
Reproducibility:            random
Severity:                   crash
Priority:                   normal
Status:                     new
Asterisk Version:           1.4.20.1 
SVN Branch (only for SVN checkouts, not tarball releases): N/A 
SVN Revision (number only!):  
Disclaimer on File?:        N/A 
Request Review:              
====================================================================== 
Date Submitted:             07-11-2008 20:09 CDT
Last Modified:              07-11-2008 20:14 CDT
====================================================================== 
Summary:                    [patch] crash can occur when ast_channel_free()
tries to free a chan_iax2 tech_pvt
Description: 
There apparently exists some sort of race condition in chan_iax2 that leads
to a channel's tech_pvt member remaining non-null even after
iaxs[PTR_TO_CALLNO(c->tech_pvt)] has been set to null.

Note the following backtrace:

Program terminated with signal 11, Segmentation fault.
Thread 1 (process 30298):
http://bugs.digium.com/view.php?id=0  0x002665f9 in free () from
/lib/tls/libc.so.6
http://bugs.digium.com/view.php?id=1  0x0807f3ce in ast_channel_free
(chan=0x25b9) at channel.c:1235
http://bugs.digium.com/view.php?id=2  0x08085d5a in ast_hangup (chan=0x81ff1b0)
at channel.c:1524
http://bugs.digium.com/view.php?id=3  0x080cde91 in __ast_pbx_run (c=0x81ff1b0)
at pbx.c:2576
http://bugs.digium.com/view.php?id=4  0x080cf8ee in pbx_thread (data=0x81ff1b0)
at pbx.c:2636
http://bugs.digium.com/view.php?id=5  0x080fe5d5 in dummy_start (data=0x0) at
utils.c:867
http://bugs.digium.com/view.php?id=6  0x003f33cc in start_thread () from
/lib/tls/libpthread.so.0
http://bugs.digium.com/view.php?id=7  0x002ccc3e in clone () from
/lib/tls/libc.so.6

The crash occurs in ast_channel_free() when it tries to free() memory at
address 0x25b9. This is chan->tech_pvt. I am not sure why gdb prints the
wrong argument in the backtrack for frame http://bugs.digium.com/view.php?id=1.
Obviously tech_pvt is not
used as a pointed, but as an index into iaxs and iaxsl, so it's no surprise
that attempting to free() tech_pvt caused a crash.

In channel.c, immediately preceding the ast_channel_free() call is a call
to chan->tech->hangup(chan). Also note that in this case, chan->flags is
0.

This problem has been observed at least three times in the past three
weeks running asterisk-1.4.20.1. I have not confirmed this bug against
1.4.21.1 or against head of svn, but I also do not see any changes in those
versions that would likely affect this outcome.

The dynamics at play in chan_iax2 concerning iaxs[callno], channel
objects, iax2_destroy(), iax2_predestroy(), iax2_hangup(), etc. are
incredibly complicated. Thus it is not at all clear to me what set of
circumstances precipitate this problem.
====================================================================== 

---------------------------------------------------------------------- 
 jpgrayson - 07-11-08 20:14  
---------------------------------------------------------------------- 
I have submitted a patch that I believe will mitigate this problem. By pre

This change is safe because the expected post-condition for iax2_hangup()
is
that c->tech_pvt == NULL. In the preceding 'if' block, iax2_predestroy()
does
just that. It's also safe because that previous 'if' test just determined
that
iaxs[callno] no longer exists -- this is very strong evidence that the
only
possible outcomes from the channel object retaining a non-null tech_pvt
are undesirable.

It will be several weeks until I have enough runtime on my systems to
validate that this does alleviate the symptom.

Even without validating that it fixes the observed problem, I think this
patch may stand on its own legs. 

Issue History 
Date Modified   Username       Field                    Change               
====================================================================== 
07-11-08 20:14  jpgrayson      Note Added: 0090134                          
======================================================================




More information about the asterisk-bugs mailing list