mirror of
https://gitea.invidious.io/iv-org/litespeed-quic.git
synced 2024-08-15 00:53:43 +00:00
Release 3.1.2
This commit is contained in:
parent
5f073670ba
commit
6efb8c5235
10 changed files with 46 additions and 63 deletions
10
CHANGELOG
10
CHANGELOG
|
@ -1,3 +1,13 @@
|
||||||
|
2022-08-16
|
||||||
|
- 3.1.2
|
||||||
|
- Update ls-qpack to 2.4.0 to address a use-after-free bug
|
||||||
|
- Address a few corner cases that trigger assert failures.
|
||||||
|
- Properly handle unexpected large packet for gQUIC.
|
||||||
|
- Fix memory leak in shared hash interface
|
||||||
|
- Fix IPv6 MTU detection
|
||||||
|
- Fix wrong size used in packet regeneration.
|
||||||
|
|
||||||
|
|
||||||
2022-05-13
|
2022-05-13
|
||||||
- 3.1.1
|
- 3.1.1
|
||||||
- Fix memory leak in processing stream frames (isse #368)
|
- Fix memory leak in processing stream frames (isse #368)
|
||||||
|
|
|
@ -26,7 +26,7 @@ author = u'LiteSpeed Technologies'
|
||||||
# The short X.Y version
|
# The short X.Y version
|
||||||
version = u'3.1'
|
version = u'3.1'
|
||||||
# The full version, including alpha/beta/rc tags
|
# The full version, including alpha/beta/rc tags
|
||||||
release = u'3.1.1'
|
release = u'3.1.2'
|
||||||
|
|
||||||
|
|
||||||
# -- General configuration ---------------------------------------------------
|
# -- General configuration ---------------------------------------------------
|
||||||
|
|
|
@ -25,7 +25,7 @@ extern "C" {
|
||||||
|
|
||||||
#define LSQUIC_MAJOR_VERSION 3
|
#define LSQUIC_MAJOR_VERSION 3
|
||||||
#define LSQUIC_MINOR_VERSION 1
|
#define LSQUIC_MINOR_VERSION 1
|
||||||
#define LSQUIC_PATCH_VERSION 1
|
#define LSQUIC_PATCH_VERSION 2
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Engine flags:
|
* Engine flags:
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit ecccd9193f1ed94e496aeedd76fd1dc0cc3b4c02
|
Subproject commit b97e714470a01c7c8b1999cb42f267b34265fcae
|
|
@ -3130,6 +3130,7 @@ ietf_full_conn_ci_destroy (struct lsquic_conn *lconn)
|
||||||
lsquic_malo_destroy(conn->ifc_pub.packet_out_malo);
|
lsquic_malo_destroy(conn->ifc_pub.packet_out_malo);
|
||||||
if (conn->ifc_flags & IFC_CREATED_OK)
|
if (conn->ifc_flags & IFC_CREATED_OK)
|
||||||
conn->ifc_enpub->enp_stream_if->on_conn_closed(&conn->ifc_conn);
|
conn->ifc_enpub->enp_stream_if->on_conn_closed(&conn->ifc_conn);
|
||||||
|
assert(conn->ifc_conn.cn_conn_ctx == NULL);
|
||||||
if (conn->ifc_conn.cn_enc_session)
|
if (conn->ifc_conn.cn_enc_session)
|
||||||
conn->ifc_conn.cn_esf.i->esfi_destroy(conn->ifc_conn.cn_enc_session);
|
conn->ifc_conn.cn_esf.i->esfi_destroy(conn->ifc_conn.cn_enc_session);
|
||||||
while (!STAILQ_EMPTY(&conn->ifc_stream_ids_to_ss))
|
while (!STAILQ_EMPTY(&conn->ifc_stream_ids_to_ss))
|
||||||
|
|
|
@ -3088,6 +3088,12 @@ decrypt_packet (struct lsquic_enc_session *enc_session, uint8_t path_id,
|
||||||
sizeof(path_id_packet_number));
|
sizeof(path_id_packet_number));
|
||||||
|
|
||||||
*out_len = data_len;
|
*out_len = data_len;
|
||||||
|
if (data_len + *header_len > max_out_len)
|
||||||
|
{
|
||||||
|
LSQ_DEBUG("decrypt_packet size is larger than 1370, header: %zd, "
|
||||||
|
"data: %zu, giveup.", *header_len, data_len);
|
||||||
|
return (enum enc_level) -1;
|
||||||
|
}
|
||||||
ret = lsquic_aes_aead_dec(key,
|
ret = lsquic_aes_aead_dec(key,
|
||||||
buf, *header_len,
|
buf, *header_len,
|
||||||
nonce, 12,
|
nonce, 12,
|
||||||
|
|
|
@ -43,8 +43,6 @@ struct hash_elem
|
||||||
static void
|
static void
|
||||||
free_key_data (struct hash_elem *he)
|
free_key_data (struct hash_elem *he)
|
||||||
{
|
{
|
||||||
if (he->data_sz)
|
|
||||||
free(he->data);
|
|
||||||
free(he->key.buf);
|
free(he->key.buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,9 +85,17 @@ stock_shi_insert (void *hash_ctx, void *key, unsigned key_sz,
|
||||||
he = lsquic_malo_get(hash->malo);
|
he = lsquic_malo_get(hash->malo);
|
||||||
if (!he)
|
if (!he)
|
||||||
return -1;
|
return -1;
|
||||||
he->key.buf = key;
|
he->key.buf = malloc(key_sz + data_sz + 1);
|
||||||
|
if (!he->key.buf)
|
||||||
|
{
|
||||||
|
lsquic_malo_put(he);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
memmove(he->key.buf, key, key_sz);
|
||||||
|
((char *)(he->key.buf))[key_sz] = 0;
|
||||||
he->key.sz = key_sz;
|
he->key.sz = key_sz;
|
||||||
he->data = data;
|
he->data = he->key.buf + he->key.sz + 1;
|
||||||
|
memmove(he->data, data, data_sz);
|
||||||
he->data_sz = data_sz;
|
he->data_sz = data_sz;
|
||||||
he->expiry = expiry;
|
he->expiry = expiry;
|
||||||
memset(&he->lhash_elem, 0, sizeof(he->lhash_elem));
|
memset(&he->lhash_elem, 0, sizeof(he->lhash_elem));
|
||||||
|
|
|
@ -4359,14 +4359,16 @@ void
|
||||||
lsquic_stream_acked (struct lsquic_stream *stream,
|
lsquic_stream_acked (struct lsquic_stream *stream,
|
||||||
enum quic_frame_type frame_type)
|
enum quic_frame_type frame_type)
|
||||||
{
|
{
|
||||||
assert(stream->n_unacked);
|
if (stream->n_unacked > 0)
|
||||||
--stream->n_unacked;
|
|
||||||
LSQ_DEBUG("ACKed; n_unacked: %u", stream->n_unacked);
|
|
||||||
if (frame_type == QUIC_FRAME_RST_STREAM)
|
|
||||||
{
|
{
|
||||||
SM_HISTORY_APPEND(stream, SHE_RST_ACKED);
|
--stream->n_unacked;
|
||||||
LSQ_DEBUG("RESET that we sent has been acked by peer");
|
LSQ_DEBUG("ACKed; n_unacked: %u", stream->n_unacked);
|
||||||
stream->stream_flags |= STREAM_RST_ACKED;
|
if (frame_type == QUIC_FRAME_RST_STREAM)
|
||||||
|
{
|
||||||
|
SM_HISTORY_APPEND(stream, SHE_RST_ACKED);
|
||||||
|
LSQ_DEBUG("RESET that we sent has been acked by peer");
|
||||||
|
stream->stream_flags |= STREAM_RST_ACKED;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (0 == stream->n_unacked)
|
if (0 == stream->n_unacked)
|
||||||
{
|
{
|
||||||
|
|
|
@ -89,7 +89,8 @@ get_or_generate_state (struct lsquic_engine_public *enpub, time_t now,
|
||||||
{
|
{
|
||||||
const struct lsquic_shared_hash_if *const shi = enpub->enp_shi;
|
const struct lsquic_shared_hash_if *const shi = enpub->enp_shi;
|
||||||
void *const ctx = enpub->enp_shi_ctx;
|
void *const ctx = enpub->enp_shi_ctx;
|
||||||
void *data, *copy, *key_copy;
|
void *data, *copy;
|
||||||
|
char key_copy[TOKGEN_SHM_KEY_SIZE];
|
||||||
int s;
|
int s;
|
||||||
unsigned sz;
|
unsigned sz;
|
||||||
size_t bufsz;
|
size_t bufsz;
|
||||||
|
@ -166,28 +167,13 @@ get_or_generate_state (struct lsquic_engine_public *enpub, time_t now,
|
||||||
memcpy(shm_state->tgss_magic_bottom, TOKGEN_SHM_MAGIC_BOTTOM,
|
memcpy(shm_state->tgss_magic_bottom, TOKGEN_SHM_MAGIC_BOTTOM,
|
||||||
sizeof(TOKGEN_SHM_MAGIC_BOTTOM) - 1);
|
sizeof(TOKGEN_SHM_MAGIC_BOTTOM) - 1);
|
||||||
|
|
||||||
data = malloc(sizeof(*shm_state));
|
data = shm_state;
|
||||||
if (!data)
|
|
||||||
{
|
|
||||||
LSQ_ERROR("%s: malloc", __func__);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
memcpy(data, shm_state, sizeof(*shm_state));
|
|
||||||
key_copy = malloc(TOKGEN_SHM_KEY_SIZE);
|
|
||||||
if (!key_copy)
|
|
||||||
{
|
|
||||||
LSQ_ERROR("%s: malloc", __func__);
|
|
||||||
free(data);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
memcpy(key_copy, TOKGEN_SHM_KEY, TOKGEN_SHM_KEY_SIZE);
|
memcpy(key_copy, TOKGEN_SHM_KEY, TOKGEN_SHM_KEY_SIZE);
|
||||||
s = shi->shi_insert(ctx, key_copy, TOKGEN_SHM_KEY_SIZE, data,
|
s = shi->shi_insert(ctx, key_copy, TOKGEN_SHM_KEY_SIZE, data,
|
||||||
sizeof(*shm_state), 0);
|
sizeof(*shm_state), 0);
|
||||||
if (s != 0)
|
if (s != 0)
|
||||||
{
|
{
|
||||||
LSQ_ERROR("cannot insert into SHM");
|
LSQ_ERROR("cannot insert into SHM");
|
||||||
free(data);
|
|
||||||
free(key_copy);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
sz = sizeof(*shm_state);
|
sz = sizeof(*shm_state);
|
||||||
|
|
|
@ -24,30 +24,6 @@ static const struct pair {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct data {
|
|
||||||
size_t size; /* Overall size including the payload */
|
|
||||||
char *key;
|
|
||||||
char *value;
|
|
||||||
char data[0]; /* key followed by value */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static struct data *
|
|
||||||
new_data (const char *key, const char *value)
|
|
||||||
{
|
|
||||||
size_t klen = strlen(key);
|
|
||||||
size_t vlen = strlen(value);
|
|
||||||
size_t size = klen + vlen + 2 + sizeof(struct data);
|
|
||||||
struct data *data = malloc(size);
|
|
||||||
data->size = size;
|
|
||||||
data->key = data->data;
|
|
||||||
data->value = data->data + klen + 1;
|
|
||||||
memcpy(data->data, key, klen);
|
|
||||||
data->key[klen] = '\0';
|
|
||||||
memcpy(data->value, value, vlen);
|
|
||||||
data->value[vlen] = '\0';
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#define N_PAIRS (sizeof(pairs) / sizeof(pairs[0]))
|
#define N_PAIRS (sizeof(pairs) / sizeof(pairs[0]))
|
||||||
|
@ -73,7 +49,6 @@ test_shi (const struct order *order)
|
||||||
const time_t now = time(NULL);
|
const time_t now = time(NULL);
|
||||||
time_t expiry;
|
time_t expiry;
|
||||||
void *datap;
|
void *datap;
|
||||||
struct data *data;
|
|
||||||
|
|
||||||
hash = lsquic_stock_shared_hash_new();
|
hash = lsquic_stock_shared_hash_new();
|
||||||
|
|
||||||
|
@ -84,9 +59,8 @@ test_shi (const struct order *order)
|
||||||
expiry = now + 1;
|
expiry = now + 1;
|
||||||
else
|
else
|
||||||
expiry = 0;
|
expiry = 0;
|
||||||
data = new_data(pair->key, pair->value);
|
s = stock_shi.shi_insert(hash, (char *)pair->key, strlen(pair->key),
|
||||||
s = stock_shi.shi_insert(hash, strdup(data->key), strlen(data->key),
|
(char *)pair->value, strlen(pair->value), expiry);
|
||||||
data, data->size, expiry);
|
|
||||||
assert(0 == s);
|
assert(0 == s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,11 +81,9 @@ test_shi (const struct order *order)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
data = datap;
|
|
||||||
assert(1 == s);
|
assert(1 == s);
|
||||||
assert(data_sz == data->size);
|
assert(data_sz == strlen(pair->value));
|
||||||
assert(0 == strcmp(pair->key, data->key));
|
assert(0 == strncmp(pair->value, datap, data_sz));
|
||||||
assert(0 == strcmp(pair->value, data->value));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue