diff options
author | Robert Ancell <robert.ancell@canonical.com> | 2011-09-15 17:29:25 +1000 |
---|---|---|
committer | Robert Ancell <robert.ancell@canonical.com> | 2011-09-15 17:29:25 +1000 |
commit | 316ee7a61f2465a88c6ba547a33064c3be1e6028 (patch) | |
tree | b564218ce445a59459dee0de5da69275e6dfea07 | |
parent | 4c3cd1aeb08e5c62fb88109dbe4f86582ee7cdbf (diff) | |
download | lightdm-git-316ee7a61f2465a88c6ba547a33064c3be1e6028.tar.gz |
Fix privilege dropping logiclightdm-0.9.6
-rw-r--r-- | src/dmrc.c | 9 | ||||
-rw-r--r-- | src/privileges.c | 6 | ||||
-rw-r--r-- | src/xsession.c | 19 |
3 files changed, 23 insertions, 11 deletions
@@ -81,12 +81,17 @@ dmrc_save (GKeyFile *dmrc_file, const gchar *username) /* Update the users .dmrc */ if (user) { + gboolean drop_privileges; + path = g_build_filename (user_get_home_directory (user), ".dmrc", NULL); /* Guard against privilege escalation through symlinks, etc. */ - privileges_drop (user); + drop_privileges = geteuid () == 0; + if (drop_privileges) + privileges_drop (user); g_file_set_contents (path, data, length, NULL); - privileges_reclaim (); + if (drop_privileges) + privileges_reclaim (); g_free (path); } diff --git a/src/privileges.c b/src/privileges.c index 98a615a5..1f87b4f2 100644 --- a/src/privileges.c +++ b/src/privileges.c @@ -17,8 +17,7 @@ void privileges_drop (User *user) { - if (geteuid () != 0 || user == NULL) - return; + g_return_if_fail (user != NULL); g_debug ("Dropping privileges to uid %i", user_get_uid (user)); g_assert (setresgid (user_get_gid (user), user_get_gid (user), -1) == 0); @@ -28,9 +27,6 @@ privileges_drop (User *user) void privileges_reclaim (void) { - if (geteuid () != 0) - return; - g_debug ("Restoring privileges"); g_assert (setresuid (0, 0, -1) == 0); g_assert (setresgid (0, 0, -1) == 0); diff --git a/src/xsession.c b/src/xsession.c index 283a29fe..e8b76b88 100644 --- a/src/xsession.c +++ b/src/xsession.c @@ -89,10 +89,15 @@ xsession_start (Session *session) xsession->priv->authority_file = g_file_new_for_path (path); if (xsession->priv->authority_in_system_dir) { + gboolean drop_privileges; + g_debug ("Adding session authority to %s", path); - privileges_drop (session_get_user (SESSION (session))); + drop_privileges = geteuid () == 0; + if (drop_privileges) + privileges_drop (session_get_user (SESSION (session))); write_authority (xsession); - privileges_reclaim (); + if (drop_privileges) + privileges_reclaim (); } else g_debug ("Adding session authority to %s (written in session process)", path); @@ -109,10 +114,16 @@ xsession_remove_authority (XSession *session) { if (session->priv->authority_file) { + gboolean drop_privileges; + g_debug ("Removing session authority from %s", g_file_get_path (session->priv->authority_file)); - privileges_drop (session_get_user (SESSION (session))); + + drop_privileges = geteuid () == 0; + if (drop_privileges) + privileges_drop (session_get_user (SESSION (session))); xauth_write (session->priv->authority, XAUTH_WRITE_MODE_REMOVE, session->priv->authority_file, NULL); - privileges_reclaim (); + if (drop_privileges) + privileges_reclaim (); g_object_unref (session->priv->authority_file); session->priv->authority_file = NULL; } |