From: Nick Mathewson Date: Mon, 2 Jun 2025 16:05:25 +0000 (-0400) Subject: Move responsibility for extension parsing to onion_crypto.c X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4c42ead466126a48f6420df7364e202c79d9e418;p=thirdparty%2Ftor.git Move responsibility for extension parsing to onion_crypto.c --- diff --git a/src/core/crypto/onion_crypto.c b/src/core/crypto/onion_crypto.c index b5cf50a0a9..6bd4531513 100644 --- 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 index faba193abb..734d5142ef 100644 --- 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 index e185a5d29e..c4bc02e908 100644 --- 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 *);