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

@ -1,3 +1,7 @@
2020-03-13
- 2.13.2
- [BUGFIX] Use of new lsxpack_header API's hsi_prepare_decode().
2020-03-12
- 2.13.1
- [API] Use lsxpack_header structure to process incoming headers.

View file

@ -1421,11 +1421,16 @@ fields yourself. In that case, the header set must be "read" from the stream vi
.. member:: struct lsxpack_header * (*hsi_prepare_decode)(void *hdr_set, struct lsxpack_header *hdr, size_t space)
Return a header set prepared for decoding. If ``hdr`` is NULL, this
means return a new structure with at least `space' bytes available
in the decoder buffer. If `hdr' is not NULL, it means there was not
enough decoder buffer and it must be increased by ``space`` bytes.
means return a new structure with at least ``space`` bytes available
in the decoder buffer. On success, a newly prepared header is
returned.
If NULL is returned the header set is discarded.
If ``hdr`` is not NULL, it means there was not enough decoder buffer
and it must be increased to at least ``space`` bytes. ``buf``, ``val_len``,
and ``name_offset`` member of the ``hdr`` structure may change. On
success, the return value is the same as ``hdr``.
If NULL is returned, the space cannot be allocated.
.. member:: int (*hsi_process_header)(void *hdr_set, struct lsxpack_header *hdr)

View file

@ -26,7 +26,7 @@ author = u'LiteSpeed Technologies'
# The short X.Y version
version = u'2.13'
# The full version, including alpha/beta/rc tags
release = u'2.13.1'
release = u'2.13.2'
# -- General configuration ---------------------------------------------------

View file

@ -25,7 +25,7 @@ extern "C" {
#define LSQUIC_MAJOR_VERSION 2
#define LSQUIC_MINOR_VERSION 13
#define LSQUIC_PATCH_VERSION 1
#define LSQUIC_PATCH_VERSION 2
/**
* Engine flags:
@ -874,10 +874,15 @@ struct lsquic_hset_if
/**
* Return a header set prepared for decoding. If `hdr' is NULL, this
* means return a new structure with at least `space' bytes available
* in the decoder buffer. If `hdr' is not NULL, it means there was not
* enough decoder buffer and it must be increased by `space' bytes.
* in the decoder buffer. On success, a newly prepared header is
* returned.
*
* If NULL is returned the header set is discarded.
* If `hdr' is not NULL, it means there was not enough decoder buffer
* and it must be increased to at least `space' bytes. `buf', `val_len',
* and `name_offset' member of the `hdr' structure may change. On
* success, the return value is the same as `hdr'.
*
* If NULL is returned, the space cannot be allocated.
*/
struct lsxpack_header *
(*hsi_prepare_decode)(void *hdr_set,

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,

View file

@ -1001,24 +1001,18 @@ hset_create (void *hsi_ctx, int is_push_promise)
static struct lsxpack_header *
hset_prepare_decode (void *hset_p, struct lsxpack_header *xhdr,
size_t extra_space)
size_t req_space)
{
struct hset *const hset = hset_p;
struct hset_elem *el;
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)
min_space += xhdr->val_len;
if (min_space > LSXPACK_MAX_STRLEN)
if (req_space > LSXPACK_MAX_STRLEN)
{
LSQ_WARN("requested space for header is too large: %zd bytes",
min_space);
req_space);
return NULL;
}
@ -1036,20 +1030,27 @@ hset_prepare_decode (void *hset_p, struct lsxpack_header *xhdr,
xhdr = &el->xhdr;
}
else
{
el = (struct hset_elem *) ((char *) xhdr
- offsetof(struct hset_elem, xhdr));
if (req_space <= el->nalloc)
{
LSQ_ERROR("requested space is smaller than already allocated");
return NULL;
}
}
if (min_space > el->nalloc)
if (req_space > el->nalloc)
{
free(el->buf);
el->nalloc = 0;
el->buf = malloc(min_space);
el->buf = malloc(req_space);
if (!el->buf)
{
LSQ_DEBUG("cannot allocate %zd bytes", min_space);
LSQ_DEBUG("cannot allocate %zd bytes", req_space);
return NULL;
}
el->nalloc = min_space;
el->nalloc = req_space;
}
lsxpack_header_prepare_decode(&el->xhdr, el->buf, 0, el->nalloc);

View file

@ -1186,7 +1186,7 @@ interop_server_hset_create (void *hsi_ctx, int is_push_promise)
static struct lsxpack_header *
interop_server_hset_prepare_decode (void *hset_p, struct lsxpack_header *xhdr,
size_t extra_space)
size_t req_space)
{
struct req *req = hset_p;