From d311a06a8318d74dddee1ec2bbaed9d949da9cea Mon Sep 17 00:00:00 2001 From: Praveen Kumar Date: Fri, 8 Dec 2017 04:23:43 +0530 Subject: [PATCH] FS-10833: [mod_amqp] memory leak on reconnection attempt to RabbitMQ broker Memory leak happening during reconnection attempt after connectivity loss with RabbitMQ broker. With these changes, memory leak issue has been addressed and the object has been properly freed. --- .../mod_amqp/mod_amqp_connection.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/mod/event_handlers/mod_amqp/mod_amqp_connection.c b/src/mod/event_handlers/mod_amqp/mod_amqp_connection.c index 8e8be16389..2d8ef8c088 100644 --- a/src/mod/event_handlers/mod_amqp/mod_amqp_connection.c +++ b/src/mod/event_handlers/mod_amqp/mod_amqp_connection.c @@ -109,7 +109,7 @@ switch_status_t mod_amqp_connection_open(mod_amqp_connection_t *connections, mod if (!(socket = amqp_tcp_socket_new(newConnection))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Could not create TCP socket\n"); - return SWITCH_STATUS_GENERR; + goto err; } connection_attempt = connections; @@ -130,7 +130,7 @@ switch_status_t mod_amqp_connection_open(mod_amqp_connection_t *connections, mod if (!connection_attempt) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Profile[%s] could not connect to any AMQP brokers\n", profile_name); - return SWITCH_STATUS_GENERR; + goto err; } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Profile[%s] opened socket connection to AMQP broker %s:%d\n", @@ -150,13 +150,15 @@ switch_status_t mod_amqp_connection_open(mod_amqp_connection_t *connections, mod if (mod_amqp_log_if_amqp_error(status, "Logging in")) { mod_amqp_connection_close(*active); *active = NULL; - return SWITCH_STATUS_GENERR; + goto err; } // Open a channel (1). This is fairly standard amqp_channel_open(newConnection, 1); if (mod_amqp_log_if_amqp_error(amqp_get_rpc_reply(newConnection), "Opening channel")) { - return SWITCH_STATUS_GENERR; + mod_amqp_connection_close(*active); + *active = NULL; + goto err; } (*active)->state = newConnection; @@ -166,6 +168,12 @@ switch_status_t mod_amqp_connection_open(mod_amqp_connection_t *connections, mod } return SWITCH_STATUS_SUCCESS; + +err: + if (newConnection) { + amqp_destroy_connection(newConnection); + } + return SWITCH_STATUS_GENERR; } switch_status_t mod_amqp_connection_create(mod_amqp_connection_t **conn, switch_xml_t cfg, switch_memory_pool_t *pool)