diff -ru kernel/sys.c.orig kernel/sys.c --- kernel/sys.c.orig Mon Oct 16 22:58:51 2000 +++ kernel/sys.c Mon Mar 12 23:40:26 2001 @@ -449,9 +449,13 @@ extern inline void cap_emulate_setxuid(int old_ruid, int old_euid, int old_suid) { - if ((old_ruid == 0 || old_euid == 0 || old_suid == 0) && - (current->uid != 0 && current->euid != 0 && current->suid != 0) && + if ((!cap_isclear(current->cap_inheritable) || + !cap_isclear(current->cap_permitted) || + !cap_isclear(current->cap_effective)) && + (current->uid != old_ruid && current->euid != old_euid && + current->suid != old_suid) && !current->keep_capabilities) { + cap_clear(current->cap_inheritable); cap_clear(current->cap_permitted); cap_clear(current->cap_effective); }