diff options
author | Nick Mathewson <nickm@torproject.org> | 2014-11-05 14:11:47 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2014-11-05 14:11:47 -0500 |
commit | 4df419a4b19c3b4033b964ec73e82aa988034c81 (patch) | |
tree | c9067b2662db7966201101b7e5afe41d99fdb432 /src/common | |
parent | 3d8cb107323fa5d9cc375087e69a9940b947d0e3 (diff) | |
parent | 3d0d49be230a8720ebdadf668b993f8ba2c5b2ca (diff) | |
download | tor-4df419a4b19c3b4033b964ec73e82aa988034c81.tar.gz tor-4df419a4b19c3b4033b964ec73e82aa988034c81.zip |
Merge remote-tracking branch 'meejah/ticket-11291-extra-utests'
Conflicts:
src/or/config.c
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/util.c | 27 | ||||
-rw-r--r-- | src/common/util.h | 4 |
2 files changed, 23 insertions, 8 deletions
diff --git a/src/common/util.c b/src/common/util.c index 1359776b21..b616d1f389 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -1995,8 +1995,12 @@ file_status(const char *fname) * <b>check</b>&CPD_CHECK, and we think we can create it, return 0. Else * return -1. If CPD_GROUP_OK is set, then it's okay if the directory * is group-readable, but in all cases we create the directory mode 0700. - * If CPD_CHECK_MODE_ONLY is set, then we don't alter the directory permissions - * if they are too permissive: we just return -1. + * If CPD_GROUP_READ is set, existing directory behaves as CPD_GROUP_OK and + * if the directory is created it will use mode 0750 with group read + * permission. Group read privileges also assume execute permission + * as norm for directories. If CPD_CHECK_MODE_ONLY is set, then we don't + * alter the directory permissions if they are too permissive: + * we just return -1. * When effective_user is not NULL, check permissions against the given user * and its primary group. */ @@ -2008,7 +2012,8 @@ check_private_dir(const char *dirname, cpd_check_t check, struct stat st; char *f; #ifndef _WIN32 - int mask; + int mask = 0; + int perm = 0; const struct passwd *pw = NULL; uid_t running_uid; gid_t running_gid; @@ -2033,7 +2038,11 @@ check_private_dir(const char *dirname, cpd_check_t check, #if defined (_WIN32) r = mkdir(dirname); #else - r = mkdir(dirname, 0700); + if (check & CPD_GROUP_READ) { + r = mkdir(dirname, 0750); + } else { + r = mkdir(dirname, 0700); + } #endif if (r) { log_warn(LD_FS, "Error creating directory %s: %s", dirname, @@ -2086,7 +2095,8 @@ check_private_dir(const char *dirname, cpd_check_t check, tor_free(process_ownername); return -1; } - if ((check & CPD_GROUP_OK) && st.st_gid != running_gid) { + if ( (check & (CPD_GROUP_OK|CPD_GROUP_READ)) + && (st.st_gid != running_gid) ) { struct group *gr; char *process_groupname = NULL; gr = getgrgid(running_gid); @@ -2101,7 +2111,7 @@ check_private_dir(const char *dirname, cpd_check_t check, tor_free(process_groupname); return -1; } - if (check & CPD_GROUP_OK) { + if (check & (CPD_GROUP_OK|CPD_GROUP_READ)) { mask = 0027; } else { mask = 0077; @@ -2116,10 +2126,13 @@ check_private_dir(const char *dirname, cpd_check_t check, log_warn(LD_FS, "Fixing permissions on directory %s", dirname); new_mode = st.st_mode; new_mode |= 0700; /* Owner should have rwx */ + if (check & CPD_GROUP_READ) { + new_mode |= 0050; /* Group should have rx */ + } new_mode &= ~mask; /* Clear the other bits that we didn't want set...*/ if (chmod(dirname, new_mode)) { log_warn(LD_FS, "Could not chmod directory %s: %s", dirname, - strerror(errno)); + strerror(errno)); return -1; } else { return 0; diff --git a/src/common/util.h b/src/common/util.h index 9886b2db6a..921dd79da0 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -347,9 +347,11 @@ typedef unsigned int cpd_check_t; #define CPD_CREATE 1 #define CPD_CHECK 2 #define CPD_GROUP_OK 4 -#define CPD_CHECK_MODE_ONLY 8 +#define CPD_GROUP_READ 8 +#define CPD_CHECK_MODE_ONLY 16 int check_private_dir(const char *dirname, cpd_check_t check, const char *effective_user); + #define OPEN_FLAGS_REPLACE (O_WRONLY|O_CREAT|O_TRUNC) #define OPEN_FLAGS_APPEND (O_WRONLY|O_CREAT|O_APPEND) #define OPEN_FLAGS_DONT_REPLACE (O_CREAT|O_EXCL|O_APPEND|O_WRONLY) |