]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Move responsibility for extension parsing to onion_crypto.c
authorNick Mathewson <nickm@torproject.org>
Mon, 2 Jun 2025 16:05:25 +0000 (12:05 -0400)
committerNick Mathewson <nickm@torproject.org>
Tue, 10 Jun 2025 23:06:47 +0000 (19:06 -0400)
src/core/crypto/onion_crypto.c
src/core/or/congestion_control_common.c
src/core/or/congestion_control_common.h

index b5cf50a0a94f023923a93706a1859ae35ce820fa..6bd453151344b8c7ff67a7f37b169c934e8edd4d 100644 (file)
@@ -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
index faba193abb9e19c17bca69d2c61e840d46f1dc8f..734d5142efa1d82da68ff68739c712f17a5ee518 100644 (file)
@@ -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;
index e185a5d29e8d63e51b1e15c4a22afbc58e627755..c4bc02e9089ae302f7c8a67db4d920d3a0168117 100644 (file)
@@ -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 *);