diff options
author | Nick Mathewson <nickm@torproject.org> | 2011-05-13 15:40:03 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2011-05-15 20:20:29 -0400 |
commit | 5d147d8527da3c8cff7f5ab5f0d0185d51fff79b (patch) | |
tree | 4ea4c6ffab1b8890d8308221640fbe409a7248f6 /src/common | |
parent | 3b6cbf253494303f612eeb09a6fbb30a7c15c7fa (diff) | |
download | tor-5d147d8527da3c8cff7f5ab5f0d0185d51fff79b.tar tor-5d147d8527da3c8cff7f5ab5f0d0185d51fff79b.tar.gz |
Add a new flag to check_private_dir to make it _not_ change permissions
We'll need this for checking permissions on the directories that hold
control sockets: if somebody says "ControlSocket ~/foo", it would be
pretty rude to do a chmod 700 on their homedir.
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/util.c | 7 | ||||
-rw-r--r-- | src/common/util.h | 1 |
2 files changed, 8 insertions, 0 deletions
diff --git a/src/common/util.c b/src/common/util.c index 3f8187433..d84ed9c00 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -1670,6 +1670,8 @@ file_status(const char *fname) * check&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. */ int check_private_dir(const char *dirname, cpd_check_t check) @@ -1741,6 +1743,11 @@ check_private_dir(const char *dirname, cpd_check_t check) } if (st.st_mode & mask) { unsigned new_mode; + if (check & CPD_CHECK_MODE_ONLY) { + log_warn(LD_FS, "Permissions on directory %s are too permissive.", + dirname); + return -1; + } log_warn(LD_FS, "Fixing permissions on directory %s", dirname); new_mode = st.st_mode; new_mode |= 0700; /* Owner should have rwx */ diff --git a/src/common/util.h b/src/common/util.h index f75953226..f32709acc 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -291,6 +291,7 @@ 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 int check_private_dir(const char *dirname, cpd_check_t check); #define OPEN_FLAGS_REPLACE (O_WRONLY|O_CREAT|O_TRUNC) #define OPEN_FLAGS_APPEND (O_WRONLY|O_CREAT|O_APPEND) |