]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
stasis/endpoint: Fix memory leak of channel_ids in ast_endpoint structure.
authormohitdhiman <mohitdhiman@drishti-soft.com>
Mon, 7 Jan 2019 18:04:43 +0000 (23:34 +0530)
committermohitdhiman <mohitdhiman@drishti-soft.com>
Fri, 11 Jan 2019 13:53:50 +0000 (19:23 +0530)
During Bridging of two channels if masquerade operation is performed on a
channel (clone channel) which was created with endpoint details
(ast_channel_alloc_with_endpoint()) and the original channel which is created
without endpoint details (ast_channel_alloc()) then both the channels must
exchange their endpoint details or else after masquerade when clone channel
is being destroyed the endpoint cleanup callbacks will be destroyed too and
after call completion unique_id of original channel will still be there in
ast_endpoint structure's channel_ids container.

ASTERISK-28197

Change-Id: Ied0451f378a3f2a36acc8c0984959a69895efa17

include/asterisk/channel.h
main/channel.c
main/channel_internal_api.c

index d7091593b497b1dc36cbb06ddc8997397c0ff42e..0ab12e792838bf03da1d0f3e07bc9e3c7607230e 100644 (file)
@@ -2588,6 +2588,18 @@ void ast_channel_internal_swap_uniqueid_and_linkedid(struct ast_channel *a, stru
  */
 void ast_channel_internal_swap_topics(struct ast_channel *a, struct ast_channel *b);
 
+/*!
+ * \brief Swap endpoint_forward and endpoint_cache_forward between two channels
+ * \param a First channel
+ * \param b Second channel
+ * \return void
+ *
+ * \note
+ * This is used in masquerade to exchange endpoint details if one of the two or both
+ * the channels were created with endpoint
+ */
+void ast_channel_internal_swap_endpoint_forward_and_endpoint_cache_forward(struct ast_channel *a, struct ast_channel *b);
+
 /*!
  * \brief Set uniqueid and linkedid string value only (not time)
  * \param chan The channel to set the uniqueid to
index c1eecdb0191f36af81b431147dda0f37d4190f0f..74d7986454a72ee19157987ed1bf40d139aa407c 100644 (file)
@@ -6922,6 +6922,12 @@ static void channel_do_masquerade(struct ast_channel *original, struct ast_chann
        /* Make sure the Stasis topic on the channel is updated appropriately */
        ast_channel_internal_swap_topics(clonechan, original);
 
+       /* Swap endpoint forward and endpoint cache forward details of the channels,
+        * so channel created with endpoint exchanges its state with other channel
+        * for proper endpoint cleanup.
+        */
+       ast_channel_internal_swap_endpoint_forward_and_endpoint_cache_forward(clonechan, original);
+
        /* Swap channel names. This uses ast_channel_name_set directly, so we
         * don't get any spurious rename events.
         */
index 72ca1a9ce231907b9d0f075fc9c70948d108fa09..b5fd87dc487c685f8304b4e90952c2d0ab363209 100644 (file)
@@ -1546,6 +1546,18 @@ void ast_channel_internal_swap_topics(struct ast_channel *a, struct ast_channel
        b->topics = temp;
 }
 
+void ast_channel_internal_swap_endpoint_forward_and_endpoint_cache_forward(struct ast_channel *a, struct ast_channel *b)
+{
+       struct stasis_forward *temp;
+       temp = a->endpoint_forward;
+       a->endpoint_forward = b->endpoint_forward;
+       b->endpoint_forward = temp;
+
+       temp = a->endpoint_cache_forward;
+       a->endpoint_cache_forward = b->endpoint_cache_forward;
+       b->endpoint_cache_forward = temp;
+}
+
 void ast_channel_internal_set_fake_ids(struct ast_channel *chan, const char *uniqueid, const char *linkedid)
 {
        ast_copy_string(chan->uniqueid.unique_id, uniqueid, sizeof(chan->uniqueid.unique_id));