summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorteor <teor@torproject.org>2019-09-05 11:42:26 +1000
committerteor <teor@torproject.org>2019-09-05 11:42:26 +1000
commit1203e137be4303bce42e46bd41eb78bf79f691d7 (patch)
treede5a3036f97f32402816d825e30d320ac5e0985b
parenta52a5e0099f9201e0dc1a358b1ac7721070caf56 (diff)
parent763fd0ad668cb03c11d9e3e932111152eea22630 (diff)
downloadtor-1203e137be4303bce42e46bd41eb78bf79f691d7.tar.gz
tor-1203e137be4303bce42e46bd41eb78bf79f691d7.zip
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.
-rw-r--r--changes/bug306494
-rw-r--r--src/core/or/circuitpadding.c33
2 files changed, 27 insertions, 10 deletions
diff --git a/changes/bug30649 b/changes/bug30649
new file mode 100644
index 0000000000..4b2c603171
--- /dev/null
+++ b/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.
diff --git a/src/core/or/circuitpadding.c b/src/core/or/circuitpadding.c
index 0e3dc502ce..aa38b0ffc3 100644
--- a/src/core/or/circuitpadding.c
+++ b/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.");
}