|  | @@ -682,9 +682,10 @@ addressmap_free_all(void)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /** Look at address, and rewrite it until it doesn't want any
 | 
	
		
			
				|  |  |   * more rewrites; but don't get into an infinite loop.
 | 
	
		
			
				|  |  | - * Don't write more than maxlen chars into address.
 | 
	
		
			
				|  |  | + * Don't write more than maxlen chars into address.  Return true if the
 | 
	
		
			
				|  |  | + * address changed; false otherwise.
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  | -void
 | 
	
		
			
				|  |  | +int
 | 
	
		
			
				|  |  |  addressmap_rewrite(char *address, size_t maxlen)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |    addressmap_entry_t *ent;
 | 
	
	
		
			
				|  | @@ -695,7 +696,7 @@ addressmap_rewrite(char *address, size_t maxlen)
 | 
	
		
			
				|  |  |      ent = strmap_get(addressmap, address);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      if (!ent || !ent->new_address)
 | 
	
		
			
				|  |  | -      return; /* done, no rewrite needed */
 | 
	
		
			
				|  |  | +      return (rewrites > 0); /* done, no rewrite needed */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      cp = tor_strdup(escaped_safe_str(ent->new_address));
 | 
	
		
			
				|  |  |      log_info(LD_APP, "Addressmap: rewriting %s to %s",
 | 
	
	
		
			
				|  | @@ -707,6 +708,7 @@ addressmap_rewrite(char *address, size_t maxlen)
 | 
	
		
			
				|  |  |             "Loop detected: we've rewritten %s 16 times! Using it as-is.",
 | 
	
		
			
				|  |  |             escaped_safe_str(address));
 | 
	
		
			
				|  |  |    /* it's fine to rewrite a rewrite, but don't loop forever */
 | 
	
		
			
				|  |  | +  return 1;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /** If we have a cached reverse DNS entry for the address stored in the
 | 
	
	
		
			
				|  | @@ -1216,7 +1218,9 @@ connection_ap_handshake_rewrite_and_attach(edge_connection_t *conn,
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  |      /* For address map controls, remap the address */
 | 
	
		
			
				|  |  | -    addressmap_rewrite(socks->address, sizeof(socks->address));
 | 
	
		
			
				|  |  | +    if (addressmap_rewrite(socks->address, sizeof(socks->address))) {
 | 
	
		
			
				|  |  | +      control_event_stream_status(conn, STREAM_EVENT_REMAP, 0);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (address_is_in_virtual_range(socks->address)) {
 |