Commit 0a276947 authored by Nick Mathewson's avatar Nick Mathewson 🤹
Browse files

Merge branch 'bug18392'

parents 3687526c 7255b112
Loading
Loading
Loading
Loading
+38 −11
Original line number Diff line number Diff line
@@ -2059,15 +2059,14 @@ check_private_dir(const char *dirname, cpd_check_t check,
  int fd;
  int r;
  struct stat st;
  //char *f;

  tor_assert(dirname);

#ifndef _WIN32
  unsigned unwanted_bits = 0;
  const struct passwd *pw = NULL;
  uid_t running_uid;
  gid_t running_gid;
#else
  (void)effective_user;
#endif

  /*
   * Goal is to harden the implementation by removing any
@@ -2078,7 +2077,6 @@ check_private_dir(const char *dirname, cpd_check_t check,
   * Several suggestions taken from:
   * https://developer.apple.com/library/mac/documentation/Security/Conceptual/SecureCodingGuide/Articles/RaceConditions.html
   */
  tor_assert(dirname);

  /* Open directory.
   * O_NOFOLLOW to ensure that it does not follow symbolic links */
@@ -2099,15 +2097,11 @@ check_private_dir(const char *dirname, cpd_check_t check,
    /* Should we create the directory? */
    if (check & CPD_CREATE) {
      log_info(LD_GENERAL, "Creating directory %s", dirname);
#if defined (_WIN32)
      r = mkdir(dirname);
#else
      if (check & CPD_GROUP_READ) {
        r = mkdir(dirname, 0750);
      } else {
        r = mkdir(dirname, 0700);
      }
#endif

      /* check for mkdir() error */
      if (r) {
@@ -2153,7 +2147,6 @@ check_private_dir(const char *dirname, cpd_check_t check,
    return -1;
  }

#ifndef _WIN32
  if (effective_user) {
    /* Look up the user and group information.
     * If we have a problem, bail out. */
@@ -2234,8 +2227,42 @@ check_private_dir(const char *dirname, cpd_check_t check,
      return 0;
    }
  }
#endif
  close(fd);
#else
  /* Win32 case: we can't open() a directory. */
  (void)effective_user;

  char *f = tor_strdup(dirname);
  clean_name_for_stat(f);
  log_debug(LD_FS, "stat()ing %s", f);
  r = stat(sandbox_intern_string(f), &st);
  tor_free(f);
  if (r) {
    if (errno != ENOENT) {
      log_warn(LD_FS, "Directory %s cannot be read: %s", dirname,
               strerror(errno));
      return -1;
    }
    if (check & CPD_CREATE) {
      log_info(LD_GENERAL, "Creating directory %s", dirname);
      r = mkdir(dirname);
      if (r) {
        log_warn(LD_FS, "Error creating directory %s: %s", dirname,
                 strerror(errno));
        return -1;
      }
    } else if (!(check & CPD_CHECK)) {
      log_warn(LD_FS, "Directory %s does not exist.", dirname);
      return -1;
    }
    return 0;
  }
  if (!(st.st_mode & S_IFDIR)) {
    log_warn(LD_FS, "%s is not a directory", dirname);
    return -1;
  }

#endif
  return 0;
}