int32_t dfl; /* demux frame length (if dsi >= 0) */
int8_t dft; /* demux frame type (if dsi >= 0) */
int8_t dff; /* demux frame flags (if dsi >= 0) */
- /* 16 bit hole here */
+ uint8_t dpl; /* demux pad length (part of dfl), init to 0 */
+ /* 8 bit hole here */
int32_t last_sid; /* last processed stream ID for GOAWAY, <0 before preface */
/* states for the mux direction */
h2c->dsi = hdr.sid;
h2c->dft = hdr.ft;
h2c->dff = hdr.ff;
+ h2c->dpl = 0;
h2c->st0 = H2_CS_FRAME_P;
}
}
h2c->dsi = hdr.sid;
h2c->dft = hdr.ft;
h2c->dff = hdr.ff;
+ h2c->dpl = 0;
h2c->st0 = H2_CS_FRAME_P;
h2_skip_frame_hdr(h2c->dbuf);
}
* after data. padlen+data+padding are included in flen.
*/
if (h2c->dff & H2_F_HEADERS_PADDED) {
- if (*hdrs >= flen) {
+ h2c->dpl = *hdrs;
+ if (h2c->dpl >= flen) {
/* RFC7540#6.2 : pad length = length of frame payload or greater */
h2c_error(h2c, H2_ERR_PROTOCOL_ERROR);
return 0;
}
- flen -= *hdrs + 1;
+ flen -= h2c->dpl + 1;
hdrs += 1; // skip Pad Length
}
struct h2c *h2c = h2s->h2c;
int block1, block2;
unsigned int flen = h2c->dfl;
- unsigned int padlen = 0;
int offset = 0;
h2s->cs->flags &= ~CS_FL_RCV_MORE;
* after data. padlen+data+padding are included in flen.
*/
if (h2c->dff & H2_F_DATA_PADDED) {
- padlen = *(uint8_t *)bi_ptr(h2c->dbuf);
- if (padlen >= flen) {
+ h2c->dpl = *(uint8_t *)bi_ptr(h2c->dbuf);
+ if (h2c->dpl >= h2c->dfl) {
/* RFC7540#6.1 : pad length = length of frame payload or greater */
h2c_error(h2c, H2_ERR_PROTOCOL_ERROR);
return 0;
}
- flen -= padlen + 1;
+ flen -= h2c->dpl + 1;
offset = 1; // skip Pad Length
}