aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2019-07-21 09:54:43 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2019-07-21 09:54:43 +0100
commit40df5a7d2c66ee42daba6f98afc07cbb3f3223e5 (patch)
tree88181aed8ab0cd4555c8fd850671ac15a12b9a75
parentb5f639d991c4cbeca0328578bf41ca957a03e596 (diff)
downloadrspamd-40df5a7d2c66ee42daba6f98afc07cbb3f3223e5.tar.gz
rspamd-40df5a7d2c66ee42daba6f98afc07cbb3f3223e5.zip
[Fix] Various fixes to SSL state machine handler
-rw-r--r--src/libutil/ssl_util.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/libutil/ssl_util.c b/src/libutil/ssl_util.c
index 54322918c..f26bd063a 100644
--- a/src/libutil/ssl_util.c
+++ b/src/libutil/ssl_util.c
@@ -408,8 +408,17 @@ rspamd_ssl_event_handler (gint fd, short what, gpointer ud)
if (what == EV_TIMER) {
c->shut = ssl_shut_unclean;
+ rspamd_ev_watcher_stop (c->event_loop, c->ev);
+ g_set_error (&err, rspamd_ssl_quark (), ETIMEDOUT,
+ "ssl connection timed out");
+ c->err_handler (c->handler_data, err);
+ g_error_free (err);
+
+ return;
}
+ msg_debug ("ssl event; what=%d; c->state=%d", (int)what, (int)c->state);
+
switch (c->state) {
case ssl_conn_init:
/* Continue connection */
@@ -453,6 +462,10 @@ rspamd_ssl_event_handler (gint fd, short what, gpointer ud)
c->handler (fd, EV_READ, c->handler_data);
break;
case ssl_next_write:
+ rspamd_ev_watcher_reschedule (c->event_loop, c->ev, EV_WRITE);
+ c->state = ssl_conn_connected;
+ c->handler (fd, EV_WRITE, c->handler_data);
+ break;
case ssl_conn_connected:
rspamd_ev_watcher_reschedule (c->event_loop, c->ev, what);
c->state = ssl_conn_connected;
@@ -697,7 +710,7 @@ gssize
rspamd_ssl_writev (struct rspamd_ssl_connection *conn, struct iovec *iov,
gsize iovlen)
{
- static guchar ssl_buf[16000];
+ guchar ssl_buf[16000];
guchar *p;
struct iovec *cur;
guint i, remain;