Browse Source

Exit when we can't write to a configured pid file

This is probably what the user wants, according to 20119.
Nick Mathewson 6 years ago
parent
commit
1098893e4f
4 changed files with 21 additions and 7 deletions
  1. 3 0
      changes/feature20119_1
  2. 11 4
      src/common/util.c
  3. 1 1
      src/common/util.h
  4. 6 2
      src/or/config.c

+ 3 - 0
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.

+ 11 - 4
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;
   }
 }
 

+ 1 - 1
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,

+ 6 - 2
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 */