[asterisk-commits] r108138 - svn:log
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed Mar 12 15:03:33 CDT 2008
Author: russell
Revision: 108138
Modified property: svn:log
Modified: svn:log at Wed Mar 12 15:03:33 2008
------------------------------------------------------------------------------
--- svn:log (original)
+++ svn:log Wed Mar 12 15:03:33 2008
@@ -1,0 +1,57 @@
+Merged revisions 108137 via svnmerge from
+https://origsvn.digium.com/svn/asterisk/trunk
+
+................
+r108137 | russell | 2008-03-12 14:59:05 -0500 (Wed, 12 Mar 2008) | 48 lines
+
+Merged revisions 108135 via svnmerge from
+https://origsvn.digium.com/svn/asterisk/branches/1.4
+
+........
+r108135 | russell | 2008-03-12 14:57:42 -0500 (Wed, 12 Mar 2008) | 40 lines
+
+(closes issue #12187, reported by atis, fixed by me after some brainstorming
+ on the issue with mmichelson)
+
+- Update copyright info on app_chanspy.
+
+- Fix a race condition that caused app_chanspy to crash. The issue was that
+ the chanspy datastore magic that was used to ensure that spyee channels did
+ not disappear out from under the code did not completely solve the problem.
+ It was actually possible for chanspy to acquire a channel reference out of
+ its datastore to a channel that was in the middle of being destroyed. That
+ was because datastore destruction in ast_channel_free() was done near the
+ end. So, this left the code in app_chanspy accessing a channel that was
+ partially, or completely invalid because it was in the process of being free'd
+ by another thread. The following sort of shows the code path where the race
+ occurred:
+
+ =============================================================================
+ Thread 1 (PBX thread for spyee chan) || Thread 2 (chanspy)
+ --------------------------------------||-------------------------------------
+ ast_channel_free() ||
+ - remove channel from channel list ||
+ - lock/unlock the channel to ensure ||
+ that no references retrieved from ||
+ the channel list exist. ||
+ --------------------------------------||-------------------------------------
+ || channel_spy()
+ - destroy some channel data || - Lock chanspy datastore
+ || - Retrieve reference to channel
+ || - lock channel
+ || - Unlock chanspy datastore
+ --------------------------------------||-------------------------------------
+ - destroy channel datastores ||
+ - call chanspy datastore d'tor ||
+ which NULL's out the ds' || - Operate on the channel ...
+ reference to the channel ||
+ ||
+ - free the channel ||
+ ||
+ || - unlock the channel
+ --------------------------------------||-------------------------------------
+ =============================================================================
+
+........
+
+................
More information about the asterisk-commits
mailing list