]> andersk Git - openssh.git/commitdiff
- (bal) Fixed uidswap.c so it should work on non-posix complient systems.
authormouring <mouring>
Thu, 26 Apr 2001 23:03:37 +0000 (23:03 +0000)
committermouring <mouring>
Thu, 26 Apr 2001 23:03:37 +0000 (23:03 +0000)
   patch based on 2.5.2 version by djm.

ChangeLog
uidswap.c

index d3ff9630caa2497f633ea343124379f24350447b..f771bac592225537cb8715c93b805058162e29cd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+20010427
+ - (bal) Fixed uidswap.c so it should work on non-posix complient systems.
+   patch based on 2.5.2 version by djm.
+
 20010425
  - OpenBSD CVS Sync
    - markus@cvs.openbsd.org 2001/04/23 21:57:07
index 39952e2b0fcadaab343d1bf8f126ad099735abfb..2c43877d68f2519f729e8b1bcc5e8a57aa87a777 100644 (file)
--- a/uidswap.c
+++ b/uidswap.c
@@ -26,14 +26,18 @@ RCSID("$OpenBSD: uidswap.c,v 1.16 2001/04/20 16:32:22 markus Exp $");
  * POSIX saved uids or not.
  */
 
+#if defined(_POSIX_SAVED_IDS) && !defined(BROKEN_SAVED_UIDS)
 /* Lets assume that posix saved ids also work with seteuid, even though that
    is not part of the posix specification. */
+#define SAVED_IDS_WORK_WITH_SETEUID
+/* Saved effective uid. */
+static uid_t   saved_euid = 0;
+static gid_t   saved_egid = 0;
+#endif
 
 /* Saved effective uid. */
 static int     privileged = 0;
 static int     temporarily_use_uid_effective = 0;
-static uid_t   saved_euid = 0;
-static gid_t   saved_egid;
 static gid_t   saved_egroups[NGROUPS_MAX], user_groups[NGROUPS_MAX];
 static int     saved_egroupslen = -1, user_groupslen = -1;
 
@@ -45,16 +49,24 @@ void
 temporarily_use_uid(struct passwd *pw)
 {
        /* Save the current euid, and egroups. */
+#ifdef SAVED_IDS_WORK_WITH_SETEUID
        saved_euid = geteuid();
+       saved_egid = getegid();
        debug("temporarily_use_uid: %d/%d (e=%d)",
            pw->pw_uid, pw->pw_gid, saved_euid);
        if (saved_euid != 0) {
                privileged = 0;
                return;
        }
+#else
+       if (geteuid() != 0) {
+               privileged = 0;
+               return;
+       }
+#endif /* SAVED_IDS_WORK_WITH_SETEUID */
+
        privileged = 1;
        temporarily_use_uid_effective = 1;
-       saved_egid = getegid();                                                       
        saved_egroupslen = getgroups(NGROUPS_MAX, saved_egroups);                           
        if (saved_egroupslen < 0)
                fatal("getgroups: %.100s", strerror(errno));
@@ -71,7 +83,14 @@ temporarily_use_uid(struct passwd *pw)
        /* Set the effective uid to the given (unprivileged) uid. */
        if (setgroups(user_groupslen, user_groups) < 0)
                fatal("setgroups: %.100s", strerror(errno));
-       pw->pw_gid = pw->pw_gid;
+#ifndef SAVED_IDS_WORK_WITH_SETEUID
+       /* Propagate the privileged gid to all of our gids. */
+       if (setgid(getegid()) < 0)
+               debug("setgid %u: %.100s", (u_int) getegid(), strerror(errno));
+       /* Propagate the privileged uid to all of our uids. */
+       if (setuid(geteuid()) < 0)
+               debug("setuid %u: %.100s", (u_int) geteuid(), strerror(errno));
+#endif /* SAVED_IDS_WORK_WITH_SETEUID */
        if (setegid(pw->pw_gid) < 0)
                fatal("setegid %u: %.100s", (u_int) pw->pw_gid,
                    strerror(errno));
@@ -92,13 +111,27 @@ restore_uid(void)
                return;
        if (!temporarily_use_uid_effective)
                fatal("restore_uid: temporarily_use_uid not effective");
+
+#ifdef SAVED_IDS_WORK_WITH_SETEUID
        /* Set the effective uid back to the saved privileged uid. */
        if (seteuid(saved_euid) < 0)
-               fatal("seteuid %u: %.100s", (u_int) saved_euid, strerror(errno));
+               fatal("seteuid %u: %.100s", (u_int) saved_euid, 
+                   strerror(errno));
+       if (setegid(saved_egid) < 0)
+               fatal("setegid %u: %.100s", (u_int) saved_egid, 
+                   strerror(errno));
+#else /* SAVED_IDS_WORK_WITH_SETEUID */
+       /*
+        * We are unable to restore the real uid to its unprivileged value.
+        * Propagate the real uid (usually more privileged) to effective uid
+        * as well.
+        */
+       setuid(getuid());
+       setgid(getgid());
+#endif /* SAVED_IDS_WORK_WITH_SETEUID */
+
        if (setgroups(saved_egroupslen, saved_egroups) < 0)
                fatal("setgroups: %.100s", strerror(errno));
-       if (setegid(saved_egid) < 0)
-               fatal("setegid %u: %.100s", (u_int) saved_egid, strerror(errno));
        temporarily_use_uid_effective = 0;
 }
 
This page took 0.355777 seconds and 5 git commands to generate.