]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-10833: [mod_amqp] memory leak on reconnection attempt to RabbitMQ broker
authorPraveen Kumar <praveen@plivo.com>
Thu, 7 Dec 2017 22:53:43 +0000 (04:23 +0530)
committerPraveen Kumar <praveen@plivo.com>
Thu, 7 Dec 2017 22:53:43 +0000 (04:23 +0530)
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.

src/mod/event_handlers/mod_amqp/mod_amqp_connection.c

index 8e8be16389ce16ac0bbdd858178fc0ffd57480ef..2d8ef8c0882fcba361e887b7dfe0b0ee7098d306 100644 (file)
@@ -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)