|  | @@ -474,7 +474,8 @@ void grpc_chttp2_hpack_compressor_init(grpc_chttp2_hpack_compressor *c,
 | 
	
		
			
				|  |  |    c->mdctx = ctx;
 | 
	
		
			
				|  |  |    c->timeout_key_str = grpc_mdstr_from_string(ctx, "grpc-timeout");
 | 
	
		
			
				|  |  |    c->max_table_size = GRPC_CHTTP2_HPACKC_INITIAL_TABLE_SIZE;
 | 
	
		
			
				|  |  | -  c->cap_table_elems = c->max_table_elems = elems_for_bytes(c->max_table_size);
 | 
	
		
			
				|  |  | +  c->cap_table_elems = elems_for_bytes(c->max_table_size);
 | 
	
		
			
				|  |  | +  c->max_table_elems = c->cap_table_elems;
 | 
	
		
			
				|  |  |    c->max_usable_size = GRPC_CHTTP2_HPACKC_INITIAL_TABLE_SIZE;
 | 
	
		
			
				|  |  |    c->table_elem_size =
 | 
	
		
			
				|  |  |        gpr_malloc(sizeof(*c->table_elem_size) * c->cap_table_elems);
 | 
	
	
		
			
				|  | @@ -500,7 +501,20 @@ void grpc_chttp2_hpack_compressor_set_max_usable_size(
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void rebuild_elems(grpc_chttp2_hpack_compressor *c, gpr_uint32 new_cap) {
 | 
	
		
			
				|  |  | +  gpr_uint16 *table_elem_size = gpr_malloc(sizeof(*table_elem_size) * new_cap);
 | 
	
		
			
				|  |  | +  gpr_uint32 i;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  memset(table_elem_size, 0, sizeof(*table_elem_size) * new_cap);
 | 
	
		
			
				|  |  | +  GPR_ASSERT(c->table_elems <= new_cap);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  for (i = 0; i < c->table_elems; i++) {
 | 
	
		
			
				|  |  | +    gpr_uint32 ofs = c->tail_remote_index + i + 1;
 | 
	
		
			
				|  |  | +    table_elem_size[ofs % new_cap] = c->table_elem_size[ofs % c->cap_table_elems];
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  c->cap_table_elems = new_cap;
 | 
	
		
			
				|  |  | +  gpr_free(c->table_elem_size);
 | 
	
		
			
				|  |  | +  c->table_elem_size = table_elem_size;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void grpc_chttp2_hpack_compressor_set_max_table_size(
 | 
	
	
		
			
				|  | @@ -517,7 +531,7 @@ void grpc_chttp2_hpack_compressor_set_max_table_size(
 | 
	
		
			
				|  |  |    if (c->max_table_elems > c->cap_table_elems) {
 | 
	
		
			
				|  |  |      rebuild_elems(c, GPR_MAX(c->max_table_elems, 2 * c->cap_table_elems));
 | 
	
		
			
				|  |  |    } else if (c->max_table_elems < c->cap_table_elems / 3) {
 | 
	
		
			
				|  |  | -    gpr_uint32 new_cap = GPR_MIN(c->max_table_elems, 16);
 | 
	
		
			
				|  |  | +    gpr_uint32 new_cap = GPR_MAX(c->max_table_elems, 16);
 | 
	
		
			
				|  |  |      if (new_cap != c->cap_table_elems) {
 | 
	
		
			
				|  |  |        rebuild_elems(c, new_cap);
 | 
	
		
			
				|  |  |      }
 |