Use HTTP/2 MAX_HEADER_LIST_SIZE setting instead of adding a new member

in the grpc_chttp2_transport_parsing struct.
pull/6320/head
Mark D. Roth 9 years ago
parent c2de452309
commit 00598719bc
  1. 11
      src/core/ext/transport/chttp2/transport/chttp2_transport.c
  2. 3
      src/core/ext/transport/chttp2/transport/frame_settings.c
  3. 3
      src/core/ext/transport/chttp2/transport/internal.h
  4. 14
      src/core/ext/transport/chttp2/transport/parsing.c

@ -56,8 +56,6 @@
#define DEFAULT_CONNECTION_WINDOW_TARGET (1024 * 1024)
#define MAX_WINDOW 0x7fffffffu
#define DEFAULT_MAX_METADATA_SIZE 16 * 1024
#define MAX_CLIENT_STREAM_ID 0x7fffffffu
int grpc_http_trace = 0;
@ -67,8 +65,8 @@ int grpc_flowctl_trace = 0;
((grpc_chttp2_transport *)((char *)(tw)-offsetof(grpc_chttp2_transport, \
writing)))
#define TRANSPORT_FROM_PARSING(tw) \
((grpc_chttp2_transport *)((char *)(tw)-offsetof(grpc_chttp2_transport, \
#define TRANSPORT_FROM_PARSING(tp) \
((grpc_chttp2_transport *)((char *)(tp)-offsetof(grpc_chttp2_transport, \
parsing)))
#define TRANSPORT_FROM_GLOBAL(tg) \
@ -252,7 +250,6 @@ static void init_transport(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
t->global.ping_counter = 1;
t->global.pings.next = t->global.pings.prev = &t->global.pings;
t->parsing.is_client = is_client;
t->parsing.max_metadata_size = DEFAULT_MAX_METADATA_SIZE;
t->parsing.deframe_state =
is_client ? GRPC_DTS_FH_0 : GRPC_DTS_CLIENT_PREFIX_0;
t->writing.is_client = is_client;
@ -384,8 +381,8 @@ static void init_transport(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
gpr_log(GPR_ERROR, "%s: must be non-negative",
GRPC_ARG_MAX_METADATA_SIZE);
} else {
t->parsing.max_metadata_size =
(uint32_t)channel_args->args[i].value.integer;
push_setting(t, GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE,
(uint32_t)channel_args->args[i].value.integer);
}
}
}

@ -44,6 +44,7 @@
#include "src/core/ext/transport/chttp2/transport/http2_errors.h"
#include "src/core/lib/debug/trace.h"
#define DEFAULT_MAX_HEADER_LIST_SIZE (16 * 1024)
#define MAX_MAX_HEADER_LIST_SIZE (1024 * 1024 * 1024)
/* HTTP/2 mandated initial connection settings */
@ -62,7 +63,7 @@ const grpc_chttp2_setting_parameters
GRPC_CHTTP2_FLOW_CONTROL_ERROR},
{"MAX_FRAME_SIZE", 16384, 16384, 16777215,
GRPC_CHTTP2_DISCONNECT_ON_INVALID_VALUE, GRPC_CHTTP2_PROTOCOL_ERROR},
{"MAX_HEADER_LIST_SIZE", MAX_MAX_HEADER_LIST_SIZE, 0,
{"MAX_HEADER_LIST_SIZE", DEFAULT_MAX_HEADER_LIST_SIZE, 0,
MAX_MAX_HEADER_LIST_SIZE, GRPC_CHTTP2_CLAMP_INVALID_VALUE,
GRPC_CHTTP2_PROTOCOL_ERROR},
};

@ -229,9 +229,6 @@ struct grpc_chttp2_transport_parsing {
/** is this transport a client? (boolean) */
uint8_t is_client;
/** max metadata size */
uint32_t max_metadata_size;
/** were settings updated? */
uint8_t settings_updated;
/** was a settings ack received? */

@ -45,6 +45,10 @@
#include "src/core/lib/profiling/timers.h"
#include "src/core/lib/transport/static_metadata.h"
#define TRANSPORT_FROM_PARSING(tp) \
((grpc_chttp2_transport *)((char *)(tp)-offsetof(grpc_chttp2_transport, \
parsing)))
static int init_frame_parser(grpc_exec_ctx *exec_ctx,
grpc_chttp2_transport_parsing *transport_parsing);
static int init_header_frame_parser(
@ -628,7 +632,10 @@ static void on_initial_header(void *tp, grpc_mdelem *md) {
} else {
const size_t new_size = stream_parsing->metadata_buffer[0].size +
GRPC_MDELEM_LENGTH(md);
if (new_size > transport_parsing->max_metadata_size) {
grpc_chttp2_transport_global *transport_global =
&TRANSPORT_FROM_PARSING(transport_parsing)->global;
if (new_size > transport_global->settings
[GRPC_LOCAL_SETTINGS][GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE]) {
stream_parsing->seen_error = true;
stream_parsing->exceeded_metadata_size = true;
GRPC_MDELEM_UNREF(md);
@ -664,7 +671,10 @@ static void on_trailing_header(void *tp, grpc_mdelem *md) {
const size_t new_size = stream_parsing->metadata_buffer[1].size +
GRPC_MDELEM_LENGTH(md);
if (new_size > transport_parsing->max_metadata_size) {
grpc_chttp2_transport_global *transport_global =
&TRANSPORT_FROM_PARSING(transport_parsing)->global;
if (new_size > transport_global->settings
[GRPC_LOCAL_SETTINGS][GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE]) {
stream_parsing->seen_error = true;
stream_parsing->exceeded_metadata_size = true;
GRPC_MDELEM_UNREF(md);

Loading…
Cancel
Save