diff options
author | Nick Mathewson <nickm@torproject.org> | 2013-06-13 21:59:27 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2013-06-13 21:59:27 -0400 |
commit | 483385d2bdd391db2ecbb775935554558dba7b56 (patch) | |
tree | 107a61e3c46bd910320549649095b5d87f39a331 /src/or/microdesc.c | |
parent | 73ca1cf8b7502909108d5359b77c1c527aa3d272 (diff) | |
parent | 72f775e18416300bd230f5784dc779db6138537b (diff) | |
download | tor-483385d2bdd391db2ecbb775935554558dba7b56.tar.gz tor-483385d2bdd391db2ecbb775935554558dba7b56.zip |
Merge remote-tracking branch 'origin/maint-0.2.4'
Diffstat (limited to 'src/or/microdesc.c')
-rw-r--r-- | src/or/microdesc.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/src/or/microdesc.c b/src/or/microdesc.c index 6416e8d02d..8c763c6729 100644 --- a/src/or/microdesc.c +++ b/src/or/microdesc.c @@ -74,7 +74,7 @@ static ssize_t dump_microdescriptor(int fd, microdesc_t *md, size_t *annotation_len_out) { ssize_t r = 0; - size_t written; + ssize_t written; if (md->body == NULL) { *annotation_len_out = 0; return 0; @@ -99,10 +99,10 @@ dump_microdescriptor(int fd, microdesc_t *md, size_t *annotation_len_out) md->off = tor_fd_getpos(fd); written = write_all(fd, md->body, md->bodylen, 0); - if (written != md->bodylen) { + if (written != (ssize_t)md->bodylen) { log_warn(LD_DIR, - "Couldn't dump microdescriptor (wrote %lu out of %lu): %s", - (unsigned long)written, (unsigned long)md->bodylen, + "Couldn't dump microdescriptor (wrote %ld out of %lu): %s", + (long)written, (unsigned long)md->bodylen, strerror(errno)); return -1; } @@ -456,8 +456,15 @@ microdesc_cache_rebuild(microdesc_cache_t *cache, int force) size = dump_microdescriptor(fd, md, &annotation_len); if (size < 0) { - /* XXX handle errors from dump_microdescriptor() */ - /* log? return -1? die? coredump the universe? */ + if (md->saved_location != SAVED_IN_CACHE) + tor_free(md->body); + md->saved_location = SAVED_NOWHERE; + md->off = 0; + md->bodylen = 0; + md->no_save = 1; + + /* rewind, in case it was a partial write. */ + tor_fd_setpos(fd, off); continue; } tor_assert(((size_t)size) == annotation_len + md->bodylen); |