diff options
-rw-r--r-- | src/or/connection_edge.c | 2 | ||||
-rw-r--r-- | src/or/directory.c | 2 | ||||
-rw-r--r-- | src/or/or.h | 10 | ||||
-rw-r--r-- | src/or/rendclient.c | 4 | ||||
-rw-r--r-- | src/or/rendcommon.c | 31 |
5 files changed, 31 insertions, 18 deletions
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index 1f74c11dd..36b57c064 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -734,7 +734,7 @@ static int connection_ap_handshake_process_socks(connection_t *conn) { strcpy(conn->rend_query, socks->address); /* this strcpy is safe -RD */ log_fn(LOG_INFO,"Got a hidden service request for ID '%s'", conn->rend_query); /* see if we already have it cached */ - if (rend_cache_lookup(conn->rend_query, &descp, &desc_len) == 1) { + if (rend_cache_lookup_desc(conn->rend_query, &descp, &desc_len) == 1) { conn->state = AP_CONN_STATE_CIRCUIT_WAIT; return connection_ap_handshake_attach_circuit(conn); } else { diff --git a/src/or/directory.c b/src/or/directory.c index dacf47935..1af6bf59d 100644 --- a/src/or/directory.c +++ b/src/or/directory.c @@ -369,7 +369,7 @@ static int directory_handle_command_get(connection_t *conn, const char *descp; int desc_len; - switch(rend_cache_lookup(url+strlen(rend_fetch_url), &descp, &desc_len)) { + switch(rend_cache_lookup_desc(url+strlen(rend_fetch_url), &descp, &desc_len)) { case 1: /* valid */ snprintf(tmp, sizeof(tmp), "HTTP/1.0 200 OK\r\nContent-Length: %d\r\n\r\n", desc_len); /* can't include descp here, because it's got nuls */ diff --git a/src/or/or.h b/src/or/or.h index ed1f3b494..c99c9f492 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -1078,10 +1078,18 @@ int rend_encode_service_descriptor(rend_service_descriptor_t *desc, rend_service_descriptor_t *rend_parse_service_descriptor(const char *str, int len); int rend_get_service_id(crypto_pk_env_t *pk, char *out); +typedef struct rend_cache_entry_t { + int len; /* Length of desc */ + time_t received; /* When did we get the descriptor? */ + char *desc; /* Service descriptor */ + rend_service_descriptor_t *parsed; /* Parsed value of 'desc' */ +} rend_cache_entry_t; + void rend_cache_init(void); void rend_cache_clean(void); int rend_valid_service_id(char *query); -int rend_cache_lookup(char *query, const char **desc, int *desc_len); +int rend_cache_lookup_desc(char *query, const char **desc, int *desc_len); +int rend_cache_lookup_entry(char *query, rend_cache_entry_t **entry_out); int rend_cache_store(char *desc, int desc_len); /********************************* rendservice.c ***************************/ diff --git a/src/or/rendclient.c b/src/or/rendclient.c index f3a98fb1f..fead31ccd 100644 --- a/src/or/rendclient.c +++ b/src/or/rendclient.c @@ -57,7 +57,7 @@ rend_client_send_introduction(circuit_t *introcirc, circuit_t *rendcirc) { assert(rendcirc->purpose == CIRCUIT_PURPOSE_C_REND_READY); assert(!rend_cmp_service_ids(introcirc->rend_query, rendcirc->rend_query)); - if(rend_cache_lookup(introcirc->rend_query, &descp, &desc_len) < 1) { + if(rend_cache_lookup_desc(introcirc->rend_query, &descp, &desc_len) < 1) { log_fn(LOG_WARN,"query '%s' didn't have valid rend desc in cache. Failing.", introcirc->rend_query); goto err; @@ -281,7 +281,7 @@ char *rend_client_get_random_intro(char *query) { char *choice; char *nickname; - if(rend_cache_lookup(query, &descp, &desc_len) < 1) { + if(rend_cache_lookup_desc(query, &descp, &desc_len) < 1) { log_fn(LOG_WARN,"query '%s' didn't have valid rend desc in cache. Failing.", query); return NULL; } diff --git a/src/or/rendcommon.c b/src/or/rendcommon.c index fd8fb8357..469f09630 100644 --- a/src/or/rendcommon.c +++ b/src/or/rendcommon.c @@ -143,12 +143,6 @@ int rend_get_service_id(crypto_pk_env_t *pk, char *out) #define REND_CACHE_MAX_AGE 24*60*60 #define REND_CACHE_MAX_SKEW 60*60 -typedef struct rend_cache_entry_t { - int len; /* Length of desc */ - char *desc; /* Service descriptor */ - rend_service_descriptor_t *parsed; /* Parsed value of 'desc' */ -} rend_cache_entry_t; - static strmap_t *rend_cache = NULL; /* Initializes the service descriptor cache. @@ -193,26 +187,35 @@ int rend_valid_service_id(char *query) { return 1; } +int rend_cache_lookup_entry(char *query, rend_cache_entry_t **e) +{ + assert(rend_cache); + if (!rend_valid_service_id(query)) + return -1; + *e = strmap_get_lc(rend_cache, query); + if (!*e) + return 0; + return 1; +} + /* 'query' is a base-32'ed service id. If it's malformed, return -1. * Else look it up. * If it is found, point *desc to it, and write its length into * *desc_len, and return 1. * If it is not found, return 0. */ -int rend_cache_lookup(char *query, const char **desc, int *desc_len) +int rend_cache_lookup_desc(char *query, const char **desc, int *desc_len) { rend_cache_entry_t *e; - assert(rend_cache); - if (!rend_valid_service_id(query)) - return -1; - e = (rend_cache_entry_t*) strmap_get_lc(rend_cache, query); - if (!e) - return 0; + int r; + r = rend_cache_lookup_entry(query,&e); + if (r <= 0) return r; *desc = e->desc; *desc_len = e->len; return 1; } + /* Calculate desc's service id, and store it. * Return -1 if it's malformed or otherwise rejected, else return 0. */ @@ -252,6 +255,7 @@ int rend_cache_store(char *desc, int desc_len) } if (e && e->len == desc_len && !memcmp(desc,e->desc,desc_len)) { log_fn(LOG_WARN,"We already have this service descriptor"); + e->received = time(NULL); rend_service_descriptor_free(parsed); return -1; } @@ -262,6 +266,7 @@ int rend_cache_store(char *desc, int desc_len) rend_service_descriptor_free(e->parsed); tor_free(e->desc); } + e->received = time(NULL); e->parsed = parsed; e->len = desc_len; e->desc = tor_malloc(desc_len); |