ARGSUSED */
| 1017 | #endif |
| 1018 | /* ARGSUSED */ |
| 1019 | int |
| 1020 | sys_setresuid(struct thread *td, struct setresuid_args *uap) |
| 1021 | { |
| 1022 | struct proc *p = td->td_proc; |
| 1023 | struct ucred *newcred, *oldcred; |
| 1024 | uid_t euid, ruid, suid; |
| 1025 | struct uidinfo *euip, *ruip; |
| 1026 | int error; |
| 1027 | |
| 1028 | euid = uap->euid; |
| 1029 | ruid = uap->ruid; |
| 1030 | suid = uap->suid; |
| 1031 | AUDIT_ARG_EUID(euid); |
| 1032 | AUDIT_ARG_RUID(ruid); |
| 1033 | AUDIT_ARG_SUID(suid); |
| 1034 | newcred = crget(); |
| 1035 | euip = uifind(euid); |
| 1036 | ruip = uifind(ruid); |
| 1037 | PROC_LOCK(p); |
| 1038 | oldcred = crcopysafe(p, newcred); |
| 1039 | |
| 1040 | #ifdef MAC |
| 1041 | error = mac_cred_check_setresuid(oldcred, ruid, euid, suid); |
| 1042 | if (error) |
| 1043 | goto fail; |
| 1044 | #endif |
| 1045 | |
| 1046 | if (((ruid != (uid_t)-1 && ruid != oldcred->cr_ruid && |
| 1047 | ruid != oldcred->cr_svuid && |
| 1048 | ruid != oldcred->cr_uid) || |
| 1049 | (euid != (uid_t)-1 && euid != oldcred->cr_ruid && |
| 1050 | euid != oldcred->cr_svuid && |
| 1051 | euid != oldcred->cr_uid) || |
| 1052 | (suid != (uid_t)-1 && suid != oldcred->cr_ruid && |
| 1053 | suid != oldcred->cr_svuid && |
| 1054 | suid != oldcred->cr_uid)) && |
| 1055 | (error = priv_check_cred(oldcred, PRIV_CRED_SETRESUID)) != 0) |
| 1056 | goto fail; |
| 1057 | |
| 1058 | if (euid != (uid_t)-1 && oldcred->cr_uid != euid) { |
| 1059 | change_euid(newcred, euip); |
| 1060 | setsugid(p); |
| 1061 | } |
| 1062 | if (ruid != (uid_t)-1 && oldcred->cr_ruid != ruid) { |
| 1063 | change_ruid(newcred, ruip); |
| 1064 | setsugid(p); |
| 1065 | } |
| 1066 | if (suid != (uid_t)-1 && oldcred->cr_svuid != suid) { |
| 1067 | change_svuid(newcred, suid); |
| 1068 | setsugid(p); |
| 1069 | } |
| 1070 | proc_set_cred(p, newcred); |
| 1071 | #ifdef RACCT |
| 1072 | racct_proc_ucred_changed(p, oldcred, newcred); |
| 1073 | crhold(newcred); |
| 1074 | #endif |
| 1075 | PROC_UNLOCK(p); |
| 1076 | #ifdef RCTL |
nothing calls this directly
no test coverage detected