mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-27 22:03:31 +01:00
Merge remote-tracking branch 'origin/maint-0.2.4'
This commit is contained in:
commit
2949849143
5
changes/bug8822
Normal file
5
changes/bug8822
Normal file
@ -0,0 +1,5 @@
|
||||
o Major bugfixes (windows):
|
||||
- Prevent failures on Windows Vista and later when rebuilding the
|
||||
microdescriptor cache. Diagnosed by Robert Ransom. Fixes bug 8822;
|
||||
bugfix on 0.2.4.12-alpha.
|
||||
|
@ -1712,8 +1712,7 @@ getinfo_helper_dir(control_connection_t *control_conn,
|
||||
const node_t *node = node_get_by_hex_id(question+strlen("md/id/"));
|
||||
const microdesc_t *md = NULL;
|
||||
if (node) md = node->md;
|
||||
if (md) {
|
||||
tor_assert(md->body);
|
||||
if (md && md->body) {
|
||||
*answer = tor_strndup(md->body, md->bodylen);
|
||||
}
|
||||
} else if (!strcmpstart(question, "md/name/")) {
|
||||
@ -1723,8 +1722,7 @@ getinfo_helper_dir(control_connection_t *control_conn,
|
||||
/* XXXX duplicated code */
|
||||
const microdesc_t *md = NULL;
|
||||
if (node) md = node->md;
|
||||
if (md) {
|
||||
tor_assert(md->body);
|
||||
if (md && md->body) {
|
||||
*answer = tor_strndup(md->body, md->bodylen);
|
||||
}
|
||||
} else if (!strcmpstart(question, "desc-annotations/id/")) {
|
||||
|
@ -3981,7 +3981,7 @@ connection_dirserv_add_microdescs_to_outbuf(dir_connection_t *conn)
|
||||
char *fp256 = smartlist_pop_last(conn->fingerprint_stack);
|
||||
microdesc_t *md = microdesc_cache_lookup_by_digest256(cache, fp256);
|
||||
tor_free(fp256);
|
||||
if (!md)
|
||||
if (!md || !md->body)
|
||||
continue;
|
||||
if (conn->zlib_state) {
|
||||
/* XXXX024 This 'last' business should actually happen on the last
|
||||
|
@ -75,6 +75,10 @@ dump_microdescriptor(int fd, microdesc_t *md, size_t *annotation_len_out)
|
||||
{
|
||||
ssize_t r = 0;
|
||||
size_t written;
|
||||
if (md->body == NULL) {
|
||||
*annotation_len_out = 0;
|
||||
return 0;
|
||||
}
|
||||
/* XXXX drops unknown annotations. */
|
||||
if (md->last_listed) {
|
||||
char buf[ISO_TIME_LEN+1];
|
||||
@ -447,7 +451,7 @@ microdesc_cache_rebuild(microdesc_cache_t *cache, int force)
|
||||
HT_FOREACH(mdp, microdesc_map, &cache->map) {
|
||||
microdesc_t *md = *mdp;
|
||||
size_t annotation_len;
|
||||
if (md->no_save)
|
||||
if (md->no_save || !md->body)
|
||||
continue;
|
||||
|
||||
size = dump_microdescriptor(fd, md, &annotation_len);
|
||||
@ -474,15 +478,29 @@ microdesc_cache_rebuild(microdesc_cache_t *cache, int force)
|
||||
smartlist_add(wrote, md);
|
||||
}
|
||||
|
||||
/* We must do this unmap _before_ we call finish_writing_to_file(), or
|
||||
* windows will not actually replace the file. */
|
||||
if (cache->cache_content)
|
||||
tor_munmap_file(cache->cache_content);
|
||||
|
||||
if (finish_writing_to_file(open_file) < 0) {
|
||||
log_warn(LD_DIR, "Error rebuilding microdescriptor cache: %s",
|
||||
strerror(errno));
|
||||
/* Okay. Let's prevent from making things worse elsewhere. */
|
||||
cache->cache_content = NULL;
|
||||
HT_FOREACH(mdp, microdesc_map, &cache->map) {
|
||||
microdesc_t *md = *mdp;
|
||||
if (md->saved_location == SAVED_IN_CACHE) {
|
||||
md->off = 0;
|
||||
md->saved_location = SAVED_NOWHERE;
|
||||
md->body = NULL;
|
||||
md->bodylen = 0;
|
||||
md->no_save = 1;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (cache->cache_content)
|
||||
tor_munmap_file(cache->cache_content);
|
||||
|
||||
cache->cache_content = tor_mmap_file(cache->cache_fname);
|
||||
|
||||
if (!cache->cache_content && smartlist_len(wrote)) {
|
||||
|
Loading…
Reference in New Issue
Block a user