aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xChangeLog2
-rwxr-xr-xchannel.c6
2 files changed, 7 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 21074b9f3..f1e03b115 100755
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
2005-11-16 Kevin P. Fleming <kpfleming@limerick.digium.com>
+ * channel.c (ast_queue_hangup): ensure that the channel lock is held before changing its fields... (issue #5770)
+
* res/res_musiconhold.c: don't spit out incorrect log messages (and leak memory) during reload (issue #5766)
* channels/chan_sip.c (process_sdp): don't pass video codec number into ast_getformatname(), it is not valid input for that function (issue #5764)
diff --git a/channel.c b/channel.c
index 66560fef0..585ed90f6 100755
--- a/channel.c
+++ b/channel.c
@@ -667,7 +667,11 @@ int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
int ast_queue_hangup(struct ast_channel *chan)
{
struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP };
- chan->_softhangup |= AST_SOFTHANGUP_DEV;
+ /* Yeah, let's not change a lock-critical value without locking */
+ if (!ast_mutex_trylock(&chan->lock)) {
+ chan->_softhangup |= AST_SOFTHANGUP_DEV;
+ ast_mutex_unlock(&chan->lock);
+ }
return ast_queue_frame(chan, &f);
}