| 
					
				 | 
			
			
				@@ -761,9 +761,6 @@ channel_free(channel_t *chan) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 channel_force_free(channel_t *chan) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  cell_queue_entry_t *tmp = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  channel_t *tmpchan = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   tor_assert(chan); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /* Call a free method if there is one */ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -778,9 +775,7 @@ channel_force_free(channel_t *chan) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (chan->u.listener.incoming_list) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       SMARTLIST_FOREACH_BEGIN(chan->u.listener.incoming_list, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                               channel_t *, qchan) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tmpchan = qchan; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        SMARTLIST_DEL_CURRENT(chan->u.listener.incoming_list, qchan); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        channel_request_close(tmpchan); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        channel_request_close(qchan); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } SMARTLIST_FOREACH_END(qchan); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       smartlist_free(chan->u.listener.incoming_list); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -794,8 +789,6 @@ channel_force_free(channel_t *chan) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (chan->u.cell_chan.cell_queue) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       SMARTLIST_FOREACH_BEGIN(chan->u.cell_chan.cell_queue, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                               cell_queue_entry_t *, q) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tmp = q; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        SMARTLIST_DEL_CURRENT(chan->u.cell_chan.cell_queue, q); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         tor_free(q); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } SMARTLIST_FOREACH_END(q); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -807,14 +800,12 @@ channel_force_free(channel_t *chan) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (chan->u.cell_chan.outgoing_queue) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       SMARTLIST_FOREACH_BEGIN(chan->u.cell_chan.outgoing_queue, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                               cell_queue_entry_t *, q) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tmp = q; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        SMARTLIST_DEL_CURRENT(chan->u.cell_chan.outgoing_queue, q); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (tmp->type == CELL_QUEUE_PACKED) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (tmp->u.packed.packed_cell) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            packed_cell_free(tmp->u.packed.packed_cell); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (q->type == CELL_QUEUE_PACKED) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          if (q->u.packed.packed_cell) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            packed_cell_free(q->u.packed.packed_cell); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tor_free(tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tor_free(q); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } SMARTLIST_FOREACH_END(q); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       smartlist_free(chan->u.cell_chan.outgoing_queue); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2055,10 +2046,8 @@ channel_process_incoming(channel_t *listener) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /* Make sure this is set correctly */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     channel_mark_incoming(chan); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     listener->u.listener.listener(listener, chan); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    SMARTLIST_DEL_CURRENT(listener->u.listener.incoming_list, chan); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } SMARTLIST_FOREACH_END(chan); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tor_assert(smartlist_len(listener->u.listener.incoming_list) == 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   smartlist_free(listener->u.listener.incoming_list); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   listener->u.listener.incoming_list = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2484,53 +2473,44 @@ channel_run_cleanup(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 channel_free_all(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  channel_t *tmp = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   log_debug(LD_CHANNEL, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             "Shutting down channels..."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /* First, let's go for finished channels */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (finished_channels) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     SMARTLIST_FOREACH_BEGIN(finished_channels, channel_t *, curr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tmp = curr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      /* Remove it from the list */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      SMARTLIST_DEL_CURRENT(finished_channels, curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       /* Deregister and free it */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tor_assert(tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      tor_assert(curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       log_debug(LD_CHANNEL, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 "Cleaning up finished channel %p (ID " U64_FORMAT ") " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 "in state %s (%d)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                tmp, U64_PRINTF_ARG(tmp->global_identifier), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                channel_state_to_string(tmp->state), tmp->state); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      channel_unregister(tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      channel_free(tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                curr, U64_PRINTF_ARG(curr->global_identifier), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                channel_state_to_string(curr->state), curr->state); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      channel_unregister(curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      channel_free(curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } SMARTLIST_FOREACH_END(curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     smartlist_free(finished_channels); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     finished_channels = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    tmp = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /* Now the listeners */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (listening_channels) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     SMARTLIST_FOREACH_BEGIN(listening_channels, channel_t *, curr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tmp = curr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      /* Remove it from the list */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      SMARTLIST_DEL_CURRENT(listening_channels, curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       /* Close, deregister and free it */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tor_assert(tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      tor_assert(curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       log_debug(LD_CHANNEL, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 "Cleaning up listening channel %p (ID " U64_FORMAT ") " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 "in state %s (%d)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                tmp, U64_PRINTF_ARG(tmp->global_identifier), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                channel_state_to_string(tmp->state), tmp->state); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                curr, U64_PRINTF_ARG(curr->global_identifier), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                channel_state_to_string(curr->state), curr->state); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       /* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        * We have to unregister first so we don't put it in finished_channels 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        * and allocate that again on close. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      channel_unregister(tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      channel_request_close(tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      channel_force_free(tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      channel_unregister(curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      channel_request_close(curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      channel_force_free(curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } SMARTLIST_FOREACH_END(curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     smartlist_free(listening_channels); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2540,23 +2520,20 @@ channel_free_all(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /* Now all active channels */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (active_channels) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     SMARTLIST_FOREACH_BEGIN(active_channels, channel_t *, curr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tmp = curr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      /* Remove it from the list */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      SMARTLIST_DEL_CURRENT(active_channels, curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       /* Close, deregister and free it */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tor_assert(tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      tor_assert(curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       log_debug(LD_CHANNEL, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 "Cleaning up active channel %p (ID " U64_FORMAT ") " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 "in state %s (%d)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                tmp, U64_PRINTF_ARG(tmp->global_identifier), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                channel_state_to_string(tmp->state), tmp->state); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                curr, U64_PRINTF_ARG(curr->global_identifier), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                channel_state_to_string(curr->state), curr->state); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       /* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        * We have to unregister first so we don't put it in finished_channels 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        * and allocate that again on close. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      channel_unregister(tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      channel_request_close(tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      channel_force_free(tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      channel_unregister(curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      channel_request_close(curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      channel_force_free(curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } SMARTLIST_FOREACH_END(curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     smartlist_free(active_channels); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2566,23 +2543,20 @@ channel_free_all(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /* Now all channels, in case any are left over */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (all_channels) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     SMARTLIST_FOREACH_BEGIN(all_channels, channel_t *, curr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tmp = curr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      /* Remove it from the list */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      SMARTLIST_DEL_CURRENT(all_channels, curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       /* Close, deregister and free it */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tor_assert(tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      tor_assert(curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       log_debug(LD_CHANNEL, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 "Cleaning up leftover channel %p (ID " U64_FORMAT ") " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 "in state %s (%d)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                tmp, U64_PRINTF_ARG(tmp->global_identifier), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                channel_state_to_string(tmp->state), tmp->state); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      channel_unregister(tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (!(tmp->state == CHANNEL_STATE_CLOSING || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tmp->state == CHANNEL_STATE_CLOSED || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tmp->state == CHANNEL_STATE_ERROR)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        channel_request_close(tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                curr, U64_PRINTF_ARG(curr->global_identifier), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                channel_state_to_string(curr->state), curr->state); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      channel_unregister(curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (!(curr->state == CHANNEL_STATE_CLOSING || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            curr->state == CHANNEL_STATE_CLOSED || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            curr->state == CHANNEL_STATE_ERROR)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        channel_request_close(curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      channel_force_free(tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      channel_force_free(curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } SMARTLIST_FOREACH_END(curr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     smartlist_free(all_channels); 
			 |