diff options
author | dtucker@openbsd.org <dtucker@openbsd.org> | 2016-11-30 00:28:31 +0000 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2016-11-30 19:44:01 +1100 |
commit | 7fc4766ac78abae81ee75b22b7550720bfa28a33 (patch) | |
tree | 36cc862d4d493587327dc91f89cf96b22e8230ee /sshd.c | |
parent | c9f880c195c65f1dddcbc4ce9d6bfea7747debcc (diff) |
upstream commit
On startup, check to see if sshd is already daemonized
and if so, skip the call to daemon() and do not rewrite the PidFile. This
means that when sshd re-execs itself on SIGHUP the process ID will no longer
change. Should address bz#2641. ok djm@ markus@.
Upstream-ID: 5ea0355580056fb3b25c1fd6364307d9638a37b9
Diffstat (limited to 'sshd.c')
-rw-r--r-- | sshd.c | 15 |
1 files changed, 8 insertions, 7 deletions
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: sshd.c,v 1.477 2016/11/29 03:54:50 dtucker Exp $ */ | 1 | /* $OpenBSD: sshd.c,v 1.478 2016/11/30 00:28:31 dtucker Exp $ */ |
2 | /* | 2 | /* |
3 | * Author: Tatu Ylonen <ylo@cs.hut.fi> | 3 | * Author: Tatu Ylonen <ylo@cs.hut.fi> |
4 | * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland | 4 | * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland |
@@ -1343,7 +1343,7 @@ main(int ac, char **av) | |||
1343 | struct ssh *ssh = NULL; | 1343 | struct ssh *ssh = NULL; |
1344 | extern char *optarg; | 1344 | extern char *optarg; |
1345 | extern int optind; | 1345 | extern int optind; |
1346 | int r, opt, i, j, on = 1; | 1346 | int r, opt, i, j, on = 1, already_daemon; |
1347 | int sock_in = -1, sock_out = -1, newsock = -1; | 1347 | int sock_in = -1, sock_out = -1, newsock = -1; |
1348 | const char *remote_ip; | 1348 | const char *remote_ip; |
1349 | int remote_port; | 1349 | int remote_port; |
@@ -1802,11 +1802,12 @@ main(int ac, char **av) | |||
1802 | log_init(__progname, options.log_level, options.log_facility, log_stderr); | 1802 | log_init(__progname, options.log_level, options.log_facility, log_stderr); |
1803 | 1803 | ||
1804 | /* | 1804 | /* |
1805 | * If not in debugging mode, and not started from inetd, disconnect | 1805 | * If not in debugging mode, not started from inetd and not already |
1806 | * from the controlling terminal, and fork. The original process | 1806 | * daemonized (eg re-exec via SIGHUP), disconnect from the controlling |
1807 | * exits. | 1807 | * terminal, and fork. The original process exits. |
1808 | */ | 1808 | */ |
1809 | if (!(debug_flag || inetd_flag || no_daemon_flag)) { | 1809 | already_daemon = daemonized(); |
1810 | if (!(debug_flag || inetd_flag || no_daemon_flag || already_daemon)) { | ||
1810 | 1811 | ||
1811 | if (daemon(0, 0) < 0) | 1812 | if (daemon(0, 0) < 0) |
1812 | fatal("daemon() failed: %.200s", strerror(errno)); | 1813 | fatal("daemon() failed: %.200s", strerror(errno)); |
@@ -1840,7 +1841,7 @@ main(int ac, char **av) | |||
1840 | * Write out the pid file after the sigterm handler | 1841 | * Write out the pid file after the sigterm handler |
1841 | * is setup and the listen sockets are bound | 1842 | * is setup and the listen sockets are bound |
1842 | */ | 1843 | */ |
1843 | if (options.pid_file != NULL && !debug_flag) { | 1844 | if (options.pid_file != NULL && !debug_flag && !already_daemon) { |
1844 | FILE *f = fopen(options.pid_file, "w"); | 1845 | FILE *f = fopen(options.pid_file, "w"); |
1845 | 1846 | ||
1846 | if (f == NULL) { | 1847 | if (f == NULL) { |