From ae66be67da3b3f4d90fc4a6f8499183d715238bf Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 24 Jul 2017 08:57:24 +0100 Subject: [PATCH] [Minor] Further fixes for subprocess spawning logic --- src/libserver/rspamd_control.c | 4 ++-- src/lua/lua_common.c | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/libserver/rspamd_control.c b/src/libserver/rspamd_control.c index 14a258828..ab317bde2 100644 --- a/src/libserver/rspamd_control.c +++ b/src/libserver/rspamd_control.c @@ -751,7 +751,7 @@ rspamd_control_handle_on_fork (struct rspamd_srv_command *cmd, if (cmd->cmd.on_fork.state == child_dead) { /* We need to remove stale worker */ child = g_hash_table_lookup (srv->workers, - GSIZE_TO_POINTER (cmd->cmd.on_fork.ppid)); + GSIZE_TO_POINTER (cmd->cmd.on_fork.cpid)); if (child == NULL) { msg_err ("cannot find child for a forked process %P (%P parent)", @@ -762,7 +762,7 @@ rspamd_control_handle_on_fork (struct rspamd_srv_command *cmd, REF_RELEASE (child->cf); g_hash_table_remove (srv->workers, - GSIZE_TO_POINTER (cmd->cmd.on_fork.ppid)); + GSIZE_TO_POINTER (cmd->cmd.on_fork.cpid)); g_free (child); } else { diff --git a/src/lua/lua_common.c b/src/lua/lua_common.c index e94cbe281..762069294 100644 --- a/src/lua/lua_common.c +++ b/src/lua/lua_common.c @@ -1466,12 +1466,11 @@ rspamd_lua_cld_handler (struct rspamd_worker_signal_handler *sigh, void *ud) /* We still need to call on_complete callback */ rspamd_lua_call_on_complete (cbdata->L, cbdata, "Worker has died without reply", NULL, 0); + event_del (&cbdata->ev); } /* Free structures */ - event_del (&cbdata->ev); close (cbdata->sp[0]); - close (cbdata->sp[1]); luaL_unref (L, LUA_REGISTRYINDEX, cbdata->func_cbref); luaL_unref (L, LUA_REGISTRYINDEX, cbdata->cb_cbref); g_string_free (cbdata->io_buf, TRUE); @@ -1496,7 +1495,7 @@ rspamd_lua_subprocess_io (gint fd, short what, gpointer ud) struct rspamd_lua_process_cbdata *cbdata = ud; gssize r; - if (cbdata->io_buf->len < sizeof (guint64)) { + if (cbdata->sz == (guint64)-1) { guint64 sz; /* We read size of reply + flags first */ @@ -1506,6 +1505,8 @@ rspamd_lua_subprocess_io (gint fd, short what, gpointer ud) if (r == 0) { rspamd_lua_call_on_complete (cbdata->L, cbdata, "Unexpected EOF", NULL, 0); + event_del (&cbdata->ev); + cbdata->replied = TRUE; kill (cbdata->cpid, SIGTERM); return; @@ -1517,6 +1518,8 @@ rspamd_lua_subprocess_io (gint fd, short what, gpointer ud) else { rspamd_lua_call_on_complete (cbdata->L, cbdata, strerror (errno), NULL, 0); + event_del (&cbdata->ev); + cbdata->replied = TRUE; kill (cbdata->cpid, SIGTERM); return; @@ -1547,6 +1550,8 @@ rspamd_lua_subprocess_io (gint fd, short what, gpointer ud) if (r == 0) { rspamd_lua_call_on_complete (cbdata->L, cbdata, "Unexpected EOF", NULL, 0); + event_del (&cbdata->ev); + cbdata->replied = TRUE; kill (cbdata->cpid, SIGTERM); return; @@ -1558,6 +1563,8 @@ rspamd_lua_subprocess_io (gint fd, short what, gpointer ud) else { rspamd_lua_call_on_complete (cbdata->L, cbdata, strerror (errno), NULL, 0); + event_del (&cbdata->ev); + cbdata->replied = TRUE; kill (cbdata->cpid, SIGTERM); return; @@ -1580,6 +1587,9 @@ rspamd_lua_subprocess_io (gint fd, short what, gpointer ud) NULL, cbdata->io_buf->str, cbdata->io_buf->len); } + event_del (&cbdata->ev); + cbdata->replied = TRUE; + /* Write reply to the child */ rspamd_socket_blocking (cbdata->sp[0]); memset (rep, 0, sizeof (rep)); @@ -1627,6 +1637,7 @@ lua_worker_spawn_process (lua_State *L) cbdata->wrk = w; cbdata->L = L; cbdata->ev_base = actx->ev_base; + cbdata->sz = (guint64)-1; pid = fork (); -- 2.39.5