|  | @@ -655,12 +655,7 @@ static grpc_error* on_hdr(grpc_chttp2_hpack_parser* p, grpc_mdelem md) {
 | 
	
		
			
				|  |  |      grpc_error* err = grpc_chttp2_hptbl_add(&p->table, md);
 | 
	
		
			
				|  |  |      if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) return err;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  if (GPR_UNLIKELY(p->on_header == nullptr)) {
 | 
	
		
			
				|  |  | -    GRPC_MDELEM_UNREF(md);
 | 
	
		
			
				|  |  | -    return GRPC_ERROR_CREATE_FROM_STATIC_STRING("on_header callback not set");
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  p->on_header(p->on_header_user_data, md);
 | 
	
		
			
				|  |  | -  return GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  | +  return p->on_header(p->on_header_user_data, md);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static grpc_core::UnmanagedMemorySlice take_string_extern(
 | 
	
	
		
			
				|  | @@ -765,23 +760,26 @@ static grpc_error* parse_stream_dep0(grpc_chttp2_hpack_parser* p,
 | 
	
		
			
				|  |  |    return parse_stream_dep1(p, cur + 1, end);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +static grpc_error* GPR_ATTRIBUTE_NOINLINE
 | 
	
		
			
				|  |  | +on_invalid_hpack_idx(grpc_chttp2_hpack_parser* p) {
 | 
	
		
			
				|  |  | +  return grpc_error_set_int(
 | 
	
		
			
				|  |  | +      grpc_error_set_int(
 | 
	
		
			
				|  |  | +          GRPC_ERROR_CREATE_FROM_STATIC_STRING("Invalid HPACK index received"),
 | 
	
		
			
				|  |  | +          GRPC_ERROR_INT_INDEX, static_cast<intptr_t>(p->index)),
 | 
	
		
			
				|  |  | +      GRPC_ERROR_INT_SIZE, static_cast<intptr_t>(p->table.num_ents));
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  /* emit an indexed field; jumps to begin the next field on completion */
 | 
	
		
			
				|  |  |  static grpc_error* finish_indexed_field(grpc_chttp2_hpack_parser* p,
 | 
	
		
			
				|  |  |                                          const uint8_t* cur,
 | 
	
		
			
				|  |  |                                          const uint8_t* end) {
 | 
	
		
			
				|  |  | -  grpc_mdelem md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
 | 
	
		
			
				|  |  | -  if (GRPC_MDISNULL(md)) {
 | 
	
		
			
				|  |  | -    return grpc_error_set_int(
 | 
	
		
			
				|  |  | -        grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
 | 
	
		
			
				|  |  | -                               "Invalid HPACK index received"),
 | 
	
		
			
				|  |  | -                           GRPC_ERROR_INT_INDEX,
 | 
	
		
			
				|  |  | -                           static_cast<intptr_t>(p->index)),
 | 
	
		
			
				|  |  | -        GRPC_ERROR_INT_SIZE, static_cast<intptr_t>(p->table.num_ents));
 | 
	
		
			
				|  |  | +  grpc_mdelem md = grpc_chttp2_hptbl_lookup<true>(&p->table, p->index);
 | 
	
		
			
				|  |  | +  if (GPR_UNLIKELY(GRPC_MDISNULL(md))) {
 | 
	
		
			
				|  |  | +    return on_invalid_hpack_idx(p);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  GRPC_MDELEM_REF(md);
 | 
	
		
			
				|  |  |    GRPC_STATS_INC_HPACK_RECV_INDEXED();
 | 
	
		
			
				|  |  |    grpc_error* err = on_hdr<false>(p, md);
 | 
	
		
			
				|  |  | -  if (err != GRPC_ERROR_NONE) return err;
 | 
	
		
			
				|  |  | +  if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) return err;
 | 
	
		
			
				|  |  |    return parse_begin(p, cur, end);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1557,13 +1555,8 @@ static void set_precomputed_md_idx(grpc_chttp2_hpack_parser* p,
 | 
	
		
			
				|  |  |  static grpc_error* is_binary_indexed_header(grpc_chttp2_hpack_parser* p,
 | 
	
		
			
				|  |  |                                              bool* is) {
 | 
	
		
			
				|  |  |    grpc_mdelem elem = grpc_chttp2_hptbl_lookup(&p->table, p->index);
 | 
	
		
			
				|  |  | -  if (GRPC_MDISNULL(elem)) {
 | 
	
		
			
				|  |  | -    return grpc_error_set_int(
 | 
	
		
			
				|  |  | -        grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
 | 
	
		
			
				|  |  | -                               "Invalid HPACK index received"),
 | 
	
		
			
				|  |  | -                           GRPC_ERROR_INT_INDEX,
 | 
	
		
			
				|  |  | -                           static_cast<intptr_t>(p->index)),
 | 
	
		
			
				|  |  | -        GRPC_ERROR_INT_SIZE, static_cast<intptr_t>(p->table.num_ents));
 | 
	
		
			
				|  |  | +  if (GPR_UNLIKELY(GRPC_MDISNULL(elem))) {
 | 
	
		
			
				|  |  | +    return on_invalid_hpack_idx(p);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    /* We know that GRPC_MDKEY(elem) points to a reference counted slice since:
 | 
	
		
			
				|  |  |     * 1. elem was a result of grpc_chttp2_hptbl_lookup
 | 
	
	
		
			
				|  | @@ -1599,10 +1592,16 @@ static grpc_error* parse_value_string_with_literal_key(
 | 
	
		
			
				|  |  |    return parse_value_string(p, cur, end, is_binary_literal_header(p));
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +/* "Uninitialized" header parser to save us a branch in on_hdr().  */
 | 
	
		
			
				|  |  | +static grpc_error* on_header_uninitialized(void* user_data, grpc_mdelem md) {
 | 
	
		
			
				|  |  | +  GRPC_MDELEM_UNREF(md);
 | 
	
		
			
				|  |  | +  return GRPC_ERROR_CREATE_FROM_STATIC_STRING("on_header callback not set");
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  /* PUBLIC INTERFACE */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void grpc_chttp2_hpack_parser_init(grpc_chttp2_hpack_parser* p) {
 | 
	
		
			
				|  |  | -  p->on_header = nullptr;
 | 
	
		
			
				|  |  | +  p->on_header = on_header_uninitialized;
 | 
	
		
			
				|  |  |    p->on_header_user_data = nullptr;
 | 
	
		
			
				|  |  |    p->state = parse_begin;
 | 
	
		
			
				|  |  |    p->key.data.referenced = grpc_empty_slice();
 | 
	
	
		
			
				|  | @@ -1750,7 +1749,7 @@ grpc_error* grpc_chttp2_header_parser_parse(void* hpack_parser,
 | 
	
		
			
				|  |  |          grpc_chttp2_mark_stream_closed(t, s, true, false, GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    parser->on_header = nullptr;
 | 
	
		
			
				|  |  | +    parser->on_header = on_header_uninitialized;
 | 
	
		
			
				|  |  |      parser->on_header_user_data = nullptr;
 | 
	
		
			
				|  |  |      parser->is_boundary = 0xde;
 | 
	
		
			
				|  |  |      parser->is_eof = 0xde;
 |