Fix transport parameter parse error
diff --git a/lib/ngtcp2_crypto.c b/lib/ngtcp2_crypto.c
index 0c27158..168b591 100644
--- a/lib/ngtcp2_crypto.c
+++ b/lib/ngtcp2_crypto.c
@@ -227,7 +227,7 @@
}
p += sizeof(uint16_t);
- for (; (size_t)(end - p) > sizeof(uint16_t) * 2;) {
+ for (; (size_t)(end - p) >= sizeof(uint16_t) * 2;) {
param_type = ngtcp2_get_uint16(p);
p += sizeof(uint16_t);
switch (param_type) {
diff --git a/tests/ngtcp2_crypto_test.c b/tests/ngtcp2_crypto_test.c
index db8c433..2a0874f 100644
--- a/tests/ngtcp2_crypto_test.c
+++ b/tests/ngtcp2_crypto_test.c
@@ -146,6 +146,39 @@
memset(&nparams, 0, sizeof(nparams));
+ /* The last param is omit_connection_id */
+ params.initial_max_stream_data = 1000000007;
+ params.initial_max_data = 1000000009;
+ params.initial_max_stream_id = 911;
+ params.idle_timeout = 0xd1d2;
+ params.omit_connection_id = 1;
+ params.max_packet_size = NGTCP2_MAX_PKT_SIZE;
+ memset(params.stateless_reset_token, 0xf1,
+ sizeof(params.stateless_reset_token));
+
+ nwrite = ngtcp2_encode_transport_params(
+ buf, sizeof(buf), NGTCP2_TRANSPORT_PARAMS_TYPE_NEW_SESSION_TICKET,
+ ¶ms);
+
+ CU_ASSERT(2 + 8 * 3 + 6 + 4 + 20 == nwrite);
+
+ rv = ngtcp2_decode_transport_params(
+ &nparams, NGTCP2_TRANSPORT_PARAMS_TYPE_NEW_SESSION_TICKET, buf,
+ (size_t)nwrite);
+
+ CU_ASSERT(0 == rv);
+ CU_ASSERT(params.initial_max_stream_data == nparams.initial_max_stream_data);
+ CU_ASSERT(params.initial_max_data == nparams.initial_max_data);
+ CU_ASSERT(params.initial_max_stream_id == nparams.initial_max_stream_id);
+ CU_ASSERT(params.idle_timeout == nparams.idle_timeout);
+ CU_ASSERT(params.omit_connection_id == nparams.omit_connection_id);
+ CU_ASSERT(params.max_packet_size == NGTCP2_MAX_PKT_SIZE);
+ CU_ASSERT(0 == memcmp(params.stateless_reset_token,
+ nparams.stateless_reset_token,
+ sizeof(params.stateless_reset_token)));
+
+ memset(&nparams, 0, sizeof(nparams));
+
/* Data is too short to decode */
params.v.ch.negotiated_version = 0xf1f2f3f4u;
params.v.ch.initial_version = 0xe1e2e3e4u;