From ba48159c222d01adb2152f336b301d32cf3772a9 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 14 Dec 2017 08:04:15 +0000 Subject: [PATCH] [Fix] Handle proxy copy errors --- src/libutil/http.c | 18 +++++++++++++++++- src/libutil/http.h | 2 +- src/rspamd_proxy.c | 25 ++++++++++++++++++++----- 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, -- 2.39.5