}
}
-#define WINDOW_UPDATE_LENGTH 4
-
__clib_export http2_error_t
http2_frame_read_window_update (u32 *increment, u8 *payload, u32 payload_len)
{
u32 *value;
- if (payload_len != WINDOW_UPDATE_LENGTH)
+ if (payload_len != HTTP2_WINDOW_UPDATE_LENGTH)
return HTTP2_ERROR_FRAME_SIZE_ERROR;
value = (u32 *) payload;
ASSERT (increment > 0 && increment <= 0x7FFFFFFF);
http2_frame_header_t fh = { .type = HTTP2_FRAME_TYPE_WINDOW_UPDATE,
- .length = WINDOW_UPDATE_LENGTH,
+ .length = HTTP2_WINDOW_UPDATE_LENGTH,
.stream_id = stream_id };
p = http2_frame_header_alloc (dst);
http2_frame_header_write (&fh, p);
- vec_add2 (*dst, p, WINDOW_UPDATE_LENGTH);
+ vec_add2 (*dst, p, HTTP2_WINDOW_UPDATE_LENGTH);
value = clib_host_to_net_u32 (increment);
- clib_memcpy_fast (p, &value, WINDOW_UPDATE_LENGTH);
+ clib_memcpy_fast (p, &value, HTTP2_WINDOW_UPDATE_LENGTH);
}
-#define RST_STREAM_LENGTH 4
-
__clib_export http2_error_t
http2_frame_read_rst_stream (u32 *error_code, u8 *payload, u32 payload_len)
{
u32 *value;
- if (payload_len != RST_STREAM_LENGTH)
+ if (payload_len != HTTP2_RST_STREAM_LENGTH)
return HTTP2_ERROR_FRAME_SIZE_ERROR;
value = (u32 *) payload;
ASSERT (stream_id > 0 && stream_id <= 0x7FFFFFFF);
http2_frame_header_t fh = { .type = HTTP2_FRAME_TYPE_RST_STREAM,
- .length = RST_STREAM_LENGTH,
+ .length = HTTP2_RST_STREAM_LENGTH,
.stream_id = stream_id };
p = http2_frame_header_alloc (dst);
http2_frame_header_write (&fh, p);
- vec_add2 (*dst, p, RST_STREAM_LENGTH);
+ vec_add2 (*dst, p, HTTP2_RST_STREAM_LENGTH);
value = clib_host_to_net_u32 ((u32) error_code);
- clib_memcpy_fast (p, &value, RST_STREAM_LENGTH);
+ clib_memcpy_fast (p, &value, HTTP2_RST_STREAM_LENGTH);
}
__clib_export http2_error_t
http2_error_t rv;
http2_conn_ctx_t *h2c;
+ if (fh->length < 1)
+ {
+ HTTP_DBG (1, "zero length payload");
+ return HTTP2_ERROR_FRAME_SIZE_ERROR;
+ }
+
h2c = http2_conn_ctx_get_w_thread (hc);
if (hc->flags & HTTP_CONN_F_IS_SERVER)
u8 *p;
http2_error_t rv = HTTP2_ERROR_NO_ERROR;
+ if (fh->length < 1)
+ {
+ HTTP_DBG (1, "zero length payload");
+ return HTTP2_ERROR_FRAME_SIZE_ERROR;
+ }
+
h2c = http2_conn_ctx_get_w_thread (hc);
if (!(h2c->flags & HTTP2_CONN_F_EXPECT_CONTINUATION))
HTTP2_STREAM_STATE_CLOSED;
}
+ if (fh->length == 0)
+ {
+ HTTP_DBG (1, "zero length payload");
+ return HTTP2_ERROR_NO_ERROR;
+ }
+
rx_buf = http_get_rx_buf (hc);
vec_validate (rx_buf, fh->length - 1);
http_io_ts_read (hc, rx_buf, fh->length, 0);
http2_req_t *req;
http2_conn_ctx_t *h2c;
+ if (fh->length != HTTP2_WINDOW_UPDATE_LENGTH)
+ {
+ HTTP_DBG (1, "invalid payload length");
+ return HTTP2_ERROR_FRAME_SIZE_ERROR;
+ }
+
h2c = http2_conn_ctx_get_w_thread (hc);
rx_buf = http_get_rx_buf (hc);
u32 error_code;
http2_conn_ctx_t *h2c;
+ if (fh->length != HTTP2_RST_STREAM_LENGTH)
+ {
+ HTTP_DBG (1, "invalid payload length");
+ return HTTP2_ERROR_FRAME_SIZE_ERROR;
+ }
+
if (fh->stream_id == 0)
return HTTP2_ERROR_PROTOCOL_ERROR;
http2_conn_ctx_t *h2c;
http2_req_t *req;
+ if (fh->length < HTTP2_GOAWAY_MIN_SIZE)
+ {
+ HTTP_DBG (1, "invalid payload length");
+ return HTTP2_ERROR_FRAME_SIZE_ERROR;
+ }
+
if (fh->stream_id != 0)
return HTTP2_ERROR_PROTOCOL_ERROR;