commit 4c42ead466126a48f6420df7364e202c79d9e418
parent 87d7fe28d1e2096f6f1705f0e2a9deacafb722b8
Author: Nick Mathewson <nickm@torproject.org>
Date: Mon, 2 Jun 2025 12:05:25 -0400
Move responsibility for extension parsing to onion_crypto.c
Diffstat:
3 files changed, 31 insertions(+), 33 deletions(-)
diff --git a/src/core/crypto/onion_crypto.c b/src/core/crypto/onion_crypto.c
@@ -236,11 +236,17 @@ negotiate_v3_ntor_server_circ_params(const uint8_t *param_request_msg,
uint8_t **resp_msg_out,
size_t *resp_msg_len_out)
{
- int ret;
+ int ret = -1;
+ trn_extension_t *ext = NULL;
+
+ ssize_t len =
+ trn_extension_parse(&ext, param_request_msg, param_request_len);
+ if (len < 0) {
+ goto err;
+ }
/* Parse request. */
- ret = congestion_control_parse_ext_request(param_request_msg,
- param_request_len);
+ ret = congestion_control_parse_ext_request(ext);
if (ret < 0) {
goto err;
}
@@ -258,6 +264,7 @@ negotiate_v3_ntor_server_circ_params(const uint8_t *param_request_msg,
ret = 0;
err:
+ trn_extension_free(ext);
return ret;
}
@@ -427,11 +434,19 @@ negotiate_v3_ntor_client_circ_params(const uint8_t *param_response_msg,
size_t param_response_len,
circuit_params_t *params_out)
{
- int ret = congestion_control_parse_ext_response(param_response_msg,
- param_response_len,
- params_out);
+ int ret = -1;
+ trn_extension_t *ext = NULL;
+
+ ssize_t len =
+ trn_extension_parse(&ext, param_response_msg, param_response_len);
+ if (len < 0) {
+ goto err;
+ }
+
+ ret = congestion_control_parse_ext_response(ext,
+ params_out);
if (ret < 0) {
- return -1;
+ goto err;
}
/* If congestion control came back enabled, but we didn't ask for it
@@ -446,11 +461,13 @@ negotiate_v3_ntor_client_circ_params(const uint8_t *param_response_msg,
* new one.
*/
if (ret && !congestion_control_enabled()) {
- return -1;
+ goto err;
}
params_out->cc_enabled = ret;
- return 0;
+ err:
+ trn_extension_free(ext);
+ return ret;
}
/** Perform the final (client-side) step of a circuit-creation handshake of
diff --git a/src/core/or/congestion_control_common.c b/src/core/or/congestion_control_common.c
@@ -1069,16 +1069,9 @@ congestion_control_build_ext_request(uint8_t **msg_out, size_t *msg_len_out)
* WARNING: Called from CPU worker! Must not access any global state.
*/
int
-congestion_control_parse_ext_request(const uint8_t *msg, const size_t msg_len)
+congestion_control_parse_ext_request(const trn_extension_t *ext)
{
ssize_t ret = 0;
- trn_extension_t *ext = NULL;
-
- /* Parse extension from payload. */
- ret = trn_extension_parse(&ext, msg, msg_len);
- if (ret < 0) {
- goto end;
- }
if (trn_extension_find(ext, TRUNNEL_EXT_TYPE_CC_FIELD_REQUEST) == NULL) {
/* No extension implies no support for congestion control. In this case, we
@@ -1089,8 +1082,6 @@ congestion_control_parse_ext_request(const uint8_t *msg, const size_t msg_len)
ret = 1;
}
- end:
- trn_extension_free(ext);
return (int)ret;
}
@@ -1212,12 +1203,10 @@ congestion_control_validate_sendme_increment(uint8_t sendme_inc)
/** Return 1 if CC is enabled which also will set the SENDME increment into our
* params_out. Return 0 if CC is disabled. Else, return -1 on error. */
int
-congestion_control_parse_ext_response(const uint8_t *msg,
- const size_t msg_len,
+congestion_control_parse_ext_response(const trn_extension_t *ext,
circuit_params_t *params_out)
{
ssize_t ret = 0;
- trn_extension_t *ext = NULL;
const trn_extension_field_t *field = NULL;
trn_extension_field_cc_t *cc_field = NULL;
@@ -1228,12 +1217,6 @@ congestion_control_parse_ext_response(const uint8_t *msg,
* violate this range should just not be used. */
#define MAX_SENDME_INC_NEGOTIATE_FACTOR 2
- /* Parse extension from payload. */
- ret = trn_extension_parse(&ext, msg, msg_len);
- if (ret < 0) {
- goto end;
- }
-
field = trn_extension_find(ext, TRUNNEL_EXT_TYPE_CC_FIELD_RESPONSE);
if (field == 0) {
@@ -1260,7 +1243,6 @@ congestion_control_parse_ext_response(const uint8_t *msg,
}
end:
- trn_extension_free(ext);
trn_extension_field_cc_free(cc_field);
return (int)ret;
diff --git a/src/core/or/congestion_control_common.h b/src/core/or/congestion_control_common.h
@@ -68,14 +68,13 @@ bool congestion_control_enabled(void);
int congestion_control_build_ext_request(uint8_t **msg_out,
size_t *msg_len_out);
-int congestion_control_parse_ext_request(const uint8_t *msg,
- const size_t msg_len);
+struct trn_extension_st;
+int congestion_control_parse_ext_request(const struct trn_extension_st *ext);
int congestion_control_build_ext_response(const circuit_params_t *our_params,
const circuit_params_t *circ_params,
uint8_t **msg_out,
size_t *msg_len_out);
-int congestion_control_parse_ext_response(const uint8_t *msg,
- const size_t msg_len,
+int congestion_control_parse_ext_response(const struct trn_extension_st *ext,
circuit_params_t *params_out);
bool congestion_control_validate_sendme_increment(uint8_t sendme_inc);
char *congestion_control_get_control_port_fields(const origin_circuit_t *);