commit a57c27a1c749add88b088f570838373687a0c6fd Author: Nick Mathewson nickm@torproject.org Date: Wed Aug 8 17:32:26 2018 -0400
Call crypto_postfork on start_daemon() instead. --- src/app/config/config.c | 7 +++---- src/lib/process/daemon.c | 10 ++++++---- src/lib/process/daemon.h | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/src/app/config/config.c b/src/app/config/config.c index eb935fd4e..d2ed29562 100644 --- a/src/app/config/config.c +++ b/src/app/config/config.c @@ -1411,7 +1411,8 @@ options_act_reversible(const or_options_t *old_options, char **msg) * processes. */ if (running_tor && options->RunAsDaemon) { /* No need to roll back, since you can't change the value. */ - start_daemon(); + if (start_daemon()) + crypto_postfork(); }
#ifdef HAVE_SYSTEMD @@ -2027,9 +2028,7 @@ options_act(const or_options_t *old_options) /* Finish backgrounding the process */ if (options->RunAsDaemon) { /* We may be calling this for the n'th time (on SIGHUP), but it's safe. */ - int forked = finish_daemon(options->DataDirectory); - if (forked) - crypto_postfork(); + finish_daemon(options->DataDirectory); }
/* See whether we need to enable/disable our once-a-second timer. */ diff --git a/src/lib/process/daemon.c b/src/lib/process/daemon.c index 4836b3951..3fc224104 100644 --- a/src/lib/process/daemon.c +++ b/src/lib/process/daemon.c @@ -41,15 +41,16 @@ static int daemon_filedes[2]; /** Start putting the process into daemon mode: fork and drop all resources * except standard fds. The parent process never returns, but stays around * until finish_daemon is called. (Note: it's safe to call this more - * than once: calls after the first are ignored.) + * than once: calls after the first are ignored.) Return true if we actually + * forked and this is the child; false otherwise. */ -void +int start_daemon(void) { pid_t pid;
if (start_daemon_called) - return; + return 0; start_daemon_called = 1;
if (pipe(daemon_filedes)) { @@ -80,6 +81,7 @@ start_daemon(void) exit(0); // exit ok: during daemonize, daemonizing. else exit(1); /* child reported error. exit ok: daemonize failed. */ + return 0; // LCOV_EXCL_LINE unreachable } else { /* Child */ close(daemon_filedes[0]); /* we only write */
@@ -95,7 +97,7 @@ start_daemon(void) } set_main_thread(); /* We are now the main thread. */
- return; + return 1; } }
diff --git a/src/lib/process/daemon.h b/src/lib/process/daemon.h index 08cab17e1..c3b78029a 100644 --- a/src/lib/process/daemon.h +++ b/src/lib/process/daemon.h @@ -11,7 +11,7 @@ #ifndef TOR_DAEMON_H #define TOR_DAEMON_H
-void start_daemon(void); +int start_daemon(void); int finish_daemon(const char *desired_cwd);
#endif
tor-commits@lists.torproject.org