Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nginx/nginx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src/os/unix
diff options
context:
space:
mode:
authorRuslan Ermilov <ru@nginx.com>2017-11-28 12:00:24 +0300
committerRuslan Ermilov <ru@nginx.com>2017-11-28 12:00:24 +0300
commitafad21917584e9b452ba33ce3485edde5615b859 (patch)
tree883222e33a8203c4023017f7536b040c48a881cb /src/os/unix
parent7a7fc708fb7f6739dc6652ee1f14da1f9e24650d (diff)
Fixed "changing binary" when reaper is not init.
On some systems, it's possible that reaper of orphaned processes is set to something other than "init" process. On such systems, the changing binary procedure did not work. The fix is to check if PPID has changed, instead of assuming it's always 1 for orphaned processes.
Diffstat (limited to 'src/os/unix')
-rw-r--r--src/os/unix/ngx_daemon.c1
-rw-r--r--src/os/unix/ngx_process.c7
-rw-r--r--src/os/unix/ngx_process.h2
-rw-r--r--src/os/unix/ngx_process_cycle.c1
4 files changed, 8 insertions, 3 deletions
diff --git a/src/os/unix/ngx_daemon.c b/src/os/unix/ngx_daemon.c
index ab6721108..385c49b6c 100644
--- a/src/os/unix/ngx_daemon.c
+++ b/src/os/unix/ngx_daemon.c
@@ -26,6 +26,7 @@ ngx_daemon(ngx_log_t *log)
exit(0);
}
+ ngx_parent = ngx_pid;
ngx_pid = ngx_getpid();
if (setsid() == -1) {
diff --git a/src/os/unix/ngx_process.c b/src/os/unix/ngx_process.c
index 993c032ae..15680237a 100644
--- a/src/os/unix/ngx_process.c
+++ b/src/os/unix/ngx_process.c
@@ -194,6 +194,7 @@ ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data,
return NGX_INVALID_PID;
case 0:
+ ngx_parent = ngx_pid;
ngx_pid = ngx_getpid();
proc(cycle, data);
break;
@@ -371,12 +372,12 @@ ngx_signal_handler(int signo, siginfo_t *siginfo, void *ucontext)
break;
case ngx_signal_value(NGX_CHANGEBIN_SIGNAL):
- if (getppid() > 1 || ngx_new_binary > 0) {
+ if (ngx_getppid() == ngx_parent || ngx_new_binary > 0) {
/*
* Ignore the signal in the new binary if its parent is
- * not the init process, i.e. the old binary's process
- * is still running. Or ignore the signal in the old binary's
+ * not changed, i.e. the old binary's process is still
+ * running. Or ignore the signal in the old binary's
* process if the new binary's process is already running.
*/
diff --git a/src/os/unix/ngx_process.h b/src/os/unix/ngx_process.h
index 7b5e8c0c2..3986639b4 100644
--- a/src/os/unix/ngx_process.h
+++ b/src/os/unix/ngx_process.h
@@ -54,6 +54,7 @@ typedef struct {
#define ngx_getpid getpid
+#define ngx_getppid getppid
#ifndef ngx_log_pid
#define ngx_log_pid ngx_pid
@@ -79,6 +80,7 @@ extern char **ngx_argv;
extern char **ngx_os_argv;
extern ngx_pid_t ngx_pid;
+extern ngx_pid_t ngx_parent;
extern ngx_socket_t ngx_channel;
extern ngx_int_t ngx_process_slot;
extern ngx_int_t ngx_last_process;
diff --git a/src/os/unix/ngx_process_cycle.c b/src/os/unix/ngx_process_cycle.c
index 1710ea812..a20a515c7 100644
--- a/src/os/unix/ngx_process_cycle.c
+++ b/src/os/unix/ngx_process_cycle.c
@@ -31,6 +31,7 @@ static void ngx_cache_loader_process_handler(ngx_event_t *ev);
ngx_uint_t ngx_process;
ngx_uint_t ngx_worker;
ngx_pid_t ngx_pid;
+ngx_pid_t ngx_parent;
sig_atomic_t ngx_reap;
sig_atomic_t ngx_sigio;