[tor-commits] [tor/master] Call crypto_postfork on start_daemon() instead.

nickm at torproject.org nickm at torproject.org
Wed Sep 5 00:47:14 UTC 2018


commit a57c27a1c749add88b088f570838373687a0c6fd
Author: Nick Mathewson <nickm at 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





More information about the tor-commits mailing list