* Pseudo-header fields MUST NOT appear in trailer sections.
*/
TRACE_ERROR("pseudo-header field in trailers", H3_EV_RX_FRAME|H3_EV_RX_HDR, qcs->qcc->conn, qcs);
- goto fail_with_glitch;
+ h3s->err = H3_ERR_MESSAGE_ERROR;
+ qcc_report_glitch(h3c->qcc, 1);
+ len = -1;
+ goto out;
case HTTP_PRS_INV_HNAME:
TRACE_ERROR("invalid characters in field name", H3_EV_RX_FRAME|H3_EV_RX_HDR, qcs->qcc->conn, qcs);
- goto fail_with_glitch;
+ h3s->err = H3_ERR_MESSAGE_ERROR;
+ qcc_report_glitch(h3c->qcc, 1);
+ len = -1;
+ goto out;
case HTTP_PRS_FORB_TRL:
TRACE_ERROR("forbidden HTTP/3 headers", H3_EV_RX_FRAME|H3_EV_RX_HDR, qcs->qcc->conn, qcs);
- goto fail_with_glitch;
+ h3s->err = H3_ERR_MESSAGE_ERROR;
+ qcc_report_glitch(h3c->qcc, 1);
+ len = -1;
+ goto out;
case HTTP_PRS_INV_HVAL:
/* RFC 9114 10.3 Intermediary-Encapsulation Attacks
* value MUST be treated as malformed
*/
TRACE_ERROR("control character present in trailer value", H3_EV_RX_FRAME|H3_EV_RX_HDR, qcs->qcc->conn, qcs);
- goto fail_with_glitch;
+ h3s->err = H3_ERR_MESSAGE_ERROR;
+ qcc_report_glitch(h3c->qcc, 1);
+ len = -1;
+ goto out;
default:
/* Not a protocol error, only the trailers block could not
* caused by too large trailers).
*/
TRACE_ERROR("cannot add trailer", H3_EV_RX_FRAME|H3_EV_RX_HDR, qcs->qcc->conn, qcs);
- goto fail;
+ len = -1;
+ goto out;
}
if (fin)
TRACE_LEAVE(H3_EV_RX_FRAME|H3_EV_RX_HDR, qcs->qcc->conn, qcs);
return len;
-
- fail_with_glitch:
- qcc_report_glitch(h3c->qcc, 1);
- h3s->err = H3_ERR_MESSAGE_ERROR;
- fail:
- TRACE_DEVEL("leaving on error", H3_EV_RX_FRAME|H3_EV_RX_HDR, qcs->qcc->conn, qcs);
- return -1;
}
/* Copy from buffer <buf> a H3 DATA frame of length <len> in QUIC stream <qcs>