7cfad5
From 62470498cca9a209aa9904668c1949f5229123af Mon Sep 17 00:00:00 2001
7cfad5
From: Felix Kaechele <felix@kaechele.ca>
7cfad5
Date: Tue, 20 Apr 2021 21:28:18 -0400
7cfad5
Subject: [PATCH 2/2] fix PIDFile handling
7cfad5
7cfad5
Corresponding RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1869026
7cfad5
7cfad5
Rejected upstream: https://trac.nginx.org/nginx/ticket/1897
7cfad5
7cfad5
Taken from: https://git.launchpad.net/ubuntu/+source/nginx/tree/debian/patches/nginx-fix-pidfile.patch
7cfad5
7cfad5
From original patch:
7cfad5
Author: Tj <ubuntu@iam.tj>
7cfad5
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/nginx/+bug/1581864
7cfad5
Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=876365
7cfad5
iLast-Update: 2020-06-24
7cfad5
7cfad5
Signed-off-by: Felix Kaechele <felix@kaechele.ca>
7cfad5
---
7cfad5
 src/core/nginx.c         | 24 +++++++++++++++++++++---
7cfad5
 src/os/unix/ngx_daemon.c |  8 ++++++--
7cfad5
 2 files changed, 27 insertions(+), 5 deletions(-)
7cfad5
7cfad5
diff --git a/src/core/nginx.c b/src/core/nginx.c
7cfad5
index 48a20e9..32c0afe 100644
7cfad5
--- a/src/core/nginx.c
7cfad5
+++ b/src/core/nginx.c
7cfad5
@@ -339,14 +339,21 @@ main(int argc, char *const *argv)
7cfad5
         ngx_process = NGX_PROCESS_MASTER;
7cfad5
     }
7cfad5
 
7cfad5
+    /* tell-tale to detect if this is parent or child process */
7cfad5
+    ngx_int_t child_pid = NGX_BUSY;
7cfad5
+
7cfad5
 #if !(NGX_WIN32)
7cfad5
 
7cfad5
     if (ngx_init_signals(cycle->log) != NGX_OK) {
7cfad5
         return 1;
7cfad5
     }
7cfad5
 
7cfad5
+    /* tell-tale that this code has been executed */
7cfad5
+    child_pid--;
7cfad5
+
7cfad5
     if (!ngx_inherited && ccf->daemon) {
7cfad5
-        if (ngx_daemon(cycle->log) != NGX_OK) {
7cfad5
+        child_pid = ngx_daemon(cycle->log);
7cfad5
+        if (child_pid == NGX_ERROR) {
7cfad5
             return 1;
7cfad5
         }
7cfad5
 
7cfad5
@@ -359,8 +366,19 @@ main(int argc, char *const *argv)
7cfad5
 
7cfad5
 #endif
7cfad5
 
7cfad5
-    if (ngx_create_pidfile(&ccf->pid, cycle->log) != NGX_OK) {
7cfad5
-        return 1;
7cfad5
+    /* If ngx_daemon() returned the child's PID in the parent process
7cfad5
+     * after the fork() set ngx_pid to the child_pid, which gets
7cfad5
+     * written to the PID file, then exit.
7cfad5
+     * For NGX_WIN32 always write the PID file
7cfad5
+     * For others, only write it from the parent process */
7cfad5
+    if (child_pid < NGX_OK || child_pid > NGX_OK) {
7cfad5
+	ngx_pid = child_pid > NGX_OK ? child_pid : ngx_pid;
7cfad5
+        if (ngx_create_pidfile(&ccf->pid, cycle->log) != NGX_OK) {
7cfad5
+            return 1;
7cfad5
+	}
7cfad5
+    }
7cfad5
+    if (child_pid > NGX_OK) {
7cfad5
+        exit(0);
7cfad5
     }
7cfad5
 
7cfad5
     if (ngx_log_redirect_stderr(cycle) != NGX_OK) {
7cfad5
diff --git a/src/os/unix/ngx_daemon.c b/src/os/unix/ngx_daemon.c
7cfad5
index 385c49b..3719854 100644
7cfad5
--- a/src/os/unix/ngx_daemon.c
7cfad5
+++ b/src/os/unix/ngx_daemon.c
7cfad5
@@ -7,14 +7,17 @@
7cfad5
 
7cfad5
 #include <ngx_config.h>
7cfad5
 #include <ngx_core.h>
7cfad5
+#include <unistd.h>
7cfad5
 
7cfad5
 
7cfad5
 ngx_int_t
7cfad5
 ngx_daemon(ngx_log_t *log)
7cfad5
 {
7cfad5
     int  fd;
7cfad5
+    /* retain the return value for passing back to caller */
7cfad5
+    pid_t pid_child = fork();
7cfad5
 
7cfad5
-    switch (fork()) {
7cfad5
+    switch (pid_child) {
7cfad5
     case -1:
7cfad5
         ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed");
7cfad5
         return NGX_ERROR;
7cfad5
@@ -23,7 +26,8 @@ ngx_daemon(ngx_log_t *log)
7cfad5
         break;
7cfad5
 
7cfad5
     default:
7cfad5
-        exit(0);
7cfad5
+        /* let caller do the exit() */
7cfad5
+        return pid_child;
7cfad5
     }
7cfad5
 
7cfad5
     ngx_parent = ngx_pid;
7cfad5
-- 
7cfad5
2.31.1
7cfad5