Release 2.13.2

- [BUGFIX] Use of new lsxpack_header API's hsi_prepare_decode().
This commit is contained in:
Dmitri Tikhonov 2020-03-13 11:24:36 -04:00
parent 02a4ee50be
commit 992bbcdba6
11 changed files with 63 additions and 57 deletions

View file

@ -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

View file

@ -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__;

View file

@ -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__;

View file

@ -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,

View file

@ -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,