summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJérémy Bobbio <lunar@debian.org>2011-09-07 18:51:24 +0200
committerNick Mathewson <nickm@torproject.org>2011-09-07 15:49:01 -0400
commit58a0afe30f390988b142b0497d2e78e66c3caf45 (patch)
tree6def50c386ff2de0677b5b3b4113926499fa74bb
parent5c53a0f867cd3628e37ccffa30b3a534a8f0c74a (diff)
downloadtor-58a0afe30f390988b142b0497d2e78e66c3caf45.tar.gz
tor-58a0afe30f390988b142b0497d2e78e66c3caf45.zip
chown() sockets when User option is set
Fixes bug 3421
-rw-r--r--changes/bug34216
-rw-r--r--src/or/connection.c24
2 files changed, 28 insertions, 2 deletions
diff --git a/changes/bug3421 b/changes/bug3421
new file mode 100644
index 0000000000..8a4072987f
--- /dev/null
+++ b/changes/bug3421
@@ -0,0 +1,6 @@
+ o Minor features:
+ - When starting as root and then changing our UID via the User
+ control option, if we are running with ControlSocket, make sure
+ that the ControlSocket is owned by the same account that Tor will
+ run under. Implements ticket 3421; fix by Jérémy Bobbio.
+
diff --git a/src/or/connection.c b/src/or/connection.c
index 97989c07f5..deb6d2c3ff 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -40,6 +40,10 @@
#include <event2/event.h>
#endif
+#ifdef HAVE_PWD_H
+#include <pwd.h>
+#endif
+
static connection_t *connection_create_listener(
const struct sockaddr *listensockaddr,
socklen_t listensocklen, int type,
@@ -859,6 +863,10 @@ connection_create_listener(const struct sockaddr *listensockaddr,
listener_connection_t *lis_conn;
connection_t *conn;
tor_socket_t s; /* the socket we're going to make */
+ or_options_t const *options = get_options();
+#if defined(HAVE_PWD_H) && defined(HAVE_SYS_UN_H)
+ struct passwd *pw = NULL;
+#endif
uint16_t usePort = 0, gotPort = 0;
int start_reading = 0;
static int global_next_session_group = SESSION_GROUP_FIRST_AUTO;
@@ -931,7 +939,7 @@ connection_create_listener(const struct sockaddr *listensockaddr,
* and listeners at the same time */
tor_assert(type == CONN_TYPE_CONTROL_LISTENER);
- if (check_location_for_unix_socket(get_options(), address) < 0)
+ if (check_location_for_unix_socket(options, address) < 0)
goto err;
log_notice(LD_NET, "Opening %s on %s",
@@ -955,7 +963,19 @@ connection_create_listener(const struct sockaddr *listensockaddr,
tor_socket_strerror(tor_socket_errno(s)));
goto err;
}
- if (get_options()->ControlSocketsGroupWritable) {
+#ifdef HAVE_PWD_H
+ if (options->User) {
+ pw = getpwnam(options->User);
+ if (pw == NULL) {
+ log_warn(LD_NET,"Unable to chown() %s socket: user %s not found.",
+ address, options->User);
+ } else if (chown(address, pw->pw_uid, pw->pw_gid) < 0) {
+ log_warn(LD_NET,"Unable to chown() %s socket: %s.", address, strerror(errno));
+ goto err;
+ }
+ }
+#endif
+ if (options->ControlSocketsGroupWritable) {
/* We need to use chmod; fchmod doesn't work on sockets on all
* platforms. */
if (chmod(address, 0660) < 0) {