aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2007-05-20 05:15:53 +0000
committerNick Mathewson <nickm@torproject.org>2007-05-20 05:15:53 +0000
commit0b661f65759408af19fbd30587deffc0bc3163d8 (patch)
tree39bd4db1cb2f6f71eb80ceb870211a2d5d90c31e /src
parent6d46ece6acfa8724008d6eb617c44244457d06b4 (diff)
downloadtor-0b661f65759408af19fbd30587deffc0bc3163d8.tar
tor-0b661f65759408af19fbd30587deffc0bc3163d8.tar.gz
r12818@catbus: nickm | 2007-05-20 01:15:50 -0400
Look for extrainfo bodies in the extrainfo mmap, not in the descriptor mmap. Duh. Should fix bug 429. svn:r10226
Diffstat (limited to 'src')
-rw-r--r--src/or/or.h4
-rw-r--r--src/or/routerlist.c30
-rw-r--r--src/or/routerparse.c1
3 files changed, 26 insertions, 9 deletions
diff --git a/src/or/or.h b/src/or/or.h
index 1f0da3265..caad528a0 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -1075,12 +1075,14 @@ typedef struct signed_descriptor_t {
/** DOCDOC; routerinfo_t only: for the corresponding extrainfo. */
download_status_t ei_dl_status;
/** Where is the descriptor saved? */
- saved_location_t saved_location;
+ saved_location_t saved_location ;
/** If saved_location is SAVED_IN_CACHE or SAVED_IN_JOURNAL, the offset of
* this descriptor in the corresponding file. */
off_t saved_offset;
/* DOCDOC */
unsigned int do_not_cache : 1;
+ /* DOCDOC */
+ unsigned int is_extrainfo : 1;
} signed_descriptor_t;
/** Information about another onion router in the network. */
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index 5a6d32e48..2aab834df 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -294,12 +294,13 @@ router_rebuild_store(int force, int extrainfo)
extrainfo ? &routerlist->mmap_extrainfo : &routerlist->mmap_descriptors;
routerlist_check_bug_417();
+ routerlist_assert_ok(routerlist);
/* Don't save deadweight. */
routerlist_remove_old_routers();
log_info(LD_DIR, "Rebuilding %s cache",
- extrainfo ? "Extra-info" : "router descriptor");
+ extrainfo ? "extra-info" : "router descriptor");
options = get_options();
fname_len = strlen(options->DataDirectory)+32;
@@ -371,6 +372,8 @@ router_rebuild_store(int force, int extrainfo)
if (! *mmap_ptr)
log_warn(LD_FS, "Unable to mmap new descriptor file at '%s'.",fname);
+ log_info(LD_DIR, "Reconstructing pointers into cache");
+
offset = 0;
SMARTLIST_FOREACH(signed_descriptors, signed_descriptor_t *, sd,
{
@@ -1553,17 +1556,28 @@ extrainfo_get_by_descriptor_digest(const char *digest)
const char *
signed_descriptor_get_body(signed_descriptor_t *desc)
{
- const char *r;
+ const char *r = NULL;
size_t len = desc->signed_descriptor_len;
+ tor_mmap_t *mmap;
tor_assert(len > 32);
- if (desc->saved_location == SAVED_IN_CACHE && routerlist &&
- routerlist->mmap_descriptors) {
- tor_assert(desc->saved_offset + len <= routerlist->mmap_descriptors->size);
- r = routerlist->mmap_descriptors->data + desc->saved_offset;
- } else {
- r = desc->signed_descriptor_body;
+ if (desc->saved_location == SAVED_IN_CACHE && routerlist) {
+ if (desc->is_extrainfo)
+ mmap = routerlist->mmap_extrainfo;
+ else
+ mmap = routerlist->mmap_descriptors;
+ if (mmap) {
+ tor_assert(desc->saved_offset + len <= mmap->size);
+ r = routerlist->mmap_descriptors->data + desc->saved_offset;
+ }
}
+ if (!r) /* no mmap, or not in cache. */
+ r = desc->signed_descriptor_body;
+
tor_assert(r);
+ if (memcmp("router ", r, 7) && memcmp("extra-info ", r, 11)) {
+ log_err(LD_DIR, "descriptor at %p begins with unexpected string %s",
+ desc, tor_strndup(r, 64));
+ }
tor_assert(!memcmp("router ", r, 7) || !memcmp("extra-info ", r, 11));
#if 0
tor_assert(!memcmp("\n-----END SIGNATURE-----\n",
diff --git a/src/or/routerparse.c b/src/or/routerparse.c
index 1dff041f0..67de895e3 100644
--- a/src/or/routerparse.c
+++ b/src/or/routerparse.c
@@ -1195,6 +1195,7 @@ extrainfo_parse_entry_from_string(const char *s, const char *end,
}
extrainfo = tor_malloc_zero(sizeof(extrainfo_t));
+ extrainfo->cache_info.is_extrainfo = 1;
if (cache_copy)
extrainfo->cache_info.signed_descriptor_body = tor_strndup(s, end-s);
extrainfo->cache_info.signed_descriptor_len = end-s;