static struct {
bool initialised;
bool enabled;
+ uid_t myuid;
uid_t euid;
+ uid_t mygid;
gid_t egid;
gid_t *groups;
} uwrap;
if (getenv("UID_WRAPPER")) {
uwrap.enabled = true;
/* put us in one group */
- uwrap.euid = geteuid();
- uwrap.egid = getegid();
+ uwrap.myuid = uwrap.euid = geteuid();
+ uwrap.mygid = uwrap.egid = getegid();
uwrap.groups = talloc_array(NULL, gid_t, 1);
uwrap.groups[0] = 0;
}
return seteuid(euid);
}
/* assume for now that the ruid stays as root */
- uwrap.euid = euid;
+ if (euid == 0) {
+ uwrap.euid = uwrap.myuid;
+ } else {
+ uwrap.euid = euid;
+ }
return 0;
}
return setreuid(ruid, euid);
}
/* assume for now that the ruid stays as root */
- uwrap.euid = euid;
+ if (euid == 0) {
+ uwrap.euid = uwrap.myuid;
+ } else {
+ uwrap.euid = euid;
+ }
return 0;
}
return setresuid(ruid, euid, suid);
}
/* assume for now that the ruid stays as root */
- uwrap.euid = euid;
+ if (euid == 0) {
+ uwrap.euid = uwrap.myuid;
+ } else {
+ uwrap.euid = euid;
+ }
return 0;
}
return setegid(egid);
}
/* assume for now that the ruid stays as root */
- uwrap.egid = egid;
+ if (egid == 0) {
+ uwrap.egid = uwrap.mygid;
+ } else {
+ uwrap.egid = egid;
+ }
return 0;
}
return setregid(rgid, egid);
}
/* assume for now that the ruid stays as root */
- uwrap.egid = egid;
+ if (egid == 0) {
+ uwrap.egid = uwrap.mygid;
+ } else {
+ uwrap.egid = egid;
+ }
return 0;
}