mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-11 05:33:47 +01:00
Add a tristate to guard against unexpected circ purpose transitions
This commit is contained in:
parent
173ed05d2f
commit
6828a19670
@ -1352,6 +1352,24 @@ pathbias_should_count(origin_circuit_t *circ)
|
|||||||
circ->base_.purpose == CIRCUIT_PURPOSE_S_REND_JOINED ||
|
circ->base_.purpose == CIRCUIT_PURPOSE_S_REND_JOINED ||
|
||||||
(circ->base_.purpose >= CIRCUIT_PURPOSE_C_INTRODUCING &&
|
(circ->base_.purpose >= CIRCUIT_PURPOSE_C_INTRODUCING &&
|
||||||
circ->base_.purpose <= CIRCUIT_PURPOSE_C_INTRODUCE_ACKED)) {
|
circ->base_.purpose <= CIRCUIT_PURPOSE_C_INTRODUCE_ACKED)) {
|
||||||
|
|
||||||
|
/* Check to see if the shouldcount result has changed due to a
|
||||||
|
* unexpected purpose change that would affect our results.
|
||||||
|
*
|
||||||
|
* The reason we check the path state too here is because for the
|
||||||
|
* cannibalized versions of these purposes, we count them as successful
|
||||||
|
* before their purpose change.
|
||||||
|
*/
|
||||||
|
if (circ->pathbias_shouldcount == PATHBIAS_SHOULDCOUNT_COUNTED
|
||||||
|
&& circ->path_state != PATH_STATE_ALREADY_COUNTED) {
|
||||||
|
log_info(LD_BUG,
|
||||||
|
"Circuit %d is now being ignored despite being counted "
|
||||||
|
"in the past. Purpose is %s, path state is %s",
|
||||||
|
circ->global_identifier,
|
||||||
|
circuit_purpose_to_string(circ->base_.purpose),
|
||||||
|
pathbias_state_to_string(circ->path_state));
|
||||||
|
}
|
||||||
|
circ->pathbias_shouldcount = PATHBIAS_SHOULDCOUNT_IGNORED;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1374,9 +1392,33 @@ pathbias_should_count(origin_circuit_t *circ)
|
|||||||
}
|
}
|
||||||
tor_fragile_assert();
|
tor_fragile_assert();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check to see if the shouldcount result has changed due to a
|
||||||
|
* unexpected change that would affect our results */
|
||||||
|
if (circ->pathbias_shouldcount == PATHBIAS_SHOULDCOUNT_COUNTED) {
|
||||||
|
log_info(LD_BUG,
|
||||||
|
"One-hop circuit %d is now being ignored despite being counted "
|
||||||
|
"in the past. Purpose is %s, path state is %s",
|
||||||
|
circ->global_identifier,
|
||||||
|
circuit_purpose_to_string(circ->base_.purpose),
|
||||||
|
pathbias_state_to_string(circ->path_state));
|
||||||
|
}
|
||||||
|
circ->pathbias_shouldcount = PATHBIAS_SHOULDCOUNT_IGNORED;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check to see if the shouldcount result has changed due to a
|
||||||
|
* unexpected purpose change that would affect our results */
|
||||||
|
if (circ->pathbias_shouldcount == PATHBIAS_SHOULDCOUNT_IGNORED) {
|
||||||
|
log_info(LD_BUG,
|
||||||
|
"Circuit %d is now being counted despite being ignored "
|
||||||
|
"in the past. Purpose is %s, path state is %s",
|
||||||
|
circ->global_identifier,
|
||||||
|
circuit_purpose_to_string(circ->base_.purpose),
|
||||||
|
pathbias_state_to_string(circ->path_state));
|
||||||
|
}
|
||||||
|
circ->pathbias_shouldcount = PATHBIAS_SHOULDCOUNT_COUNTED;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
12
src/or/or.h
12
src/or/or.h
@ -2920,6 +2920,18 @@ typedef struct origin_circuit_t {
|
|||||||
*/
|
*/
|
||||||
ENUM_BF(path_state_t) path_state : 3;
|
ENUM_BF(path_state_t) path_state : 3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tristate variable to guard against pathbias miscounting
|
||||||
|
* due to circuit purpose transitions changing the decision
|
||||||
|
* of pathbias_should_count(). This variable is informational
|
||||||
|
* only. The current results of pathbias_should_count() are
|
||||||
|
* the official decision for pathbias accounting.
|
||||||
|
*/
|
||||||
|
uint8_t pathbias_shouldcount;
|
||||||
|
#define PATHBIAS_SHOULDCOUNT_UNDECIDED 0
|
||||||
|
#define PATHBIAS_SHOULDCOUNT_IGNORED 1
|
||||||
|
#define PATHBIAS_SHOULDCOUNT_COUNTED 2
|
||||||
|
|
||||||
/** For path probing. Store the temporary probe stream ID
|
/** For path probing. Store the temporary probe stream ID
|
||||||
* for response comparison */
|
* for response comparison */
|
||||||
streamid_t pathbias_probe_id;
|
streamid_t pathbias_probe_id;
|
||||||
|
Loading…
Reference in New Issue
Block a user