commit 0844254: [Project] Avoid using of the worker pointer in srv handlers

Vsevolod Stakhov vsevolod at highsecure.ru
Sun Sep 15 08:49:06 UTC 2019


Author: Vsevolod Stakhov
Date: 2019-09-15 09:38:47 +0100
URL: https://github.com/rspamd/rspamd/commit/0844254be5130d633dbd1357cf50f433aee5eb78

[Project] Avoid using of the worker pointer in srv handlers

---
 src/libserver/rspamd_control.c | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/src/libserver/rspamd_control.c b/src/libserver/rspamd_control.c
index 4ca3d6585..2e6ad21f0 100644
--- a/src/libserver/rspamd_control.c
+++ b/src/libserver/rspamd_control.c
@@ -36,7 +36,8 @@ struct rspamd_control_reply_elt {
 	struct rspamd_control_reply reply;
 	struct rspamd_io_ev ev;
 	struct ev_loop *event_loop;
-	struct rspamd_worker *wrk;
+	GQuark wrk_type;
+	pid_t wrk_pid;
 	gpointer ud;
 	gint attached_fd;
 	struct rspamd_control_reply_elt *prev, *next;
@@ -193,15 +194,15 @@ rspamd_control_write_reply (struct rspamd_control_session *session)
 		/* Skip incompatible worker for fuzzy_stat */
 		if ((session->cmd.type == RSPAMD_CONTROL_FUZZY_STAT ||
 			session->cmd.type == RSPAMD_CONTROL_FUZZY_SYNC) &&
-				elt->wrk->type != g_quark_from_static_string ("fuzzy")) {
+				elt->wrk_type != g_quark_from_static_string ("fuzzy")) {
 			continue;
 		}
 
-		rspamd_snprintf (tmpbuf, sizeof (tmpbuf), "%P", elt->wrk->pid);
+		rspamd_snprintf (tmpbuf, sizeof (tmpbuf), "%P", elt->wrk_pid);
 		cur = ucl_object_typed_new (UCL_OBJECT);
 
 		ucl_object_insert_key (cur, ucl_object_fromstring (g_quark_to_string (
-				elt->wrk->type)), "type", 0, false);
+				elt->wrk_type)), "type", 0, false);
 
 		switch (session->cmd.type) {
 		case RSPAMD_CONTROL_STAT:
@@ -340,7 +341,7 @@ rspamd_control_wrk_io (gint fd, short what, gpointer ud)
 		r = recvmsg (fd, &msg, 0);
 		if (r == -1) {
 			msg_err ("cannot read reply from the worker %P (%s): %s",
-					elt->wrk->pid, g_quark_to_string (elt->wrk->type),
+					elt->wrk_pid, g_quark_to_string (elt->wrk_type),
 					strerror (errno));
 		}
 		else if (r >= (gssize)sizeof (elt->reply)) {
@@ -352,7 +353,7 @@ rspamd_control_wrk_io (gint fd, short what, gpointer ud)
 	else {
 		/* Timeout waiting */
 		msg_warn ("timeout waiting reply from %P (%s)",
-				elt->wrk->pid, g_quark_to_string (elt->wrk->type));
+				elt->wrk_pid, g_quark_to_string (elt->wrk_type));
 	}
 
 	session->replies_remain --;
@@ -384,9 +385,10 @@ rspamd_control_error_handler (struct rspamd_http_connection *conn, GError *err)
 
 static struct rspamd_control_reply_elt *
 rspamd_control_broadcast_cmd (struct rspamd_main *rspamd_main,
-		struct rspamd_control_command *cmd,
-		gint attached_fd,
-		void (*handler) (int, short, void *), gpointer ud)
+							  struct rspamd_control_command *cmd,
+							  gint attached_fd,
+							  rspamd_ev_cb handler,
+							  gpointer ud)
 {
 	GHashTableIter it;
 	struct rspamd_worker *wrk;
@@ -430,7 +432,8 @@ rspamd_control_broadcast_cmd (struct rspamd_main *rspamd_main,
 
 		if (r == sizeof (*cmd)) {
 			rep_elt = g_malloc0 (sizeof (*rep_elt));
-			rep_elt->wrk = wrk;
+			rep_elt->wrk_pid = wrk->pid;
+			rep_elt->wrk_type = wrk->type;
 			rep_elt->event_loop = rspamd_main->event_loop;
 			rep_elt->ud = ud;
 			rspamd_ev_watcher_init (&rep_elt->ev,


More information about the Commits mailing list