mirror of
https://gitea.invidious.io/iv-org/litespeed-quic.git
synced 2024-08-15 00:53:43 +00:00
Release 2.13.2
- [BUGFIX] Use of new lsxpack_header API's hsi_prepare_decode().
This commit is contained in:
parent
02a4ee50be
commit
992bbcdba6
11 changed files with 63 additions and 57 deletions
|
@ -520,7 +520,7 @@ decode_and_pass_payload (struct lsquic_frame_reader *fr)
|
|||
struct uncompressed_headers *uh = NULL;
|
||||
void *hset = NULL;
|
||||
struct lsxpack_header *hdr = NULL;
|
||||
size_t extra = 0;
|
||||
size_t req_space = 0;
|
||||
|
||||
hset = fr->fr_hsi_if->hsi_create_header_set(fr->fr_hsi_ctx,
|
||||
READER_PUSH_PROMISE == fr->fr_state.reader_type);
|
||||
|
@ -536,7 +536,7 @@ decode_and_pass_payload (struct lsquic_frame_reader *fr)
|
|||
while (comp < end)
|
||||
{
|
||||
prepare:
|
||||
hdr = fr->fr_hsi_if->hsi_prepare_decode(hset, hdr, extra);
|
||||
hdr = fr->fr_hsi_if->hsi_prepare_decode(hset, hdr, req_space);
|
||||
if (!hdr)
|
||||
{
|
||||
err = FR_ERR_OTHER_ERROR;
|
||||
|
@ -552,7 +552,7 @@ decode_and_pass_payload (struct lsquic_frame_reader *fr)
|
|||
fr->fr_conn_stats->in.headers_uncomp += hdr->name_len +
|
||||
hdr->val_len;
|
||||
#endif
|
||||
extra = 0;
|
||||
req_space = 0;
|
||||
hdr = NULL;
|
||||
continue;
|
||||
}
|
||||
|
@ -563,7 +563,7 @@ decode_and_pass_payload (struct lsquic_frame_reader *fr)
|
|||
}
|
||||
else if (s == LSHPACK_ERR_MORE_BUF)
|
||||
{
|
||||
extra = hdr->val_len;
|
||||
req_space = hdr->val_len;
|
||||
goto prepare;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -3918,7 +3918,7 @@ synthesize_push_request (struct full_conn *conn, void *hset,
|
|||
lsquic_http_header_t pseudo_headers[4];
|
||||
lsquic_http_headers_t all_headers[2];
|
||||
struct lsxpack_header *xhdr;
|
||||
size_t extra;
|
||||
size_t req_space;
|
||||
|
||||
if (!hset)
|
||||
{
|
||||
|
@ -3973,9 +3973,9 @@ synthesize_push_request (struct full_conn *conn, void *hset,
|
|||
header < all_headers[i].headers + all_headers[i].count;
|
||||
++header)
|
||||
{
|
||||
extra = header->name.iov_len + header->value.iov_len + 4;
|
||||
req_space = header->name.iov_len + header->value.iov_len + 4;
|
||||
xhdr = conn->fc_enpub->enp_hsi_if->hsi_prepare_decode(hset,
|
||||
NULL, extra);
|
||||
NULL, req_space);
|
||||
if (!xhdr)
|
||||
{
|
||||
st = -__LINE__;
|
||||
|
|
|
@ -3282,7 +3282,7 @@ ietf_full_conn_ci_push_stream (struct lsquic_conn *lconn, void *hset,
|
|||
int own_hset, stx_tab_id;
|
||||
unsigned char discard[2];
|
||||
struct lsxpack_header *xhdr;
|
||||
size_t extra;
|
||||
size_t req_space;
|
||||
|
||||
if (!ietf_full_conn_ci_is_push_enabled(lconn)
|
||||
|| !lsquic_stream_can_push(dep_stream))
|
||||
|
@ -3394,9 +3394,9 @@ ietf_full_conn_ci_push_stream (struct lsquic_conn *lconn, void *hset,
|
|||
header < all_headers[i].headers + all_headers[i].count;
|
||||
++header)
|
||||
{
|
||||
extra = header->name.iov_len + header->value.iov_len + 4;
|
||||
req_space = header->name.iov_len + header->value.iov_len + 4;
|
||||
xhdr = conn->ifc_enpub->enp_hsi_if->hsi_prepare_decode(hset,
|
||||
NULL, extra);
|
||||
NULL, req_space);
|
||||
if (!xhdr)
|
||||
{
|
||||
header_st = -__LINE__;
|
||||
|
|
|
@ -507,40 +507,31 @@ h1h_finish_hset (struct header_writer_ctx *hwc)
|
|||
|
||||
|
||||
static struct lsxpack_header *
|
||||
h1h_prepare_decode (void *hset, struct lsxpack_header *xhdr, size_t extra_space)
|
||||
h1h_prepare_decode (void *hset, struct lsxpack_header *xhdr, size_t req_space)
|
||||
{
|
||||
struct header_writer_ctx *const hwc = HWC_PTR(hset);
|
||||
size_t min_space;
|
||||
|
||||
if (0 == extra_space)
|
||||
min_space = 0x100;
|
||||
else
|
||||
min_space = extra_space;
|
||||
if (0 == req_space)
|
||||
req_space = 0x100;
|
||||
|
||||
if (xhdr)
|
||||
{
|
||||
assert(xhdr == &hwc->hwc_xhdr);
|
||||
min_space += xhdr->val_len;
|
||||
}
|
||||
|
||||
if (min_space > MAX_HTTP1X_HEADERS_SIZE || min_space > LSXPACK_MAX_STRLEN)
|
||||
if (req_space > MAX_HTTP1X_HEADERS_SIZE || req_space > LSXPACK_MAX_STRLEN)
|
||||
{
|
||||
LSQ_DEBUG("requested space for header is too large: %zd bytes",
|
||||
min_space);
|
||||
req_space);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (min_space > hwc->hwc_header_buf_nalloc)
|
||||
if (req_space > hwc->hwc_header_buf_nalloc)
|
||||
{
|
||||
free(hwc->hwc_header_buf);
|
||||
hwc->hwc_header_buf_nalloc = 0;
|
||||
hwc->hwc_header_buf = malloc(min_space);
|
||||
hwc->hwc_header_buf = malloc(req_space);
|
||||
if (!hwc->hwc_header_buf)
|
||||
{
|
||||
LSQ_DEBUG("cannot allocate %zd bytes", min_space);
|
||||
LSQ_DEBUG("cannot allocate %zd bytes", req_space);
|
||||
return NULL;
|
||||
}
|
||||
hwc->hwc_header_buf_nalloc = min_space;
|
||||
hwc->hwc_header_buf_nalloc = req_space;
|
||||
}
|
||||
|
||||
lsxpack_header_prepare_decode(&hwc->hwc_xhdr, hwc->hwc_header_buf,
|
||||
|
|
|
@ -455,7 +455,7 @@ qdh_supply_hset_to_stream (struct qpack_dec_hdl *qdh,
|
|||
void *hset;
|
||||
struct cont_len cl;
|
||||
struct lsxpack_header *xhdr;
|
||||
size_t extra;
|
||||
size_t req_space;
|
||||
|
||||
push_promise = lsquic_stream_header_is_pp(stream);
|
||||
hset = hset_if->hsi_create_header_set(qdh->qdh_hsi_ctx, push_promise);
|
||||
|
@ -473,11 +473,11 @@ qdh_supply_hset_to_stream (struct qpack_dec_hdl *qdh,
|
|||
header = qlist->qhl_headers[i];
|
||||
LSQ_DEBUG("%.*s: %.*s", header->qh_name_len, header->qh_name,
|
||||
header->qh_value_len, header->qh_value);
|
||||
extra = header->qh_name_len + header->qh_value_len + 4;
|
||||
xhdr = hset_if->hsi_prepare_decode(hset, NULL, extra);
|
||||
req_space = header->qh_name_len + header->qh_value_len + 4;
|
||||
xhdr = hset_if->hsi_prepare_decode(hset, NULL, req_space);
|
||||
if (!xhdr)
|
||||
{
|
||||
LSQ_DEBUG("prepare_decode(%zd) failed", extra);
|
||||
LSQ_DEBUG("prepare_decode(%zd) failed", req_space);
|
||||
goto err;
|
||||
}
|
||||
memcpy(xhdr->buf + xhdr->name_offset, header->qh_name,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue