summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2017-12-14 08:04:15 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2017-12-14 08:04:15 +0000
commitba48159c222d01adb2152f336b301d32cf3772a9 (patch)
treec269a7ef309ca4881c15b44e915b75ce1f77a662
parent413ecb9bde4067f916592d69d43314bd9ad136cc (diff)
downloadrspamd-ba48159c222d01adb2152f336b301d32cf3772a9.tar.gz
rspamd-ba48159c222d01adb2152f336b301d32cf3772a9.zip
[Fix] Handle proxy copy errors
-rw-r--r--src/libutil/http.c18
-rw-r--r--src/libutil/http.h2
-rw-r--r--src/rspamd_proxy.c25
3 files changed, 38 insertions, 7 deletions
diff --git a/src/libutil/http.c b/src/libutil/http.c
index 60378f8a1..9e3e2f2a1 100644
--- a/src/libutil/http.c
+++ b/src/libutil/http.c
@@ -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;
}
}
diff --git a/src/libutil/http.h b/src/libutil/http.h
index 3696c4e18..1c418ebb8 100644
--- a/src/libutil/http.h
+++ b/src/libutil/http.h
@@ -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
diff --git a/src/rspamd_proxy.c b/src/rspamd_proxy.c
index 12b14bc92..1a05d8631 100644
--- a/src/rspamd_proxy.c
+++ b/src/rspamd_proxy.c
@@ -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,