static uid_t initial_uid;
static gid_t initial_gid;
-static BOOL sec_initialised;
-
/****************************************************************************
remember what uid we got started as - this allows us to run correctly
as non-root while catching trapdoor systems
{
initial_uid = geteuid();
initial_gid = getegid();
-
- sec_initialised = True;
}
/****************************************************************************
****************************************************************************/
uid_t sec_initial_uid(void)
{
- if (!sec_initialised)
- smb_panic("sec_initial_uid() called before sec_init()\n");
-
return initial_uid;
}
****************************************************************************/
gid_t sec_initial_gid(void)
{
- if (!sec_initialised)
- smb_panic("sec_initial_gid() called before sec_init()\n");
-
return initial_gid;
}
****************************************************************************/
BOOL non_root_mode(void)
{
- if (!sec_initialised)
- smb_panic("non_root_mode() called before sec_init()\n");
-
return (initial_uid != (uid_t)0);
}
/****************************************************************************
- Set *only* the effective uid.
- we want to end up with ruid==0 and euid==uid
+ Set effective uid, and possibly the real uid too.
+ We want to end up with either:
+
+ ruid==uid and euid==uid
+
+ or
+
+ ruid==0 and euid==uid
+
+ depending on what the local OS will allow us to regain root from.
****************************************************************************/
void set_effective_uid(uid_t uid)
{
#if USE_SETRESUID
- setresuid(-1,uid,-1);
+ /* Set the effective as well as the real uid. */
+ setresuid(uid,uid,-1);
#endif
#if USE_SETREUID
}
static uid_t saved_euid, saved_ruid;
+static gid_t saved_egid, saved_rgid;
/****************************************************************************
save the real and effective uid for later restoration. Used by the quotas
assert_uid(saved_ruid, saved_euid);
}
+
+/****************************************************************************
+ save the real and effective gid for later restoration. Used by the
+ getgroups code
+****************************************************************************/
+void save_re_gid(void)
+{
+ saved_rgid = getgid();
+ saved_egid = getegid();
+}
+
+/****************************************************************************
+ and restore them!
+****************************************************************************/
+void restore_re_gid(void)
+{
+#if USE_SETRESUID
+ setresgid(saved_rgid, saved_egid, -1);
+#elif USE_SETREUID
+ setregid(saved_rgid, -1);
+ setregid(-1,saved_egid);
+#elif USE_SETUIDX
+ setgidx(ID_REAL, saved_rgid);
+ setgidx(ID_EFFECTIVE, saved_egid);
+#else
+ set_effective_gid(saved_egid);
+ if (getgid() != saved_rgid)
+ setgid(saved_rgid);
+ set_effective_gid(saved_egid);
+#endif
+
+ assert_gid(saved_rgid, saved_egid);
+}
+
+
/****************************************************************************
set the real AND effective uid to the current effective uid in a way that
allows root to be regained.
#endif
/****************************************************************************
-Check if we are setuid root. Used in libsmb and smbpasswd parinoia checks.
+Check if we are setuid root. Used in libsmb and smbpasswd paranoia checks.
****************************************************************************/
BOOL is_setuid_root(void)
{