From 268304927d803c2113f401ac32c87379416e6b30 Mon Sep 17 00:00:00 2001 From: Joachim Nilsson Date: Fri, 19 Jan 2018 16:27:25 +0100 Subject: [PATCH] Fix segfault, stop a crashing service before deleting it Finit tries to restart crashing services. If a service is removed before Finit has given up restarting it, then the background timer responsible the restart may dereference a free():d svc_t. Hence, make sure to properly stop (and step) a service and its timer callbacks in service_unregister() before calling svc_del(). Signed-off-by: Joachim Nilsson --- src/service.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/service.c b/src/service.c index 1fdf5e25..55edf163 100644 --- a/src/service.c +++ b/src/service.c @@ -857,6 +857,9 @@ void service_unregister(svc_t *svc) if (!svc) return; + service_stop(svc); + service_step(svc); + if (svc_is_inetd(svc)) { if (svc_is_busy(svc->inetd.svc)) { svc_unblock(svc->inetd.svc);