|  | @@ -121,7 +121,7 @@ typedef enum {
 | 
	
		
			
				|  |  |    ZOMBIED
 | 
	
		
			
				|  |  |  } call_state;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -typedef struct legacy_data { grpc_metadata_array client_metadata; } legacy_data;
 | 
	
		
			
				|  |  | +typedef struct legacy_data { grpc_metadata_array *initial_metadata; } legacy_data;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  struct call_data {
 | 
	
		
			
				|  |  |    grpc_call *call;
 | 
	
	
		
			
				|  | @@ -397,6 +397,7 @@ static void init_call_elem(grpc_call_element *elem,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void destroy_call_elem(grpc_call_element *elem) {
 | 
	
		
			
				|  |  |    channel_data *chand = elem->channel_data;
 | 
	
		
			
				|  |  | +  call_data *calld = elem->call_data;
 | 
	
		
			
				|  |  |    int i;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    gpr_mu_lock(&chand->server->mu);
 | 
	
	
		
			
				|  | @@ -409,6 +410,10 @@ static void destroy_call_elem(grpc_call_element *elem) {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    gpr_mu_unlock(&chand->server->mu);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  if (calld->legacy) {
 | 
	
		
			
				|  |  | +    gpr_free(calld->legacy);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    server_unref(chand->server);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -712,12 +717,11 @@ static void publish_legacy_request(grpc_call *call, grpc_op_error status,
 | 
	
		
			
				|  |  |    grpc_server *server = chand->server;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (status == GRPC_OP_OK) {
 | 
	
		
			
				|  |  | -    grpc_call_internal_ref(call);
 | 
	
		
			
				|  |  |      grpc_cq_end_new_rpc(server->cq, tag, call, do_nothing, NULL,
 | 
	
		
			
				|  |  |                          grpc_mdstr_as_c_string(calld->path),
 | 
	
		
			
				|  |  |                          grpc_mdstr_as_c_string(calld->host), calld->deadline,
 | 
	
		
			
				|  |  | -                        calld->legacy->client_metadata.count,
 | 
	
		
			
				|  |  | -                        calld->legacy->client_metadata.metadata);
 | 
	
		
			
				|  |  | +                        calld->legacy->initial_metadata->count,
 | 
	
		
			
				|  |  | +                        calld->legacy->initial_metadata->metadata);
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  |      abort();
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -737,6 +741,8 @@ static void begin_legacy_request(grpc_server *server, grpc_completion_queue *cq,
 | 
	
		
			
				|  |  |    req.data.recv_metadata = initial_metadata;
 | 
	
		
			
				|  |  |    calld->legacy = gpr_malloc(sizeof(legacy_data));
 | 
	
		
			
				|  |  |    memset(calld->legacy, 0, sizeof(legacy_data));
 | 
	
		
			
				|  |  | +  calld->legacy->initial_metadata = initial_metadata;
 | 
	
		
			
				|  |  | +  grpc_call_internal_ref(calld->call);
 | 
	
		
			
				|  |  |    grpc_call_start_ioreq_and_call_back(calld->call, &req, 1,
 | 
	
		
			
				|  |  |                                        publish_legacy_request, tag);
 | 
	
		
			
				|  |  |  }
 |