Przeglądaj źródła

Merge commit '763fd0ad66' into maint-0.4.0

tor-github/pr/1174, but with the last commit re-worded to remove
the fixup, because fixups break our push rules.
teor 4 lat temu
rodzic
commit
1203e137be
2 zmienionych plików z 27 dodań i 10 usunięć
  1. 4 0
      changes/bug30649
  2. 23 10
      src/core/or/circuitpadding.c

+ 4 - 0
changes/bug30649

@@ -0,0 +1,4 @@
+  o Minor bugfixes (circuit padding):
+    - On relays, properly check that a padding machine is absent before
+      logging a warn about it being absent. Fixes bug 30649;
+      bugfix on 0.4.0.1-alpha.

+ 23 - 10
src/core/or/circuitpadding.c

@@ -160,17 +160,25 @@ circpad_circuit_machineinfo_free_idx(circuit_t *circ, int idx)
   }
 }
 
-/** Free all the machineinfos in <b>circ</b> that match <b>machine_num</b>. */
-static void
+/**
+ * Free all the machineinfos in <b>circ</b> that match <b>machine_num</b>.
+ *
+ * Returns true if any machineinfos with that number were freed.
+ * False otherwise. */
+static int
 free_circ_machineinfos_with_machine_num(circuit_t *circ, int machine_num)
 {
+  int found = 0;
   FOR_EACH_CIRCUIT_MACHINE_BEGIN(i) {
     if (circ->padding_machine[i] &&
         circ->padding_machine[i]->machine_num == machine_num) {
       circpad_circuit_machineinfo_free_idx(circ, i);
       circ->padding_machine[i] = NULL;
+      found = 1;
     }
   } FOR_EACH_CIRCUIT_MACHINE_END;
+
+  return found;
 }
 
 /**
@@ -2425,22 +2433,27 @@ circpad_handle_padding_negotiate(circuit_t *circ, cell_t *cell)
   circpad_negotiate_t *negotiate;
 
   if (CIRCUIT_IS_ORIGIN(circ)) {
-    log_fn(LOG_WARN, LD_PROTOCOL,
+    log_fn(LOG_PROTOCOL_WARN, LD_CIRC,
            "Padding negotiate cell unsupported at origin.");
     return -1;
   }
 
   if (circpad_negotiate_parse(&negotiate, cell->payload+RELAY_HEADER_SIZE,
                                CELL_PAYLOAD_SIZE-RELAY_HEADER_SIZE) < 0) {
-    log_fn(LOG_WARN, LD_CIRC,
+    log_fn(LOG_PROTOCOL_WARN, LD_CIRC,
           "Received malformed PADDING_NEGOTIATE cell; dropping.");
     return -1;
   }
 
   if (negotiate->command == CIRCPAD_COMMAND_STOP) {
     /* Free the machine corresponding to this machine type */
-    free_circ_machineinfos_with_machine_num(circ, negotiate->machine_type);
-    log_fn(LOG_WARN, LD_CIRC,
+    if (free_circ_machineinfos_with_machine_num(circ,
+                negotiate->machine_type)) {
+      log_info(LD_CIRC, "Received STOP command for machine %u",
+               negotiate->machine_type);
+      goto done;
+    }
+    log_fn(LOG_PROTOCOL_WARN, LD_CIRC,
           "Received circuit padding stop command for unknown machine.");
     goto err;
   } else if (negotiate->command == CIRCPAD_COMMAND_START) {
@@ -2480,21 +2493,21 @@ circpad_handle_padding_negotiated(circuit_t *circ, cell_t *cell,
   circpad_negotiated_t *negotiated;
 
   if (!CIRCUIT_IS_ORIGIN(circ)) {
-    log_fn(LOG_WARN, LD_PROTOCOL,
+    log_fn(LOG_PROTOCOL_WARN, LD_CIRC,
            "Padding negotiated cell unsupported at non-origin.");
     return -1;
   }
 
   /* Verify this came from the expected hop */
   if (!circpad_padding_is_from_expected_hop(circ, layer_hint)) {
-    log_fn(LOG_WARN, LD_PROTOCOL,
+    log_fn(LOG_WARN, LD_CIRC,
            "Padding negotiated cell from wrong hop!");
     return -1;
   }
 
   if (circpad_negotiated_parse(&negotiated, cell->payload+RELAY_HEADER_SIZE,
                                CELL_PAYLOAD_SIZE-RELAY_HEADER_SIZE) < 0) {
-    log_fn(LOG_WARN, LD_CIRC,
+    log_fn(LOG_PROTOCOL_WARN, LD_CIRC,
           "Received malformed PADDING_NEGOTIATED cell; "
           "dropping.");
     return -1;
@@ -2513,7 +2526,7 @@ circpad_handle_padding_negotiated(circuit_t *circ, cell_t *cell,
     // and be sad
     free_circ_machineinfos_with_machine_num(circ, negotiated->machine_type);
     TO_ORIGIN_CIRCUIT(circ)->padding_negotiation_failed = 1;
-    log_fn(LOG_INFO, LD_CIRC,
+    log_fn(LOG_PROTOCOL_WARN, LD_CIRC,
            "Middle node did not accept our padding request.");
   }