51 #define NOUC ((uid_t)(-1))
52 #define NOGC ((gid_t)(-1))
53 #define XSPERR(x) ((x == 0) ? -1 : -x)
56 #if defined(__sgi) && !defined(__GNUG__) && (SGI_REL<62)
58 int seteuid(
int euid);
59 int setegid(
int egid);
67 int seteuid(uid_t euid);
68 int setegid(gid_t egid);
74 #if !defined(HAVE_SETRESUID)
77 if (r !=
NOGC && setgid(r) == -1)
79 return ((e !=
NOGC) ? setegid(e) : 0);
84 if (r !=
NOUC && setuid(r) == -1)
86 return ((e !=
NOUC) ? seteuid(e) : 0);
104 #if (defined(__linux__) || \
105 (defined(__CYGWIN__) && defined(__GNUC__))) && !defined(linux)
108 #if defined(linux) && !defined(HAVE_SETRESUID)
110 int setresgid(gid_t r, gid_t e, gid_t s);
111 int setresuid(uid_t r, uid_t e, uid_t s);
112 int getresgid(gid_t *r, gid_t *e, gid_t *s);
113 int getresuid(uid_t *r, uid_t *e, uid_t *s);
119 bool XrdSysPriv::fDebug = 0;
125 int XrdSysPriv::Restore(
bool saved)
130 #if !defined(WINDOWS)
132 uid_t ruid = 0, euid = 0, suid = 0;
137 uid_t uid = saved ? suid : ruid;
147 if (geteuid() != uid)
152 uid_t rgid = 0, egid = 0, sgid = 0;
157 gid_t gid = saved ? sgid : rgid;
167 if (getegid() != gid)
177 int XrdSysPriv::ChangeTo(uid_t newuid, gid_t newgid)
184 #if !defined(WINDOWS)
186 uid_t oeuid = geteuid();
187 gid_t oegid = getegid();
190 if (oeuid && XrdSysPriv::Restore(0) != 0)
194 if (newgid != oegid) {
201 uid_t rgid = 0, egid = 0, sgid = 0;
211 if (newuid != oeuid) {
218 uid_t ruid = 0, euid = 0, suid = 0;
240 XrdSysPriv::fgMutex.
Lock();
241 #if !defined(WINDOWS)
243 uid_t cruid = 0, ceuid = 0, csuid = 0;
244 if (
getresuid(&cruid, &ceuid, &csuid) != 0) {
245 XrdSysPriv::fgMutex.
UnLock();
250 uid_t crgid = 0, cegid = 0, csgid = 0;
251 if (
getresgid(&crgid, &cegid, &csgid) != 0) {
252 XrdSysPriv::fgMutex.
UnLock();
256 if (ceuid && XrdSysPriv::Restore(0) != 0) {
257 XrdSysPriv::fgMutex.
UnLock();
261 if (newgid != cegid || newgid != crgid) {
264 if (
setresgid(newgid, newgid, newgid) != 0) {
265 XrdSysPriv::fgMutex.
UnLock();
269 uid_t rgid = 0, egid = 0, sgid = 0;
270 if (
getresgid(&rgid, &egid, &sgid) != 0) {
271 XrdSysPriv::fgMutex.
UnLock();
275 if (rgid != newgid || egid != newgid) {
276 XrdSysPriv::fgMutex.
UnLock();
282 if (newuid != ceuid || newuid != cruid) {
285 if (
setresuid(newuid, newuid, newuid) != 0) {
286 XrdSysPriv::fgMutex.
UnLock();
290 uid_t ruid = 0, euid = 0, suid = 0;
291 if (
getresuid(&ruid, &euid, &suid) != 0) {
292 XrdSysPriv::fgMutex.
UnLock();
296 if (ruid != newuid || euid != newuid) {
297 XrdSysPriv::fgMutex.
UnLock();
303 XrdSysPriv::fgMutex.
UnLock();
310 void XrdSysPriv::DumpUGID(
const char *msg)
314 #if !defined(WINDOWS)
315 XrdSysPriv::fgMutex.
Lock();
317 uid_t ruid = 0, euid = 0, suid = 0;
322 uid_t rgid = 0, egid = 0, sgid = 0;
326 std::cout <<
"XrdSysPriv: " << std::endl;
327 std::cout <<
"XrdSysPriv: dump values: " << (msg ? msg :
"") << std::endl;
328 std::cout <<
"XrdSysPriv: " << std::endl;
329 std::cout <<
"XrdSysPriv: real = (" << ruid <<
","<< rgid <<
")" << std::endl;
330 std::cout <<
"XrdSysPriv: effective = (" << euid <<
","<< egid <<
")" << std::endl;
331 std::cout <<
"XrdSysPriv: saved = (" << suid <<
","<< sgid <<
")" << std::endl;
332 std::cout <<
"XrdSysPriv: " << std::endl;
333 XrdSysPriv::fgMutex.
UnLock();
360 #if !defined(WINDOWS)
361 if (usr && strlen(usr) > 0) {
365 Init(pw->pw_uid, pw->pw_gid);
378 XrdSysPriv::Restore();
379 XrdSysPriv::fgMutex.
UnLock();
384 void XrdSysPrivGuard::Init(uid_t uid, gid_t gid)
393 if (XrdSysPriv::fDebug)
394 XrdSysPriv::DumpUGID(
"before Init()");
396 #if !defined(WINDOWS)
397 XrdSysPriv::fgMutex.
Lock();
398 uid_t ruid = 0, euid = 0, suid = 0;
399 gid_t rgid = 0, egid = 0, sgid = 0;
400 if (
getresuid(&ruid, &euid, &suid) == 0 &&
402 if ((euid != uid) || (egid != gid)) {
405 if (XrdSysPriv::ChangeTo(uid, gid) != 0)
419 XrdSysPriv::fgMutex.
UnLock();
422 if (XrdSysPriv::fDebug)
423 XrdSysPriv::DumpUGID(
"after Init()");
static int getresgid(gid_t *r, gid_t *e, gid_t *)
static int setresgid(gid_t r, gid_t e, gid_t)
static int getresuid(uid_t *r, uid_t *e, uid_t *)
static int setresuid(uid_t r, uid_t e, uid_t)
XrdSysPrivGuard(uid_t uid, gid_t gid)
virtual ~XrdSysPrivGuard()
static int ChangePerm(uid_t uid, gid_t gid)