summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2008-11-07 04:34:47 +0000
committerRoger Dingledine <arma@torproject.org>2008-11-07 04:34:47 +0000
commit14773f42a7b7fdc99393a9b703f7790078c8cbe6 (patch)
treead9dd86b004287d640027279ec7b4107c9f9e1de
parent7c657925000286725b0cb080c8b920383e493d0e (diff)
downloadtor-14773f42a7b7fdc99393a9b703f7790078c8cbe6.tar.gz
tor-14773f42a7b7fdc99393a9b703f7790078c8cbe6.zip
now that we drop privs more thoroughly, switch_id() is no longer
idempotent. so now we remember if we've succeeded, and if so we don't even try. svn:r17204
-rw-r--r--src/common/compat.c5
-rw-r--r--src/or/config.c2
2 files changed, 5 insertions, 2 deletions
diff --git a/src/common/compat.c b/src/common/compat.c
index ecbae6ab0b..e8b7ab54a7 100644
--- a/src/common/compat.c
+++ b/src/common/compat.c
@@ -1026,9 +1026,13 @@ switch_id(const char *user)
struct passwd *pw = NULL;
uid_t old_uid;
gid_t old_gid;
+ static int have_already_switched_id = 0;
tor_assert(user);
+ if (have_already_switched_id)
+ return 0;
+
/* Log the initial credential state */
if (log_credential_status())
return -1;
@@ -1117,6 +1121,7 @@ switch_id(const char *user)
return -1;
}
+ have_already_switched_id = 1; /* mark success so we never try again */
return 0;
#else
diff --git a/src/or/config.c b/src/or/config.c
index 66ee6cd52b..397d77b7d9 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -1084,8 +1084,6 @@ options_act_reversible(or_options_t *old_options, char **msg)
/* Setuid/setgid as appropriate */
if (options->User) {
- /* XXXX021 We should only do this the first time through, not on
- * every setconf. */
if (switch_id(options->User) != 0) {
/* No need to roll back, since you can't change the value. */
*msg = tor_strdup("Problem with User value. See logs for details.");