[or-cvs] Rename unused-address functions to virtual address; this is...
Nick Mathewson
nickm at seul.org
Wed Mar 2 21:02:14 UTC 2005
Update of /home/or/cvsroot/tor/src/or
In directory moria.mit.edu:/tmp/cvs-serv29841/src/or
Modified Files:
connection_edge.c control.c or.h
Log Message:
Rename unused-address functions to virtual address; this is more accurate. Also, include almost-right implementation of reusing dont-care mappings. (It is still kind of wrong because it does not take type into account.)
Index: connection_edge.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/connection_edge.c,v
retrieving revision 1.289
retrieving revision 1.290
diff -u -d -r1.289 -r1.290
--- connection_edge.c 2 Mar 2005 19:26:46 -0000 1.289
+++ connection_edge.c 2 Mar 2005 21:02:10 -0000 1.290
@@ -18,6 +18,7 @@
static smartlist_t *redirect_exit_list = NULL;
static int connection_ap_handshake_process_socks(connection_t *conn);
+static int address_is_in_virtual_range(const char *addr);
/** There was an EOF. Send an end and mark the connection for close.
*/
@@ -365,10 +366,13 @@
/** The tree of client-side address rewrite instructions. */
static strmap_t *addressmap;
+/** Tree mapping addresses to which virtual address we assigned them to. */
+static strmap_t *virtaddress_reversemap;
/** Initialize addressmap. */
void addressmap_init(void) {
addressmap = strmap_new();
+ virtaddress_reversemap = strmap_new();
}
/** Free the memory associated with the addressmap entry <b>_ent</b>. */
@@ -379,6 +383,20 @@
tor_free(ent);
}
+static void
+addressmap_ent_remove(const char *addr, addressmap_entry_t *ent)
+{
+ if (ent && address_is_in_virtual_range(ent->new_address)) {
+ if (!strcasecmp(addr,
+ strmap_get(virtaddress_reversemap, ent->new_address))) {
+ char *a = strmap_remove(virtaddress_reversemap, ent->new_address);
+ tor_free(a);
+ }
+ }
+ addressmap_ent_free(ent);
+}
+
+
/** A helper function for addressmap_clean() below. If ent is too old,
* then remove it from the tree and return NULL, else return ent.
*/
@@ -389,7 +407,7 @@
if (ent->expires && ent->expires < *nowp) {
log(LOG_INFO, "Addressmap: expiring remap (%s to %s)",
addr, ent->new_address);
- addressmap_ent_free(ent);
+ addressmap_ent_remove(addr,ent);
return NULL;
} else {
return ent;
@@ -409,6 +427,7 @@
void addressmap_free_all(void) {
strmap_free(addressmap, addressmap_ent_free);
addressmap = NULL;
+ strmap_free(virtaddress_reversemap, free);
}
/** Look at address, and rewrite it until it doesn't want any
@@ -458,15 +477,21 @@
return;
}
if (!new_address || !strcasecmp(address,new_address)) {
+ /* Remove the mapping, if any. */
tor_free(new_address);
- /* Remove the old mapping, if any. */
if (ent) {
- addressmap_ent_free(ent);
+ addressmap_ent_remove(address,ent);
strmap_remove(addressmap, address);
}
return;
}
if (ent) { /* we'll replace it */
+ if (address_is_in_virtual_range(ent->new_address) &&
+ !strcasecmp(address,
+ strmap_get(virtaddress_reversemap, ent->new_address))) {
+ char *a = strmap_remove(virtaddress_reversemap, ent->new_address);
+ tor_free(a);
+ }
tor_free(ent->new_address);
} else { /* make a new one and register it */
ent = tor_malloc_zero(sizeof(addressmap_entry_t));
@@ -546,10 +571,10 @@
/**
* Return true iff <b>addr</b> is likely to have been returned by
- * client_dns_get_unmapped_address.
+ * client_dns_get_unused_address.
**/
static int
-address_is_in_unmapped_range(const char *addr)
+address_is_in_virtual_range(const char *addr)
{
struct in_addr in;
tor_assert(addr);
@@ -567,8 +592,8 @@
* (one of RESOLVED_TYPE_{IPV4|HOSTNAME}) that has not yet been mapped,
* and that is very unlikely to be the address of any real host.
*/
-char *
-client_dns_get_unmapped_address(int type)
+static char *
+addressmap_get_virtual_address(int type)
{
char buf[64];
static uint32_t next_ipv4 = MIN_UNUSED_IPV4;
@@ -605,6 +630,28 @@
}
}
+/* DOCDOC */
+char *
+addressmap_register_virtual_address(int type, char *new_address)
+{
+ char *addr;
+ tor_assert(new_address);
+
+ if ((addr = strmap_get(virtaddress_reversemap, new_address))) {
+ addressmap_entry_t *ent = strmap_get(addressmap, addr);
+ if (!strcasecmp(new_address, ent->new_address))
+ return tor_strdup(addr);
+ else
+ log_fn(LOG_WARN, "Internal confusion: I thought that '%s' was mapped to by '%s', but '%s' really maps to '%s'. This is a harmless bug.",
+ new_address, addr, addr, ent->new_address);
+ }
+
+ addr = addressmap_get_virtual_address(type);
+ strmap_set(virtaddress_reversemap, new_address, tor_strdup(addr));
+ addressmap_register(addr, new_address, 0);
+ return addr;
+}
+
/** Return 1 if <b>address</b> has funny characters in it like
* colons. Return 0 if it's fine.
*/
@@ -664,7 +711,7 @@
/* For address map controls, remap the address */
addressmap_rewrite(socks->address, sizeof(socks->address));
- if (address_is_in_unmapped_range(socks->address)) {
+ if (address_is_in_virtual_range(socks->address)) {
/* This address was probably handed out by client_dns_get_unmapped_address,
* but the mapping was discarded for some reason. We *don't* want to send
* the address through tor; that's likely to fail, and may leak
Index: control.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/control.c,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -d -r1.48 -r1.49
--- control.c 2 Mar 2005 20:22:10 -0000 1.48
+++ control.c 2 Mar 2005 21:02:11 -0000 1.49
@@ -496,8 +496,9 @@
} else if (!is_plausible_address(to)) {
log_fn(LOG_WARN,"Skipping invalid argument '%s' in AddressMap msg",to);
} else if (!strcmp(from, ".") || !strcmp(from, "0.0.0.0")) {
- char *addr = client_dns_get_unmapped_address(
- strcmp(from,".") ? RESOLVED_TYPE_HOSTNAME : RESOLVED_TYPE_IPV4);
+ char *addr = addressmap_register_virtual_address(
+ strcmp(from,".") ? RESOLVED_TYPE_HOSTNAME : RESOLVED_TYPE_IPV4,
+ tor_strdup(to));
if (!addr) {
log_fn(LOG_WARN,
"Unable to allocate address for '%s' in AdressMap msg", line);
@@ -505,7 +506,7 @@
size_t anslen = strlen(addr)+strlen(to)+2;
char *ans = tor_malloc(anslen);
tor_snprintf(ans, anslen, "%s %s", addr, to);
- addressmap_register(addr, tor_strdup(to), 0);
+ tor_free(addr);
smartlist_add(reply, ans);
}
} else {
Index: or.h
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/or.h,v
retrieving revision 1.549
retrieving revision 1.550
diff -u -d -r1.549 -r1.550
--- or.h 2 Mar 2005 20:22:10 -0000 1.549
+++ or.h 2 Mar 2005 21:02:11 -0000 1.550
@@ -1319,7 +1319,7 @@
void addressmap_register(const char *address, char *new_address, time_t expires);
int client_dns_incr_failures(const char *address);
void client_dns_set_addressmap(const char *address, uint32_t val, const char *exitname);
-char *client_dns_get_unmapped_address(int type);
+char *addressmap_register_virtual_address(int type, char *new_address);
void parse_socks_policy(void);
void free_socks_policy(void);
More information about the tor-commits
mailing list