Browse Source

control: Make HSPOST properly parse HSADDRESS= param

For HSv3, the HSADDRESS= wasn't properly parsed for the HSPOST command. It now
correctly use it and furthermore sends back a "200 OK" in case the command is
successful for a v3 descriptor.

Fixes #26523

Signed-off-by: David Goulet <dgoulet@torproject.org>
David Goulet 5 years ago
parent
commit
3f8a12a63a
2 changed files with 14 additions and 4 deletions
  1. 5 0
      changes/bug26523
  2. 9 4
      src/or/control.c

+ 5 - 0
changes/bug26523

@@ -0,0 +1,5 @@
+  o Minor bugfixes (hidden service, control port):
+    - The HSPOST command wasn't parsing properly the HSADDRESS= parameter and
+      thus not using it. It now handles it correctly. Fixes bug 26523; bugfix on
+      0.3.3.1-alpha. Patch by "akwizgran".
+

+ 9 - 4
src/or/control.c

@@ -4342,8 +4342,10 @@ handle_control_hspost(control_connection_t *conn,
 
   smartlist_t *args = smartlist_new();
 
-  /* If any SERVER= options were specified, try parse the options line */
-  if (!strcasecmpstart(argline, opt_server)) {
+  /* If any SERVER= or HSADDRESS= options were specified, try to parse
+   * the options line. */
+  if (!strcasecmpstart(argline, opt_server) ||
+      !strcasecmpstart(argline, opt_hsaddress)) {
     /* encoded_desc begins after a newline character */
     cp = cp + 1;
     encoded_desc = cp;
@@ -4366,11 +4368,12 @@ handle_control_hspost(control_connection_t *conn,
           hs_dirs = smartlist_new();
         smartlist_add(hs_dirs, node->rs);
       } else if (!strcasecmpstart(arg, opt_hsaddress)) {
-        if (!hs_address_is_valid(arg)) {
+        const char *address = arg + strlen(opt_hsaddress);
+        if (!hs_address_is_valid(address)) {
           connection_printf_to_buf(conn, "512 Malformed onion address\r\n");
           goto done;
         }
-        onion_address = arg;
+        onion_address = address;
       } else {
         connection_printf_to_buf(conn, "512 Unexpected argument \"%s\"\r\n",
                                  arg);
@@ -4385,6 +4388,8 @@ handle_control_hspost(control_connection_t *conn,
     read_escaped_data(encoded_desc, encoded_desc_len, &desc_str);
     if (hs_control_hspost_command(desc_str, onion_address, hs_dirs) < 0) {
       connection_printf_to_buf(conn, "554 Invalid descriptor\r\n");
+    } else {
+      send_control_done(conn);
     }
     tor_free(desc_str);
     goto done;