| 
					
				 | 
			
			
				@@ -2585,17 +2585,29 @@ channel_send_destroy(circid_t circ_id, channel_t *chan, int reason) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   tor_assert(chan); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  memset(&cell, 0, sizeof(cell_t)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  cell.circ_id = circ_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  cell.command = CELL_DESTROY; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  cell.payload[0] = (uint8_t) reason; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  log_debug(LD_OR, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            "Sending destroy (circID %d) on channel %p " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            "(global ID " U64_FORMAT ")", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            circ_id, chan, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            U64_PRINTF_ARG(chan->global_identifier)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* Check to make sure we can send on this channel first */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!(chan->state == CHANNEL_STATE_CLOSING || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        chan->state == CHANNEL_STATE_CLOSED || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        chan->state == CHANNEL_STATE_ERROR)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    memset(&cell, 0, sizeof(cell_t)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    cell.circ_id = circ_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    cell.command = CELL_DESTROY; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    cell.payload[0] = (uint8_t) reason; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    log_debug(LD_OR, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              "Sending destroy (circID %d) on channel %p " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              "(global ID " U64_FORMAT ")", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              circ_id, chan, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              U64_PRINTF_ARG(chan->global_identifier)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  channel_write_cell(chan, &cell); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    channel_write_cell(chan, &cell); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    log_warn(LD_BUG, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             "Someone called channel_send_destroy() for circID %d " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             "on a channel " U64_FORMAT " at %p in state %s (%d)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             circ_id, U64_PRINTF_ARG(chan->global_identifier), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             chan, channel_state_to_string(chan->state), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             chan->state); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |