]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Handle proxy copy errors
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 14 Dec 2017 08:04:15 +0000 (08:04 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 14 Dec 2017 08:04:15 +0000 (08:04 +0000)
src/libutil/http.c
src/libutil/http.h
src/rspamd_proxy.c

index 60378f8a12bd967c834230f866842c9f5d69a287..9e3e2f2a1135e24b760ae57d7f03f6392676d808 100644 (file)
@@ -1398,7 +1398,7 @@ rspamd_http_connection_steal_msg (struct rspamd_http_connection *conn)
 }
 
 struct rspamd_http_message *
-rspamd_http_connection_copy_msg (struct rspamd_http_message *msg)
+rspamd_http_connection_copy_msg (struct rspamd_http_message *msg, GError **err)
 {
        struct rspamd_http_message *new_msg;
        struct rspamd_http_header *hdr, *nhdr, *nhdrs, *thdr, *hcur;
@@ -1421,11 +1421,19 @@ rspamd_http_connection_copy_msg (struct rspamd_http_message *msg)
 
                        if (storage->shared.shm_fd == -1) {
                                rspamd_http_message_unref (new_msg);
+                               g_set_error (err, http_error_quark (), errno,
+                                               "cannot dup shmem fd: %d: %s",
+                                               msg->body_buf.c.shared.shm_fd, strerror (errno));
+
                                return NULL;
                        }
 
                        if (fstat (storage->shared.shm_fd, &st) == -1) {
+                               g_set_error (err, http_error_quark (), errno,
+                                               "cannot stat shmem fd: %d: %s",
+                                               storage->shared.shm_fd, strerror (errno));
                                rspamd_http_message_unref (new_msg);
+
                                return NULL;
                        }
 
@@ -1441,7 +1449,11 @@ rspamd_http_connection_copy_msg (struct rspamd_http_message *msg)
                                        storage->shared.shm_fd, 0);
 
                        if (new_msg->body_buf.str == MAP_FAILED) {
+                               g_set_error (err, http_error_quark (), errno,
+                                               "cannot mmap shmem fd: %d: %s",
+                                               storage->shared.shm_fd, strerror (errno));
                                rspamd_http_message_unref (new_msg);
+
                                return NULL;
                        }
 
@@ -1454,7 +1466,11 @@ rspamd_http_connection_copy_msg (struct rspamd_http_message *msg)
                        old_body = rspamd_http_message_get_body (msg, &old_len);
 
                        if (!rspamd_http_message_set_body (new_msg, old_body, old_len)) {
+                               g_set_error (err, http_error_quark (), errno,
+                                               "cannot set body for message, length: %zd",
+                                               old_len);
                                rspamd_http_message_unref (new_msg);
+
                                return NULL;
                        }
                }
index 3696c4e181843b5bc7de69e6bd1ab1eda081dfcb..1c418ebb8c2d8e13d44b6d0c9c9f1e4c16b5b86f 100644 (file)
@@ -280,7 +280,7 @@ struct rspamd_http_message * rspamd_http_connection_steal_msg (
  * @return
  */
 struct rspamd_http_message * rspamd_http_connection_copy_msg (
-               struct rspamd_http_message *msg);
+               struct rspamd_http_message *msg, GError **err);
 
 /**
  * Create new HTTP message
index 12b14bc9247d3e5a9145138c2837f3e07842c811..1a05d86315cc17d9ec4fc48cf999420c16a2a352 100644 (file)
@@ -1314,6 +1314,7 @@ proxy_open_mirror_connections (struct rspamd_proxy_session *session)
        guint i;
        struct rspamd_proxy_backend_connection *bk_conn;
        struct rspamd_http_message *msg;
+       GError *err = NULL;
 
        coin = rspamd_random_double ();
 
@@ -1351,11 +1352,14 @@ proxy_open_mirror_connections (struct rspamd_proxy_session *session)
                        continue;
                }
 
-               msg = rspamd_http_connection_copy_msg (session->client_message);
+               msg = rspamd_http_connection_copy_msg (session->client_message, &err);
 
                if (msg == NULL) {
-                       msg_err_session ("cannot copy message to send to a mirror %s: %s",
-                                       m->name, strerror (errno));
+                       msg_err_session ("cannot copy message to send to a mirror %s: %e",
+                                       m->name, err);
+                       if (err) {
+                               g_error_free (err);
+                       }
                        continue;
                }
 
@@ -1712,6 +1716,7 @@ proxy_send_master_message (struct rspamd_proxy_session *session)
        struct rspamd_http_message *msg;
        struct rspamd_http_upstream *backend = NULL;
        const rspamd_ftok_t *host;
+       GError *err = NULL;
        gchar hostbuf[512];
 
        host = rspamd_http_message_find_header (session->client_message, "Host");
@@ -1771,6 +1776,18 @@ retry:
                        goto retry;
                }
 
+               msg = rspamd_http_connection_copy_msg (session->client_message, &err);
+               if (msg == NULL) {
+                       msg_err_session ("cannot copy message to send it to the upstream: %e",
+                                       err);
+
+                       if (err) {
+                               g_error_free (err);
+                       }
+
+                       goto err; /* No fallback here */
+               }
+
                session->master_conn->backend_conn = rspamd_http_connection_new (
                                NULL,
                                proxy_backend_master_error_handler,
@@ -1783,8 +1800,6 @@ retry:
                session->master_conn->parser_from_ref = backend->parser_from_ref;
                session->master_conn->parser_to_ref = backend->parser_to_ref;
 
-               msg = rspamd_http_connection_copy_msg (session->client_message);
-
                if (backend->key) {
                        msg->peer_key = rspamd_pubkey_ref (backend->key);
                        rspamd_http_connection_set_key (session->master_conn->backend_conn,