summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Michelson <mmichelson@digium.com>2013-09-27 14:35:12 +0000
committerMark Michelson <mmichelson@digium.com>2013-09-27 14:35:12 +0000
commit212b6f668bc4a140adc56eac6aeebd4f9207dc1e (patch)
tree4bceac98cdd55f1014e32bfb201aa053ffb3d74d
parentb22612110ccbf3cacdc422c996bf94909085e927 (diff)
Fix refleaks of ast_rtp_instance structures.
These refleaks were causing bridged calls not to close their RTP ports. Thus a call would leave open 4 ports (RTP for party A, RTCP for party A, RTP for party B, and RTCP for party B). This led to an eventual depletion of available RTP ports. ........ Merged revisions 399924 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@399925 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--bridges/bridge_native_rtp.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/bridges/bridge_native_rtp.c b/bridges/bridge_native_rtp.c
index f97c626aa..c8bf880b6 100644
--- a/bridges/bridge_native_rtp.c
+++ b/bridges/bridge_native_rtp.c
@@ -118,8 +118,12 @@ static int native_rtp_bridge_start(struct ast_bridge *bridge, struct ast_channel
struct ast_bridge_channel *c1 = AST_LIST_LAST(&bridge->channels);
enum ast_rtp_glue_result native_type;
struct ast_rtp_glue *glue0, *glue1;
- struct ast_rtp_instance *instance0 = NULL, *instance1 = NULL, *vinstance0 = NULL;
- struct ast_rtp_instance *vinstance1 = NULL, *tinstance0 = NULL, *tinstance1 = NULL;
+ RAII_VAR(struct ast_rtp_instance *, instance0, NULL, ao2_cleanup);
+ RAII_VAR(struct ast_rtp_instance *, instance1, NULL, ao2_cleanup);
+ RAII_VAR(struct ast_rtp_instance *, vinstance0, NULL, ao2_cleanup);
+ RAII_VAR(struct ast_rtp_instance *, vinstance1, NULL, ao2_cleanup);
+ RAII_VAR(struct ast_rtp_instance *, tinstance0, NULL, ao2_cleanup);
+ RAII_VAR(struct ast_rtp_instance *, tinstance1, NULL, ao2_cleanup);
RAII_VAR(struct ast_format_cap *, cap0, ast_format_cap_alloc_nolock(), ast_format_cap_destroy);
RAII_VAR(struct ast_format_cap *, cap1, ast_format_cap_alloc_nolock(), ast_format_cap_destroy);
@@ -185,7 +189,10 @@ static void native_rtp_bridge_stop(struct ast_bridge *bridge, struct ast_channel
struct ast_bridge_channel *c1 = AST_LIST_LAST(&bridge->channels);
enum ast_rtp_glue_result native_type;
struct ast_rtp_glue *glue0, *glue1 = NULL;
- struct ast_rtp_instance *instance0 = NULL, *instance1 = NULL, *vinstance0 = NULL, *vinstance1 = NULL;
+ RAII_VAR(struct ast_rtp_instance *, instance0, NULL, ao2_cleanup);
+ RAII_VAR(struct ast_rtp_instance *, instance1, NULL, ao2_cleanup);
+ RAII_VAR(struct ast_rtp_instance *, vinstance0, NULL, ao2_cleanup);
+ RAII_VAR(struct ast_rtp_instance *, vinstance1, NULL, ao2_cleanup);
if (c0 == c1) {
return;