[tor-commits] [tor/master] Exit when we can't write to a configured pid file

nickm at torproject.org nickm at torproject.org
Fri Sep 8 12:59:09 UTC 2017


commit 1098893e4f3753bf66248abf81702175dca980ee
Author: Nick Mathewson <nickm at torproject.org>
Date:   Wed Sep 6 11:50:22 2017 -0400

    Exit when we can't write to a configured pid file
    
    This is probably what the user wants, according to 20119.
---
 changes/feature20119_1 |  3 +++
 src/common/util.c      | 15 +++++++++++----
 src/common/util.h      |  2 +-
 src/or/config.c        |  8 ++++++--
 4 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/changes/feature20119_1 b/changes/feature20119_1
new file mode 100644
index 000000000..69914f210
--- /dev/null
+++ b/changes/feature20119_1
@@ -0,0 +1,3 @@
+  o Minor features (startup, safety):
+    - When configured to write a PID file, Tor now exits if it is unable to
+      do so.  Previously, it would warn and continue. Closes ticket 20119.
diff --git a/src/common/util.c b/src/common/util.c
index 31d42a3e5..36d0f4d06 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -3691,8 +3691,9 @@ finish_daemon(const char *cp)
 #endif
 
 /** Write the current process ID, followed by NL, into <b>filename</b>.
+ * Return 0 on success, -1 on failure.
  */
-void
+int
 write_pidfile(const char *filename)
 {
   FILE *pidfile;
@@ -3700,13 +3701,19 @@ write_pidfile(const char *filename)
   if ((pidfile = fopen(filename, "w")) == NULL) {
     log_warn(LD_FS, "Unable to open \"%s\" for writing: %s", filename,
              strerror(errno));
+    return -1;
   } else {
 #ifdef _WIN32
-    fprintf(pidfile, "%d\n", (int)_getpid());
+    int pid = (int)_getpid();
 #else
-    fprintf(pidfile, "%d\n", (int)getpid());
+    int pid = (int)getpid();
 #endif
-    fclose(pidfile);
+    int rv = 0;
+    if (fprintf(pidfile, "%d\n", pid) < 0)
+      rv = -1;
+    if (fclose(pidfile) < 0)
+      rv = -1;
+    return rv;
   }
 }
 
diff --git a/src/common/util.h b/src/common/util.h
index f50cf043a..073fb82ae 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -389,7 +389,7 @@ int path_is_relative(const char *filename);
 /* Process helpers */
 void start_daemon(void);
 void finish_daemon(const char *desired_cwd);
-void write_pidfile(const char *filename);
+int write_pidfile(const char *filename);
 
 /* Port forwarding */
 void tor_check_port_forwarding(const char *filename,
diff --git a/src/or/config.c b/src/or/config.c
index eb89d6f5e..872bbbd64 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -1772,9 +1772,13 @@ options_act(const or_options_t *old_options)
   }
 
   /* Write our PID to the PID file. If we do not have write permissions we
-   * will log a warning */
+   * will log a warning and exit. */
   if (options->PidFile && !sandbox_is_active()) {
-    write_pidfile(options->PidFile);
+    if (write_pidfile(options->PidFile) < 0) {
+      log_err(LD_CONFIG, "Unable to write PIDFile %s",
+              escaped(options->PidFile));
+      return -1;
+    }
   }
 
   /* Register addressmap directives */





More information about the tor-commits mailing list