void CHS::GetRoot(void) { #define FUNC "CHS::GetRoot" log3(": IN: uid = %d, euid = %d, gid = %d, egid = %d", getuid(), geteuid(), getgid(), getegid()); if(seteuid(0)) { log3s(FUNC ": seteuid(%d)", 0); throw ... } log3(": IN1: uid = %d, euid = %d, gid = %d, egid = %d", getuid(), geteuid(), getgid(), getegid()); if(setgid(0)) { log3s(FUNC ": setgid(%d)", 0); throw ... } log3(FH_LOG_DEBUG, FUNC ": OUT: uid = %d, euid = %d, gid = %d, egid = %d", getuid(), geteuid(), getgid(), getegid()); #undef FUNC }
IN: uid = 0, euid = 500, gid = 500, egid = 500 IN1: uid = 0, euid = 0, gid = 500, egid = 500 OUT: uid = 0, euid = 0, gid = 0, egid = 0
IN: uid = 0, euid = 500, gid = 500, egid = 500 IN1: uid = 0, euid = 0, gid = 500, egid = 500 OUT: uid = 0, euid = 0, gid = 0, egid = 0
IN: uid = 0, euid = 502, gid = 500, egid = 500 IN1: uid = 0, euid = 0, gid = 500, egid = 500 OUT: uid = 0, euid = 0, gid = 0, egid = 0
IN: uid = 0, euid = 502, gid = 500, egid = 500 IN1: uid = 0, euid = 0, gid = 500, egid = 500 setgid(0), error = Operation not permitted
пробовал вместо setgid() делать setegid(), setregid - тоже самое, если пропускал этот кусок с ошибкой, то дальше шел вызов chmod() - operation not permitted, то есть получалось, что хотя geteuid() == 0, реально он не рутовый процесс в этот момент получился
функция эта и противоположная вызывается очень часто
проверял на redhat 7.1, 2.4.2-2 и на redhat 9, 2.4.20-8
на freebsd 4.8, 5.0 все работает стабильно ...
кто-нить знает как исправить?