Browse Source

Add a DROPOWNERSHIP controller command to undo TAKEOWNERSHIP.

Closes ticket 28843.
Nick Mathewson 5 years ago
parent
commit
4bc3983f64
2 changed files with 26 additions and 0 deletions
  1. 3 0
      changes/ticket28843
  2. 23 0
      src/feature/control/control.c

+ 3 - 0
changes/ticket28843

@@ -0,0 +1,3 @@
+  o Minor features (controller):
+    - Add a DROPOWNERSHIP command to undo the effects of TAKEOWNERSHIP.
+      Implements ticket 28843.

+ 23 - 0
src/feature/control/control.c

@@ -1741,6 +1741,26 @@ handle_control_takeownership(control_connection_t *conn, uint32_t len,
   return 0;
 }
 
+/** Called when we get a DROPOWNERSHIP command.  Mark this connection
+ * as a non-owning connection, so that we will not exit if the connection
+ * closes. */
+static int
+handle_control_dropownership(control_connection_t *conn, uint32_t len,
+                             const char *body)
+{
+  (void)len;
+  (void)body;
+
+  conn->is_owning_control_connection = 0;
+
+  log_info(LD_CONTROL, "Control connection %d has dropped ownership of this "
+           "Tor instance.",
+           (int)(conn->base_.s));
+
+  send_control_done(conn);
+  return 0;
+}
+
 /** Return true iff <b>addr</b> is unusable as a mapaddress target because of
  * containing funny characters. */
 static int
@@ -5548,6 +5568,9 @@ connection_control_process_inbuf(control_connection_t *conn)
   } else if (!strcasecmp(conn->incoming_cmd, "TAKEOWNERSHIP")) {
     if (handle_control_takeownership(conn, cmd_data_len, args))
       return -1;
+  } else if (!strcasecmp(conn->incoming_cmd, "DROPOWNERSHIP")) {
+    if (handle_control_dropownership(conn, cmd_data_len, args))
+      return -1;
   } else if (!strcasecmp(conn->incoming_cmd, "MAPADDRESS")) {
     if (handle_control_mapaddress(conn, cmd_data_len, args))
       return -1;