|  | @@ -156,21 +156,24 @@ already_have_cert(authority_cert_t *cert)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /** Load a bunch of new key certificates from the string <b>contents</b>.  If
 | 
	
		
			
				|  |  |   * <b>from_store</b> is true, the certificates are from the cache, and we
 | 
	
		
			
				|  |  | - * don't need to flush them to disk.  If <b>from_store</b> is false, we need
 | 
	
		
			
				|  |  | - * to flush any changed certificates to disk.  Return 0 on success, -1 on
 | 
	
		
			
				|  |  | - * failure. */
 | 
	
		
			
				|  |  | + * don't need to flush them to disk. If <b>flush</b> is true, we need
 | 
	
		
			
				|  |  | + * to flush any changed certificates to disk now.  Return 0 on success, -1
 | 
	
		
			
				|  |  | + * if any certs fail to parse. */
 | 
	
		
			
				|  |  |  int
 | 
	
		
			
				|  |  |  trusted_dirs_load_certs_from_string(const char *contents, int from_store,
 | 
	
		
			
				|  |  |                                      int flush)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |    trusted_dir_server_t *ds;
 | 
	
		
			
				|  |  |    const char *s, *eos;
 | 
	
		
			
				|  |  | +  int failure_code = 0;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    for (s = contents; *s; s = eos) {
 | 
	
		
			
				|  |  |      authority_cert_t *cert = authority_cert_parse_from_string(s, &eos);
 | 
	
		
			
				|  |  |      cert_list_t *cl;
 | 
	
		
			
				|  |  | -    if (!cert)
 | 
	
		
			
				|  |  | +    if (!cert) {
 | 
	
		
			
				|  |  | +      failure_code = -1;
 | 
	
		
			
				|  |  |        break;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |      ds = trusteddirserver_get_by_v3_auth_digest(
 | 
	
		
			
				|  |  |                                         cert->cache_info.identity_digest);
 | 
	
		
			
				|  |  |      log_debug(LD_DIR, "Parsed certificate for %s",
 | 
	
	
		
			
				|  | @@ -224,7 +227,7 @@ trusted_dirs_load_certs_from_string(const char *contents, int from_store,
 | 
	
		
			
				|  |  |             ds->dir_port != cert->dir_port)) {
 | 
	
		
			
				|  |  |          char *a = tor_dup_ip(cert->addr);
 | 
	
		
			
				|  |  |          log_notice(LD_DIR, "Updating address for directory authority %s "
 | 
	
		
			
				|  |  | -                   "from %s:%d to %s:%d based on in certificate.",
 | 
	
		
			
				|  |  | +                   "from %s:%d to %s:%d based on certificate.",
 | 
	
		
			
				|  |  |                     ds->nickname, ds->address, (int)ds->dir_port,
 | 
	
		
			
				|  |  |                     a, cert->dir_port);
 | 
	
		
			
				|  |  |          tor_free(a);
 | 
	
	
		
			
				|  | @@ -241,8 +244,11 @@ trusted_dirs_load_certs_from_string(const char *contents, int from_store,
 | 
	
		
			
				|  |  |    if (flush)
 | 
	
		
			
				|  |  |      trusted_dirs_flush_certs_to_disk();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  /* call this even if failure_code is <0, since some certs might have
 | 
	
		
			
				|  |  | +   * succeeded. */
 | 
	
		
			
				|  |  |    networkstatus_note_certs_arrived();
 | 
	
		
			
				|  |  | -  return 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  return failure_code;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /** Save all v3 key certificates to the cached-certs file. */
 |