diff options
author | Nick Mathewson <nickm@torproject.org> | 2021-06-10 08:53:07 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2021-06-10 08:53:07 -0400 |
commit | 3260d323a663da3a1a2b65085dce1b469be101bb (patch) | |
tree | e5974e96d8ba5db5da7cc2fb7d8b50d12f431326 /src/core | |
parent | 69bd4a8a2db6645b69a902d5ef6eb8c832f122fc (diff) | |
parent | ec696a95e58870862625a44f2c9152be2526414c (diff) | |
download | tor-3260d323a663da3a1a2b65085dce1b469be101bb.tar.gz tor-3260d323a663da3a1a2b65085dce1b469be101bb.zip |
Merge branch 'maint-0.4.5' into maint-0.4.6
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/or/relay.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/core/or/relay.c b/src/core/or/relay.c index 2248b2c180..5ceee468c9 100644 --- a/src/core/or/relay.c +++ b/src/core/or/relay.c @@ -1505,6 +1505,25 @@ connection_edge_process_relay_cell_not_open( // return -1; } +/** + * Return true iff our decryption layer_hint is from the last hop + * in a circuit. + */ +static bool +relay_crypt_from_last_hop(origin_circuit_t *circ, crypt_path_t *layer_hint) +{ + tor_assert(circ); + tor_assert(layer_hint); + tor_assert(circ->cpath); + + if (layer_hint != circ->cpath->prev) { + log_fn(LOG_PROTOCOL_WARN, LD_CIRC, + "Got unexpected relay data from intermediate hop"); + return false; + } + return true; +} + /** Process a SENDME cell that arrived on <b>circ</b>. If it is a stream level * cell, it is destined for the given <b>conn</b>. If it is a circuit level * cell, it is destined for the <b>layer_hint</b>. The <b>domain</b> is the @@ -1725,8 +1744,17 @@ handle_relay_cell_command(cell_t *cell, circuit_t *circ, if (!conn) { if (CIRCUIT_IS_ORIGIN(circ)) { origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); +<<<<<<< HEAD if (connection_half_edge_is_valid_end(ocirc->half_streams, rh->stream_id)) { +||||||| d71bf986b4faf7 + if (connection_half_edge_is_valid_end(ocirc->half_streams, + rh.stream_id)) { +======= + if (relay_crypt_from_last_hop(ocirc, layer_hint) && + connection_half_edge_is_valid_end(ocirc->half_streams, + rh.stream_id)) { +>>>>>>> maint-0.3.5 circuit_read_valid_data(ocirc, rh->length); log_info(domain, @@ -1935,9 +1963,20 @@ handle_relay_cell_command(cell_t *cell, circuit_t *circ, if (CIRCUIT_IS_ORIGIN(circ)) { origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); +<<<<<<< HEAD if (connection_half_edge_is_valid_resolved(ocirc->half_streams, rh->stream_id)) { circuit_read_valid_data(ocirc, rh->length); +||||||| d71bf986b4faf7 + if (connection_half_edge_is_valid_resolved(ocirc->half_streams, + rh.stream_id)) { + circuit_read_valid_data(ocirc, rh.length); +======= + if (relay_crypt_from_last_hop(ocirc, layer_hint) && + connection_half_edge_is_valid_resolved(ocirc->half_streams, + rh.stream_id)) { + circuit_read_valid_data(ocirc, rh.length); +>>>>>>> maint-0.3.5 log_info(domain, "resolved cell on circ %u valid on half-closed " "stream id %d", ocirc->global_identifier, rh->stream_id); |