From 92a483bca2df734aff5caada6c23409ed6256773 Mon Sep 17 00:00:00 2001 From: "Meir Shpilraien (Spielrein)" Date: Tue, 22 Dec 2020 15:17:39 +0200 Subject: [PATCH] Fix issue where fork process deletes the parent pidfile (#8231) Turns out that when the fork child crashes, the crash log was deleting the pidfile from the disk (although the parent is still running. Now we set the pidfile of the fork process to NULL so the fork process will never deletes it. --- src/debug.c | 2 +- src/server.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index 6ce8b3bdc6..26c1a91fc1 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1808,7 +1808,7 @@ void bugReportEnd(int killViaSignal, int sig) { ); /* free(messages); Don't call free() with possibly corrupted memory. */ - if (server.daemonize && server.supervised == 0) unlink(server.pidfile); + if (server.daemonize && server.supervised == 0 && server.pidfile) unlink(server.pidfile); if (!killViaSignal) { if (server.use_exit_on_panic) diff --git a/src/server.c b/src/server.c index 29c8109282..0be8fb003d 100644 --- a/src/server.c +++ b/src/server.c @@ -5200,6 +5200,10 @@ void closeClildUnusedResourceAfterFork() { closeListeningSockets(0); if (server.cluster_enabled && server.cluster_config_file_lock_fd != -1) close(server.cluster_config_file_lock_fd); /* don't care if this fails */ + + /* Clear server.pidfile, this is the parent pidfile which should not + * be touched (or deleted) by the child (on exit / crash) */ + server.pidfile = NULL; } /* purpose is one of CHILD_TYPE_ types */