Commit 72f775e1 authored by Nick Mathewson's avatar Nick Mathewson 🤹
Browse files

Merge branch 'bug9047' into maint-0.2.4

parents 25dddf7a 2338681e
Loading
Loading
Loading
Loading

changes/bug9047

0 → 100644
+6 −0
Original line number Diff line number Diff line
  o Minor bugfixes:
    - If for some reason we fail to write a microdescriptor while
      rebuilding the cache, do not let the annotations from that
      microdescriptor linger in the cache file, and do not let the
      microdescriptor stay recorded as present in its old location.
      Fixes bug 9047; bugfix on 0.2.2.6-alpha.
+15 −0
Original line number Diff line number Diff line
@@ -870,6 +870,9 @@ tor_lockfile_unlock(tor_lockfile_t *lockfile)
/** @{ */
/** Some old versions of Unix didn't define constants for these values,
 * and instead expect you to say 0, 1, or 2. */
#ifndef SEEK_SET
#define SEEK_SET 0
#endif
#ifndef SEEK_CUR
#define SEEK_CUR 1
#endif
@@ -900,6 +903,18 @@ tor_fd_seekend(int fd)
#endif
}

/** Move <b>fd</b> to position <b>pos</b> in the file. Return -1 on error, 0
 * on success. */
int
tor_fd_setpos(int fd, off_t pos)
{
#ifdef _WIN32
  return _lseek(fd, pos, SEEK_SET) < 0 ? -1 : 0;
#else
  return lseek(fd, pos, SEEK_SET) < 0 ? -1 : 0;
#endif
}

#undef DEBUG_SOCKET_COUNTING
#ifdef DEBUG_SOCKET_COUNTING
/** A bitarray of all fds that should be passed to tor_socket_close(). Only
+1 −0
Original line number Diff line number Diff line
@@ -411,6 +411,7 @@ tor_lockfile_t *tor_lockfile_lock(const char *filename, int blocking,
void tor_lockfile_unlock(tor_lockfile_t *lockfile);

off_t tor_fd_getpos(int fd);
int tor_fd_setpos(int fd, off_t pos);
int tor_fd_seekend(int fd);

#ifdef _WIN32
+13 −6
Original line number Diff line number Diff line
@@ -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);