mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-06 12:36:58 +00:00
bridge_basic.c: Make sure that ast_bridge_channel is not destroyed while iterating over bridge->channels.
From the gdb information, we can see that while iterating over bridge->channels, the ast_bridge_channel reference count is 0, indicating it has already been destroyed.Additionally, when ast_bridge_channel is removed from bridge->channels, the bridge is first locked. Therefore, locking the bridge before iterating over bridge->channels can resolve the race condition.
Resolves: https://github.com/asterisk/asterisk/issues/768
(cherry picked from commit 642df06a32
)
This commit is contained in:
committed by
Asterisk Development Team
parent
c3f78b36a0
commit
a56925d9e6
@@ -1856,7 +1856,9 @@ static void bridge_ringing(struct ast_bridge *bridge)
|
||||
.subclass.integer = AST_CONTROL_RINGING,
|
||||
};
|
||||
|
||||
ast_bridge_lock(bridge);
|
||||
ast_bridge_queue_everyone_else(bridge, NULL, &ringing);
|
||||
ast_bridge_unlock(bridge);
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -1869,7 +1871,9 @@ static void bridge_hold(struct ast_bridge *bridge)
|
||||
.subclass.integer = AST_CONTROL_HOLD,
|
||||
};
|
||||
|
||||
ast_bridge_lock(bridge);
|
||||
ast_bridge_queue_everyone_else(bridge, NULL, &hold);
|
||||
ast_bridge_unlock(bridge);
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -1882,7 +1886,9 @@ static void bridge_unhold(struct ast_bridge *bridge)
|
||||
.subclass.integer = AST_CONTROL_UNHOLD,
|
||||
};
|
||||
|
||||
ast_bridge_lock(bridge);
|
||||
ast_bridge_queue_everyone_else(bridge, NULL, &unhold);
|
||||
ast_bridge_unlock(bridge);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
Reference in New Issue
Block a user