From e330568504ec379ea42460d21a2e20b1652d9445 Mon Sep 17 00:00:00 2001 From: Reid Wahl Date: Fri, 14 Jan 2022 01:35:35 -0800 Subject: [PATCH] Fix: fencing: Don't set stonith action to pending if fork fails Currently, we set a stonith action to pending if services_action_async_fork_notify() returns true. However, "true" means that the svc_action should not be freed. This might be because the svc_action forked successfully and is pending, or it might be because the svc_action has already been freed. In the case of stonith actions, if we fail to fork, the stonith_action_t object stored in svc_action->cb_data gets freed by the done callback, and services_action_async_fork_notify() returns true. If we try to set the action to pending, it causes a segfault. This commit moves the "set to pending" step to the stonith_action_async_forked() callback. We avoid the segfault and only set it to pending if it's actually pending. A slight difference in ordering was required to achieve this. Now, the action gets set to pending immediately before being added to the mainloop, instead of immediately after. Signed-off-by: Reid Wahl --- lib/fencing/st_actions.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/fencing/st_actions.c b/lib/fencing/st_actions.c index e4e43225cd..306001af69 100644 --- a/lib/fencing/st_actions.c +++ b/lib/fencing/st_actions.c @@ -550,6 +550,9 @@ stonith_action_async_forked(svc_action_t *svc_action) (action->fork_cb) (svc_action->pid, action->userdata); } + pcmk__set_result(&(action->result), PCMK_OCF_UNKNOWN, PCMK_EXEC_PENDING, + NULL); + crm_trace("Child process %d performing action '%s' successfully forked", action->pid, action->action); } @@ -619,8 +622,6 @@ internal_stonith_action_execute(stonith_action_t * action) if (services_action_async_fork_notify(svc_action, &stonith_action_async_done, &stonith_action_async_forked)) { - pcmk__set_result(&(action->result), PCMK_OCF_UNKNOWN, - PCMK_EXEC_PENDING, NULL); return pcmk_ok; } -- 2.27.0