|
@@ -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;
|
|
|
}
|
|
|
|