| 
					
				 | 
			
			
				@@ -249,29 +249,12 @@ dirserv_free_fingerprint_list() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  *    Descriptor list 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** A directory server's view of a server descriptor.  Contains both 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * parsed and unparsed versions. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-typedef struct descriptor_entry_t { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  char *nickname; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  time_t published; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  size_t desc_len; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  char *descriptor; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  int verified; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  routerinfo_t *router; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} descriptor_entry_t; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** List of all server descriptors that this dirserv is holding. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** List of routerinfo_t for all server descriptors that this dirserv 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * is holding. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * XXXX This should eventually get coalesced into routerlist.c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static smartlist_t *descriptor_list = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** Release the storage held by <b>desc</b> */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static void free_descriptor_entry(descriptor_entry_t *desc) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tor_free(desc->descriptor); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tor_free(desc->nickname); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  routerinfo_free(desc->router); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tor_free(desc); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** Release all storage that the dirserv is holding for server 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * descriptors. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -279,8 +262,8 @@ dirserv_free_descriptors() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (!descriptor_list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  SMARTLIST_FOREACH(descriptor_list, descriptor_entry_t *, d, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    free_descriptor_entry(d)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  SMARTLIST_FOREACH(descriptor_list, routerinfo_t *, ri, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    routerinfo_free(ri)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   smartlist_clear(descriptor_list); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -319,12 +302,10 @@ dirserv_router_has_valid_address(routerinfo_t *ri) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 dirserv_add_descriptor(const char **desc, const char **msg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  descriptor_entry_t *ent = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  routerinfo_t *ri = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  routerinfo_t *ri = NULL, *ri_old=NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   int i, r, found=-1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   char *start, *end; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   char *desc_tmp = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const char *cp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   size_t desc_len; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   time_t now; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   int verified=1; /* whether we knew its fingerprint already */ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -346,10 +327,10 @@ dirserv_add_descriptor(const char **desc, const char **msg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     end = start+strlen(start); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   desc_len = end-start; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  cp = desc_tmp = tor_strndup(start, desc_len); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  desc_tmp = tor_strndup(start, desc_len); /* Is this strndup still needed???*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /* Check: is the descriptor syntactically valid? */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ri = router_parse_entry_from_string(cp, NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ri = router_parse_entry_from_string(desc_tmp, NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   tor_free(desc_tmp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (!ri) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     log(LOG_WARN, "Couldn't parse descriptor"); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -402,15 +383,15 @@ dirserv_add_descriptor(const char **desc, const char **msg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /* Do we already have an entry for this router? */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (i = 0; i < smartlist_len(descriptor_list); ++i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ent = smartlist_get(descriptor_list, i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!strcasecmp(ri->nickname, ent->nickname)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ri_old = smartlist_get(descriptor_list, i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!strcasecmp(ri->nickname, ri_old->nickname)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       found = i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (found >= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /* if so, decide whether to update it. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (ent->published >= ri->published_on) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (ri_old->published_on >= ri->published_on) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       /* We already have a newer or equal-time descriptor */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       log_fn(LOG_INFO,"We already have a new enough desc for nickname '%s'. Not adding.",ri->nickname); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       *msg = "We already have a newer descriptor."; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -419,10 +400,10 @@ dirserv_add_descriptor(const char **desc, const char **msg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       *desc = end; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return verified; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /* We don't have a newer one; we'll update this one. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /* We don't alrady have a newer one; we'll update this one. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     log_fn(LOG_INFO,"Dirserv updating desc for nickname '%s'",ri->nickname); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     *msg = verified?"Verified server updated":"Unverified server updated. (Have you sent us your key fingerprint?)"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    free_descriptor_entry(ent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    routerinfo_free(ri_old); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     smartlist_del_keeporder(descriptor_list, found); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /* Add at the end. */ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -430,14 +411,8 @@ dirserv_add_descriptor(const char **desc, const char **msg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     *msg = verified?"Verified server added":"Unverified server added. (Have you sent us your key fingerprint?)"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ent = tor_malloc(sizeof(descriptor_entry_t)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ent->nickname = tor_strdup(ri->nickname); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ent->published = ri->published_on; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ent->desc_len = desc_len; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ent->descriptor = tor_strndup(start,desc_len); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ent->router = ri; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ent->verified = verified; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  smartlist_add(descriptor_list, ent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ri->is_verified = verified; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  smartlist_add(descriptor_list, ri); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   *desc = end; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   directory_set_dirty(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -453,16 +428,16 @@ static void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 directory_remove_unrecognized(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   int i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  descriptor_entry_t *ent; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  routerinfo_t *ent; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (!descriptor_list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     descriptor_list = smartlist_create(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (i = 0; i < smartlist_len(descriptor_list); ++i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ent = smartlist_get(descriptor_list, i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (dirserv_router_fingerprint_is_known(ent->router)<=0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (dirserv_router_fingerprint_is_known(ent)<=0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       log(LOG_INFO, "Router '%s' is no longer recognized", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           ent->nickname); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      free_descriptor_entry(ent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      routerinfo_free(ent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       smartlist_del(descriptor_list, i--); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -510,28 +485,27 @@ dirserv_load_from_directory_string(const char *dir) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * as running iff <b>is_live</b> is true. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static char * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-list_single_server_status(descriptor_entry_t *desc, int is_live, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+list_single_server_status(routerinfo_t *desc, int is_live, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                           int rr_format) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   char buf[MAX_NICKNAME_LEN+HEX_DIGEST_LEN+4]; /* !nickname=$hexdigest\0 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   char *cp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   tor_assert(desc); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tor_assert(desc->router); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   cp = buf; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (!is_live) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     *cp++ = '!'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (desc->verified) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (desc->is_verified) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     strlcpy(cp, desc->nickname, sizeof(buf)-(cp-buf)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     cp += strlen(cp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (!rr_format) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       *cp++ = '='; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!desc->verified || !rr_format) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!desc->is_verified || !rr_format) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     *cp++ = '$'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    base16_encode(cp, HEX_DIGEST_LEN+1, desc->router->identity_digest, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    base16_encode(cp, HEX_DIGEST_LEN+1, desc->identity_digest, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                   DIGEST_LEN); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return tor_strdup(buf); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -556,20 +530,19 @@ list_server_status(char **running_routers_out, char **router_status_out) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   rr_entries = smartlist_create(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   rs_entries = smartlist_create(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  SMARTLIST_FOREACH(descriptor_list, descriptor_entry_t *, d, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  SMARTLIST_FOREACH(descriptor_list, routerinfo_t *, ri, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     int is_live; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     connection_t *conn; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    tor_assert(d->router); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     conn = connection_get_by_identity_digest( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    d->router->identity_digest, CONN_TYPE_OR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ri->identity_digest, CONN_TYPE_OR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /* Treat a router as alive if 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      *    - It's me, and I'm not hibernating. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * or - we're connected to it. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    is_live = (router_is_me(d->router) && !we_are_hibernating()) || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    is_live = (router_is_me(ri) && !we_are_hibernating()) || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       (conn && conn->state == OR_CONN_STATE_OPEN); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    smartlist_add(rr_entries, list_single_server_status(d, is_live, 1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    smartlist_add(rs_entries, list_single_server_status(d, is_live, 0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    smartlist_add(rr_entries, list_single_server_status(ri, is_live, 1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    smartlist_add(rs_entries, list_single_server_status(ri, is_live, 0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (running_routers_out) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -593,16 +566,16 @@ dirserv_remove_old_servers(int age) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   int i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   time_t cutoff; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  descriptor_entry_t *ent; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  routerinfo_t *ent; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (!descriptor_list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     descriptor_list = smartlist_create(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   cutoff = time(NULL) - age; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (i = 0; i < smartlist_len(descriptor_list); ++i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ent = smartlist_get(descriptor_list, i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (ent->published <= cutoff) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (ent->published_on <= cutoff) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       /* descriptor_list[i] is too old.  Remove it. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      free_descriptor_entry(ent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      routerinfo_free(ent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       smartlist_del(descriptor_list, i--); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       directory_set_dirty(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -677,8 +650,8 @@ dirserv_dump_directory_to_string(char **dir_out, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   buf_len = 2048+strlen(recommended_versions)+strlen(running_routers)+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     strlen(router_status); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  SMARTLIST_FOREACH(descriptor_list, descriptor_entry_t *, d, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    buf_len += strlen(d->descriptor)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  SMARTLIST_FOREACH(descriptor_list, routerinfo_t *, ri, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    buf_len += strlen(ri->signed_descriptor)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   buf = tor_malloc(buf_len); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /* We'll be comparing against buf_len throughout the rest of the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      function, though strictly speaking we shouldn't be able to exceed 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -702,8 +675,8 @@ dirserv_dump_directory_to_string(char **dir_out, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   i = strlen(buf); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   cp = buf+i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  SMARTLIST_FOREACH(descriptor_list, descriptor_entry_t *, d, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (strlcat(buf, d->descriptor, buf_len) >= buf_len) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  SMARTLIST_FOREACH(descriptor_list, routerinfo_t *, ri, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (strlcat(buf, ri->signed_descriptor, buf_len) >= buf_len) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       goto truncated); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /* These multiple strlcat calls are inefficient, but dwarfed by the RSA 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1010,8 +983,8 @@ dirserv_free_all(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     fingerprint_list = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (descriptor_list) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    SMARTLIST_FOREACH(descriptor_list, descriptor_entry_t*, d, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                      free_descriptor_entry(d)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    SMARTLIST_FOREACH(descriptor_list, routerinfo_t *, ri, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      routerinfo_free(ri)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     smartlist_free(descriptor_list); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     descriptor_list = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 |