diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-02-10 16:47:05 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-02-28 23:23:22 +0800 |
commit | 1e674b2f6ee96f7ae21bb8dc437249e404323169 (patch) | |
tree | a21af74409a345d57824f009cf84e9b764d234d4 /libpam/pam_modutil_priv.c | |
parent | cb448e6474f53e4e40bfb594597156dc6256605c (diff) | |
download | pam-1e674b2f6ee96f7ae21bb8dc437249e404323169.tar.gz pam-1e674b2f6ee96f7ae21bb8dc437249e404323169.tar.bz2 pam-1e674b2f6ee96f7ae21bb8dc437249e404323169.zip |
(GNU/Hurd) port Linux-specific api.
Diffstat (limited to 'libpam/pam_modutil_priv.c')
-rw-r--r-- | libpam/pam_modutil_priv.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/libpam/pam_modutil_priv.c b/libpam/pam_modutil_priv.c index a463e06a..cf0ce3ce 100644 --- a/libpam/pam_modutil_priv.c +++ b/libpam/pam_modutil_priv.c @@ -14,7 +14,9 @@ #include <syslog.h> #include <pwd.h> #include <grp.h> +#ifdef HAVE_SYS_FSUID_H #include <sys/fsuid.h> +#endif /* HAVE_SYS_FSUID_H */ /* * Two setfsuid() calls in a row are necessary to check @@ -22,17 +24,32 @@ */ static int change_uid(uid_t uid, uid_t *save) { +#ifdef HAVE_SYS_FSUID_H uid_t tmp = setfsuid(uid); if (save) *save = tmp; return (uid_t) setfsuid(uid) == uid ? 0 : -1; +#else + uid_t euid = geteuid(); + if (save) + *save = euid; + return setresuid(-1, uid, euid); +#endif } + static int change_gid(gid_t gid, gid_t *save) { +#ifdef HAVE_SYS_FSUID_H gid_t tmp = setfsgid(gid); if (save) *save = tmp; return (gid_t) setfsgid(gid) == gid ? 0 : -1; +#else + uid_t egid = getegid(); + if (save) + *save = egid; + return setresgid(-1, gid, egid); +#endif } static int cleanup(struct pam_modutil_privs *p) |