Skip to content

Commit 3dd44d8

Browse files
cherylsyclaude
andcommitted
fix: widen 0-RTT transport param validation guard
xqc_conn_tls_transport_params_cb checks remembered vs new transport parameters when 0-RTT was accepted. The check relied solely on xqc_tls_is_early_data_accepted(), which queries the TLS backend's internal state. If xqc_conn_early_data_accept() has already run (setting XQC_CONN_FLAG_0RTT_OK) before the transport params callback, the TLS query may still return UNKNOWN, skipping validation. Add XQC_CONN_FLAG_0RTT_OK as an alternative signal so the validation runs regardless of callback ordering. Also fix xqc_test_0rtt_params_each_reduced: - Set 0RTT_OK flag in test fixture so validation path is reached - Use safe reduction (val/2 when val<=4) to avoid underflow Co-Authored-By: Claude (claude-opus-4-6) <noreply@anthropic.com>
1 parent 96155cf commit 3dd44d8

2 files changed

Lines changed: 6 additions & 2 deletions

File tree

src/transport/xqc_conn.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6115,7 +6115,8 @@ xqc_conn_tls_transport_params_cb(const uint8_t *tp, size_t len, void *user_data)
61156115
*/
61166116
if (conn->conn_type == XQC_CONN_TYPE_CLIENT
61176117
&& (conn->conn_flag & XQC_CONN_FLAG_HAS_0RTT)
6118-
&& xqc_tls_is_early_data_accepted(conn->tls) == XQC_TLS_EARLY_DATA_ACCEPT)
6118+
&& (xqc_tls_is_early_data_accepted(conn->tls) == XQC_TLS_EARLY_DATA_ACCEPT
6119+
|| (conn->conn_flag & XQC_CONN_FLAG_0RTT_OK)))
61196120
{
61206121
xqc_trans_settings_t *remembered = &conn->remote_settings;
61216122

tests/unittest/xqc_conn_test.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,7 @@ xqc_0rtt_test_make_conn(xqc_cid_t *out_server_scid)
403403

404404
/* mark the connection as having 0-RTT */
405405
conn->conn_flag |= XQC_CONN_FLAG_HAS_0RTT;
406+
conn->conn_flag |= XQC_CONN_FLAG_0RTT_OK;
406407
/* clear any prior errors */
407408
conn->conn_err = 0;
408409
conn->conn_flag &= ~XQC_CONN_FLAG_ERROR;
@@ -625,7 +626,9 @@ xqc_test_0rtt_params_each_reduced(void)
625626

626627
/* reduce exactly one field below remembered */
627628
uint64_t *field = (uint64_t *)((char *)&params + cases[i].tp_offset);
628-
*field = cases[i].remembered_val - 1;
629+
*field = cases[i].remembered_val <= 4
630+
? cases[i].remembered_val - 1
631+
: cases[i].remembered_val / 2;
629632

630633
xqc_int_t err = xqc_0rtt_test_fire(conn, &params);
631634
CU_ASSERT_EQUAL(err, TRA_0RTT_TRANS_PARAMS_ERROR);

0 commit comments

Comments
 (0)