From: Vsevolod Stakhov Date: Tue, 14 Jun 2016 09:14:56 +0000 (+0100) Subject: [Fix] More fixes to events logic X-Git-Tag: 1.3.0~347 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7fd590aabff817d200a3946872c8d0938e55814f;p=thirdparty%2Frspamd.git [Fix] More fixes to events logic --- diff --git a/src/libutil/ssl_util.c b/src/libutil/ssl_util.c index a72f1de955..55d5a1ad41 100644 --- a/src/libutil/ssl_util.c +++ b/src/libutil/ssl_util.c @@ -382,6 +382,7 @@ rspamd_ssl_event_handler (gint fd, short what, gpointer ud) return; } + event_del (c->ev); event_set (c->ev, fd, what, rspamd_ssl_event_handler, c); event_base_set (c->ev_base, c->ev); event_add (c->ev, c->tv); @@ -389,12 +390,22 @@ rspamd_ssl_event_handler (gint fd, short what, gpointer ud) break; case ssl_next_read: event_del (c->ev); + /* Restore handler */ + event_set (c->ev, c->fd, EV_READ|EV_PERSIST, + c->handler, c->handler_data); + event_base_set (c->ev_base, c->ev); + event_add (c->ev, c->tv); c->state = ssl_conn_connected; c->handler (fd, EV_READ, c->handler_data); break; case ssl_next_write: case ssl_conn_connected: event_del (c->ev); + /* Restore handler */ + event_set (c->ev, c->fd, EV_WRITE, + c->handler, c->handler_data); + event_base_set (c->ev_base, c->ev); + event_add (c->ev, c->tv); c->state = ssl_conn_connected; c->handler (fd, EV_WRITE, c->handler_data); break; @@ -459,6 +470,11 @@ rspamd_ssl_connect_fd (struct rspamd_ssl_connection *conn, gint fd, if (ret == 1) { conn->state = ssl_conn_connected; + + if (event_get_base (ev)) { + event_del (ev); + } + event_set (ev, fd, EV_WRITE, rspamd_ssl_event_handler, conn); if (conn->ev_base) { @@ -480,6 +496,10 @@ rspamd_ssl_connect_fd (struct rspamd_ssl_connection *conn, gint fd, return FALSE; } + if (event_get_base (ev)) { + event_del (ev); + } + event_set (ev, fd, what, rspamd_ssl_event_handler, conn); event_base_set (conn->ev_base, ev); event_add (ev, tv); @@ -546,6 +566,7 @@ rspamd_ssl_read (struct rspamd_ssl_connection *conn, gpointer buf, return -1; } + event_del (conn->ev); event_set (conn->ev, conn->fd, what, rspamd_ssl_event_handler, conn); event_base_set (conn->ev_base, conn->ev); event_add (conn->ev, conn->tv); @@ -615,6 +636,7 @@ rspamd_ssl_write (struct rspamd_ssl_connection *conn, gconstpointer buf, return -1; } + event_del (conn->ev); event_set (conn->ev, conn->fd, what, rspamd_ssl_event_handler, conn); event_base_set (conn->ev_base, conn->ev); event_add (conn->ev, conn->tv); diff --git a/src/lua/lua_map.c b/src/lua/lua_map.c index cf2b29f040..570287c132 100644 --- a/src/lua/lua_map.c +++ b/src/lua/lua_map.c @@ -309,10 +309,6 @@ lua_map_fin (struct map_cb_data *data) map = data->map; - if (data->prev_data) { - data->prev_data = NULL; - } - if (data->cur_data) { cbdata = (struct lua_map_callback_data *)data->cur_data; } @@ -321,6 +317,10 @@ lua_map_fin (struct map_cb_data *data) return; } + if (data->prev_data) { + data->prev_data = NULL; + } + if (cbdata->ref == -1) { msg_err_map ("map has no callback set"); }