]> source.dussan.org Git - rspamd.git/commitdiff
Fix memory leak in keys management.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 1 Apr 2015 16:17:58 +0000 (17:17 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 1 Apr 2015 16:17:58 +0000 (17:17 +0100)
src/libserver/protocol.c
src/libserver/task.c
src/libserver/task.h
src/libutil/http.c
src/libutil/http.h
src/lua/lua_dns.c
src/worker.c

index 4dab6017104f3e9d6bb1b1fa5891f393b7de4fb3..4dfec4d7e1dc22341c1d90b392730e3d6aed80bc 100644 (file)
@@ -1064,10 +1064,10 @@ rspamd_protocol_write_reply (struct rspamd_task *task)
 
        msg = rspamd_http_new_message (HTTP_RESPONSE);
 
-       if (task->peer_key) {
-               msg->peer_key = rspamd_http_connection_key_ref (task->peer_key);
+       if (rspamd_http_connection_is_encrypted (task->http_conn)) {
                msg_info ("<%s> writing encrypted reply", task->message_id);
        }
+
        if (!RSPAMD_TASK_IS_JSON (task)) {
                /* Turn compatibility on */
                msg->method = HTTP_SYMBOLS;
index 0dd77a1e5f24891004edef9c653e70a2e8f1e7cb..85f4c3ca19af9e536a4bf0bf617c1e4602854a49 100644 (file)
@@ -271,9 +271,6 @@ rspamd_task_free (struct rspamd_task *task, gboolean is_soft)
                if (task->settings != NULL) {
                        ucl_object_unref (task->settings);
                }
-               if (task->peer_key != NULL) {
-                       rspamd_http_connection_key_unref (task->peer_key);
-               }
                if (task->client_addr) {
                        rspamd_inet_address_destroy (task->client_addr);
                }
index d4f92fd8d46295dff21dffc7ea0616906d18e983..e845cc9e110ae99eae315db3104b870d0c2e8149 100644 (file)
@@ -161,7 +161,6 @@ struct rspamd_task {
        } pre_result;                                               /**< Result of pre-filters                                                  */
 
        ucl_object_t *settings;                                     /**< Settings applied to task                                               */
-       gpointer peer_key;                                                                                      /**< Peer's pubkey                                                                      */
 };
 
 /**
index 1a5bc784082e57bf08c78931eab939aef4dcb9c7..9e95462b461423325d743c037347bee8ced0ecac 100644 (file)
@@ -1830,6 +1830,21 @@ rspamd_http_connection_set_key (struct rspamd_http_connection *conn,
        priv->local_key = kp;
 }
 
+gboolean
+rspamd_http_connection_is_encrypted (struct rspamd_http_connection *conn)
+{
+       struct rspamd_http_connection_private *priv = conn->priv;
+
+       if (priv->peer_key != NULL) {
+               return TRUE;
+       }
+       else if (priv->msg) {
+               return priv->msg->peer_key != NULL;
+       }
+
+       return FALSE;
+}
+
 void
 rspamd_http_connection_key_unref (gpointer key)
 {
index eef963f9d32480252c2abc1b1a36dfac0e8a1d45..3ecfc1c99405a63448be73bd0996c88deafb2d28 100644 (file)
@@ -182,6 +182,13 @@ gpointer rspamd_http_connection_gen_key (void);
 void rspamd_http_connection_set_key (struct rspamd_http_connection *conn,
                gpointer key);
 
+/**
+ * Returns TRUE if a connection is encrypted
+ * @param conn
+ * @return
+ */
+gboolean rspamd_http_connection_is_encrypted (struct rspamd_http_connection *conn);
+
 /** Print pubkey */
 #define RSPAMD_KEYPAIR_PUBKEY 0x1
 /** Print secret key */
index 31d17b103e54565b92642a44756a4c9c57d48dd6..023596cb2cd990ac01c34083e1c311df8e6ec367 100644 (file)
@@ -111,11 +111,13 @@ lua_dns_callback (struct rdns_reply *reply, gpointer arg)
                        case RDNS_REQUEST_A:
                                addr = rspamd_inet_address_new (AF_INET, &elt->content.a.addr);
                                rspamd_lua_ip_push (cd->L, addr);
+                               rspamd_inet_address_destroy (addr);
                                lua_rawseti (cd->L, -2, ++i);
                                break;
                        case RDNS_REQUEST_AAAA:
                                addr = rspamd_inet_address_new (AF_INET6, &elt->content.aaa.addr);
                                rspamd_lua_ip_push (cd->L, addr);
+                               rspamd_inet_address_destroy (addr);
                                lua_rawseti (cd->L, -2, ++i);
                                break;
                        case RDNS_REQUEST_PTR:
index 2598fed58d95ebdc59e12d1ced42b47b17c4d802..ddd01f9daadee4b0c2c82fe1ca645ed154197631 100644 (file)
@@ -132,9 +132,6 @@ rspamd_worker_body_handler (struct rspamd_http_connection *conn,
                return 0;
        }
 
-       if (msg->peer_key) {
-               task->peer_key = rspamd_http_connection_key_ref (msg->peer_key);
-       }
 
        if (!rspamd_task_process (task, msg, chunk, len, ctx->classify_pool, TRUE)) {
                task->state = WRITE_REPLY;