[6.0] 413cbd442 Hardening of the h2_frame_f callbacks
Dridi Boukelmoune
dridi.boukelmoune at gmail.com
Wed Oct 31 13:08:27 UTC 2018
commit 413cbd442bab8802133cb4cd62d891c938186d97
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date: Fri Oct 5 11:16:59 2018 +0200
Hardening of the h2_frame_f callbacks
And by the way, they are known as h2_rxframe_f these days!
Refs #2781
diff --git a/bin/varnishd/http2/cache_http2_proto.c b/bin/varnishd/http2/cache_http2_proto.c
index 250af1806..6caa358bf 100644
--- a/bin/varnishd/http2/cache_http2_proto.c
+++ b/bin/varnishd/http2/cache_http2_proto.c
@@ -275,11 +275,14 @@ h2_vsl_frame(const struct h2_sess *h2, const void *ptr, size_t len)
/**********************************************************************
*/
-static h2_error v_matchproto_(h2_frame_f)
+static h2_error v_matchproto_(h2_rxframe_f)
h2_rx_ping(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
{
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
ASSERT_RXTHR(h2);
+ CHECK_OBJ_NOTNULL(r2, H2_REQ_MAGIC);
+ assert(r2 == h2->req0);
if (h2->rxf_len != 8) // rfc7540,l,2364,2366
return (H2CE_FRAME_SIZE_ERROR);
@@ -296,26 +299,27 @@ h2_rx_ping(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
/**********************************************************************
*/
-static h2_error v_matchproto_(h2_frame_f)
+static h2_error v_matchproto_(h2_rxframe_f)
h2_rx_push_promise(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
{
- (void)wrk;
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
ASSERT_RXTHR(h2);
+ CHECK_OBJ_NOTNULL(r2, H2_REQ_MAGIC); /* XXX: wasteful allocation? */
// rfc7540,l,2262,2267
- (void)r2;
return (H2CE_PROTOCOL_ERROR);
}
/**********************************************************************
*/
-static h2_error v_matchproto_(h2_frame_f)
+static h2_error v_matchproto_(h2_rxframe_f)
h2_rx_rst_stream(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
{
- (void)wrk;
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
ASSERT_RXTHR(h2);
+ CHECK_OBJ_ORNULL(r2, H2_REQ_MAGIC);
if (h2->rxf_len != 4) // rfc7540,l,2003,2004
return (H2CE_FRAME_SIZE_ERROR);
@@ -328,13 +332,15 @@ h2_rx_rst_stream(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
/**********************************************************************
*/
-static h2_error v_matchproto_(h2_frame_f)
+static h2_error v_matchproto_(h2_rxframe_f)
h2_rx_goaway(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
{
- (void)wrk;
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
ASSERT_RXTHR(h2);
- (void)r2;
+ CHECK_OBJ_NOTNULL(r2, H2_REQ_MAGIC);
+ assert(r2 == h2->req0);
+
h2->goaway_last_stream = vbe32dec(h2->rxf_data);
h2->error = h2_connectionerror(vbe32dec(h2->rxf_data + 4));
Lck_Lock(&h2->sess->mtx);
@@ -346,13 +352,15 @@ h2_rx_goaway(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
/**********************************************************************
*/
-static h2_error v_matchproto_(h2_frame_f)
+static h2_error v_matchproto_(h2_rxframe_f)
h2_rx_window_update(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
{
uint32_t wu;
- (void)wrk;
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
ASSERT_RXTHR(h2);
+ CHECK_OBJ_ORNULL(r2, H2_REQ_MAGIC);
+
if (h2->rxf_len != 4)
return (H2CE_FRAME_SIZE_ERROR);
wu = vbe32dec(h2->rxf_data) & ~(1LU<<31);
@@ -376,13 +384,13 @@ h2_rx_window_update(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
* Incoming PRIORITY, possibly an ACK of one we sent.
*/
-static h2_error v_matchproto_(h2_frame_f)
+static h2_error v_matchproto_(h2_rxframe_f)
h2_rx_priority(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
{
- (void)wrk;
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
ASSERT_RXTHR(h2);
- (void)r2;
+ CHECK_OBJ_ORNULL(r2, H2_REQ_MAGIC);
return (0);
}
@@ -478,17 +486,19 @@ h2_set_setting(struct h2_sess *h2, const uint8_t *d)
return (0);
}
-static h2_error v_matchproto_(h2_frame_f)
+static h2_error v_matchproto_(h2_rxframe_f)
h2_rx_settings(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
{
const uint8_t *p;
unsigned l;
h2_error retval = 0;
- AN(wrk);
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
ASSERT_RXTHR(h2);
- AN(r2);
+ CHECK_OBJ_NOTNULL(r2, H2_REQ_MAGIC);
+ assert(r2 == h2->req0);
AZ(h2->rxf_stream);
+
if (h2->rxf_flags == H2FF_SETTINGS_ACK) {
if (h2->rxf_len > 0) // rfc7540,l,2047,2049
return (H2CE_FRAME_SIZE_ERROR);
@@ -607,7 +617,7 @@ h2_end_headers(struct worker *wrk, struct h2_sess *h2,
return (0);
}
-static h2_error v_matchproto_(h2_frame_f)
+static h2_error v_matchproto_(h2_rxframe_f)
h2_rx_headers(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
{
struct req *req;
@@ -615,6 +625,7 @@ h2_rx_headers(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
const uint8_t *p;
size_t l;
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
ASSERT_RXTHR(h2);
if (r2 == NULL) {
@@ -629,7 +640,7 @@ h2_rx_headers(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
h2->highest_stream = h2->rxf_stream;
r2 = h2_new_req(wrk, h2, h2->rxf_stream, NULL);
}
- AN(r2);
+ CHECK_OBJ_NOTNULL(r2, H2_REQ_MAGIC);
if (r2->state != H2_S_IDLE)
return (H2CE_PROTOCOL_ERROR); // XXX spec ?
@@ -695,13 +706,16 @@ h2_rx_headers(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
/**********************************************************************/
-static h2_error v_matchproto_(h2_frame_f)
+static h2_error v_matchproto_(h2_rxframe_f)
h2_rx_continuation(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
{
struct req *req;
h2_error h2e;
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
ASSERT_RXTHR(h2);
+ CHECK_OBJ_ORNULL(r2, H2_REQ_MAGIC);
+
if (r2 == NULL || r2->state != H2_S_OPEN || r2->req != h2->new_req)
return (H2CE_PROTOCOL_ERROR); // XXX spec ?
req = r2->req;
@@ -723,15 +737,17 @@ h2_rx_continuation(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
/**********************************************************************/
-static h2_error v_matchproto_(h2_frame_f)
+static h2_error v_matchproto_(h2_rxframe_f)
h2_rx_data(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
{
int w1 = 0, w2 = 0;
char buf[4];
unsigned wi;
- (void)wrk;
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
ASSERT_RXTHR(h2);
+ CHECK_OBJ_ORNULL(r2, H2_REQ_MAGIC);
+
if (r2 == NULL || !r2->scheduled)
return (0);
if (r2->state >= H2_S_CLOS_REM) {
More information about the varnish-commit
mailing list