summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorTomas Mraz <tm@t8m.info>2006-08-09 19:04:59 +0000
committerTomas Mraz <tm@t8m.info>2006-08-09 19:04:59 +0000
commitb242762dbe2f3acc1d60a6c1f1363af4d471ad84 (patch)
tree71c7e3d5bbda8707be6ec247c9ffced598503952 /modules
parent9fe629581bf126af81233706e71bec60decee79c (diff)
Relevant BUGIDs:
Purpose of commit: bugfix Commit summary: --------------- 2006-08-09 David Howells <dhowells@redhat.com> * modules/pam_keyinit/pam_keyinit.c (kill_keyrings): Set real uid to user's before revoking. (pam_sm_open_session): Remember the uid.
Diffstat (limited to 'modules')
-rw-r--r--modules/pam_keyinit/pam_keyinit.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/modules/pam_keyinit/pam_keyinit.c b/modules/pam_keyinit/pam_keyinit.c
index 5a43c12a..452b0005 100644
--- a/modules/pam_keyinit/pam_keyinit.c
+++ b/modules/pam_keyinit/pam_keyinit.c
@@ -33,6 +33,8 @@
static int my_session_keyring;
static int session_counter;
static int do_revoke;
+static int revoke_as_uid;
+static int revoke_as_gid;
static int xdebug = 0;
static void debug(pam_handle_t *pamh, const char *fmt, ...)
@@ -124,14 +126,38 @@ static int init_keyrings(pam_handle_t *pamh, int force)
*/
static void kill_keyrings(pam_handle_t *pamh)
{
+ int old_uid, old_gid;
+
/* revoke the session keyring we created earlier */
if (my_session_keyring > 0) {
debug(pamh, "REVOKE %d", my_session_keyring);
+ old_uid = getuid();
+ old_gid = getgid();
+ debug(pamh, "UID:%d [%d] GID:%d [%d]",
+ revoke_as_uid, old_uid, revoke_as_gid, old_gid);
+
+ /* switch to the real UID and GID so that we have permission to
+ * revoke the key */
+ if (revoke_as_uid != old_uid && setreuid(-1, revoke_as_uid) < 0)
+ error(pamh, "Unable to change UID to %d temporarily\n",
+ revoke_as_uid);
+
+ if (revoke_as_gid != old_gid && setregid(-1, revoke_as_gid) < 0)
+ error(pamh, "Unable to change GID to %d temporarily\n",
+ revoke_as_gid);
+
syscall(__NR_keyctl,
KEYCTL_REVOKE,
my_session_keyring);
+ /* return to the orignal UID and GID (probably root) */
+ if (revoke_as_uid != old_uid && setreuid(-1, old_uid) < 0)
+ error(pamh, "Unable to change UID back to %d\n", old_uid);
+
+ if (revoke_as_gid != old_gid && setregid(-1, old_gid) < 0)
+ error(pamh, "Unable to change GID back to %d\n", old_gid);
+
my_session_keyring = 0;
}
}
@@ -177,9 +203,9 @@ int pam_sm_open_session(pam_handle_t *pamh, int flags UNUSED,
return PAM_USER_UNKNOWN;
}
- uid = pw->pw_uid;
+ revoke_as_uid = uid = pw->pw_uid;
old_uid = getuid();
- gid = pw->pw_gid;
+ revoke_as_gid = gid = pw->pw_gid;
old_gid = getgid();
debug(pamh, "UID:%d [%d] GID:%d [%d]", uid, old_uid, gid, old_gid);