Lines Matching +full:smp +full:- +full:capable

1 // SPDX-License-Identifier: GPL-2.0
27 #include <linux/posix-timers.h>
83 # define SET_UNALIGN_CTL(a, b) (-EINVAL)
86 # define GET_UNALIGN_CTL(a, b) (-EINVAL)
89 # define SET_FPEMU_CTL(a, b) (-EINVAL)
92 # define GET_FPEMU_CTL(a, b) (-EINVAL)
95 # define SET_FPEXC_CTL(a, b) (-EINVAL)
98 # define GET_FPEXC_CTL(a, b) (-EINVAL)
101 # define GET_ENDIAN(a, b) (-EINVAL)
104 # define SET_ENDIAN(a, b) (-EINVAL)
107 # define GET_TSC_CTL(a) (-EINVAL)
110 # define SET_TSC_CTL(a) (-EINVAL)
113 # define GET_FP_MODE(a) (-EINVAL)
116 # define SET_FP_MODE(a,b) (-EINVAL)
119 # define SVE_SET_VL(a) (-EINVAL)
122 # define SVE_GET_VL() (-EINVAL)
125 # define SME_SET_VL(a) (-EINVAL)
128 # define SME_GET_VL() (-EINVAL)
131 # define PAC_RESET_KEYS(a, b) (-EINVAL)
134 # define PAC_SET_ENABLED_KEYS(a, b, c) (-EINVAL)
137 # define PAC_GET_ENABLED_KEYS(a) (-EINVAL)
140 # define SET_TAGGED_ADDR_CTRL(a) (-EINVAL)
143 # define GET_TAGGED_ADDR_CTRL() (-EINVAL)
146 # define RISCV_V_SET_CONTROL(a) (-EINVAL)
149 # define RISCV_V_GET_CONTROL() (-EINVAL)
152 # define RISCV_SET_ICACHE_FLUSH_CTX(a, b) (-EINVAL)
155 # define PPC_GET_DEXCR_ASPECT(a, b) (-EINVAL)
158 # define PPC_SET_DEXCR_ASPECT(a, b, c) (-EINVAL)
162 * this is where the system-wide overflow UID and GID are defined, for
163 * architectures that now have 32-bit UID/GID but didn't in the past
173 * the same as above, but for filesystems which can only store a 16-bit
193 if (uid_eq(pcred->uid, cred->euid) || in set_one_prio_perm()
194 uid_eq(pcred->euid, cred->euid)) in set_one_prio_perm()
196 if (ns_capable(pcred->user_ns, CAP_SYS_NICE)) in set_one_prio_perm()
203 * - the caller must hold the RCU read lock
210 error = -EPERM; in set_one_prio()
214 error = -EACCES; in set_one_prio()
222 if (error == -ESRCH) in set_one_prio()
234 int error = -EINVAL; in SYSCALL_DEFINE3()
242 error = -ESRCH; in SYSCALL_DEFINE3()
270 uid = make_kuid(cred->user_ns, who); in SYSCALL_DEFINE3()
271 user = cred->user; in SYSCALL_DEFINE3()
273 uid = cred->uid; in SYSCALL_DEFINE3()
274 else if (!uid_eq(uid, cred->uid)) { in SYSCALL_DEFINE3()
283 if (!uid_eq(uid, cred->uid)) in SYSCALL_DEFINE3()
295 * not return the normal nice-value, but a negated value that
296 * has been offset by 20 (ie it returns 40..1 instead of -20..19)
304 long niceval, retval = -ESRCH; in SYSCALL_DEFINE2()
309 return -EINVAL; in SYSCALL_DEFINE2()
338 uid = make_kuid(cred->user_ns, who); in SYSCALL_DEFINE2()
339 user = cred->user; in SYSCALL_DEFINE2()
341 uid = cred->uid; in SYSCALL_DEFINE2()
342 else if (!uid_eq(uid, cred->uid)) { in SYSCALL_DEFINE2()
354 if (!uid_eq(uid, cred->uid)) in SYSCALL_DEFINE2()
366 * or vice versa. (BSD-style)
379 * SMP: There are not races, the GIDs are checked only by filesystem
394 if ((rgid != (gid_t) -1) && !gid_valid(krgid)) in __sys_setregid()
395 return -EINVAL; in __sys_setregid()
396 if ((egid != (gid_t) -1) && !gid_valid(kegid)) in __sys_setregid()
397 return -EINVAL; in __sys_setregid()
401 return -ENOMEM; in __sys_setregid()
404 retval = -EPERM; in __sys_setregid()
405 if (rgid != (gid_t) -1) { in __sys_setregid()
406 if (gid_eq(old->gid, krgid) || in __sys_setregid()
407 gid_eq(old->egid, krgid) || in __sys_setregid()
408 ns_capable_setid(old->user_ns, CAP_SETGID)) in __sys_setregid()
409 new->gid = krgid; in __sys_setregid()
413 if (egid != (gid_t) -1) { in __sys_setregid()
414 if (gid_eq(old->gid, kegid) || in __sys_setregid()
415 gid_eq(old->egid, kegid) || in __sys_setregid()
416 gid_eq(old->sgid, kegid) || in __sys_setregid()
417 ns_capable_setid(old->user_ns, CAP_SETGID)) in __sys_setregid()
418 new->egid = kegid; in __sys_setregid()
423 if (rgid != (gid_t) -1 || in __sys_setregid()
424 (egid != (gid_t) -1 && !gid_eq(kegid, old->gid))) in __sys_setregid()
425 new->sgid = new->egid; in __sys_setregid()
426 new->fsgid = new->egid; in __sys_setregid()
447 * SMP: Same implicit races as above.
459 return -EINVAL; in __sys_setgid()
463 return -ENOMEM; in __sys_setgid()
466 retval = -EPERM; in __sys_setgid()
467 if (ns_capable_setid(old->user_ns, CAP_SETGID)) in __sys_setgid()
468 new->gid = new->egid = new->sgid = new->fsgid = kgid; in __sys_setgid()
469 else if (gid_eq(kgid, old->gid) || gid_eq(kgid, old->sgid)) in __sys_setgid()
470 new->egid = new->fsgid = kgid; in __sys_setgid()
497 new_user = alloc_uid(new->uid); in set_user()
499 return -EAGAIN; in set_user()
501 free_uid(new->user); in set_user()
502 new->user = new_user; in set_user()
508 if (new->ucounts == current_ucounts()) in flag_nproc_exceeded()
518 if (is_rlimit_overlimit(new->ucounts, UCOUNT_RLIMIT_NPROC, rlimit(RLIMIT_NPROC)) && in flag_nproc_exceeded()
519 new->user != INIT_USER) in flag_nproc_exceeded()
520 current->flags |= PF_NPROC_EXCEEDED; in flag_nproc_exceeded()
522 current->flags &= ~PF_NPROC_EXCEEDED; in flag_nproc_exceeded()
527 * or vice versa. (BSD-style)
551 if ((ruid != (uid_t) -1) && !uid_valid(kruid)) in __sys_setreuid()
552 return -EINVAL; in __sys_setreuid()
553 if ((euid != (uid_t) -1) && !uid_valid(keuid)) in __sys_setreuid()
554 return -EINVAL; in __sys_setreuid()
558 return -ENOMEM; in __sys_setreuid()
561 retval = -EPERM; in __sys_setreuid()
562 if (ruid != (uid_t) -1) { in __sys_setreuid()
563 new->uid = kruid; in __sys_setreuid()
564 if (!uid_eq(old->uid, kruid) && in __sys_setreuid()
565 !uid_eq(old->euid, kruid) && in __sys_setreuid()
566 !ns_capable_setid(old->user_ns, CAP_SETUID)) in __sys_setreuid()
570 if (euid != (uid_t) -1) { in __sys_setreuid()
571 new->euid = keuid; in __sys_setreuid()
572 if (!uid_eq(old->uid, keuid) && in __sys_setreuid()
573 !uid_eq(old->euid, keuid) && in __sys_setreuid()
574 !uid_eq(old->suid, keuid) && in __sys_setreuid()
575 !ns_capable_setid(old->user_ns, CAP_SETUID)) in __sys_setreuid()
579 if (!uid_eq(new->uid, old->uid)) { in __sys_setreuid()
584 if (ruid != (uid_t) -1 || in __sys_setreuid()
585 (euid != (uid_t) -1 && !uid_eq(keuid, old->uid))) in __sys_setreuid()
586 new->suid = new->euid; in __sys_setreuid()
587 new->fsuid = new->euid; in __sys_setreuid()
617 * in the POSIX committee and/or USG. Note that the BSD-style setreuid()
631 return -EINVAL; in __sys_setuid()
635 return -ENOMEM; in __sys_setuid()
638 retval = -EPERM; in __sys_setuid()
639 if (ns_capable_setid(old->user_ns, CAP_SETUID)) { in __sys_setuid()
640 new->suid = new->uid = kuid; in __sys_setuid()
641 if (!uid_eq(kuid, old->uid)) { in __sys_setuid()
646 } else if (!uid_eq(kuid, old->uid) && !uid_eq(kuid, new->suid)) { in __sys_setuid()
650 new->fsuid = new->euid = kuid; in __sys_setuid()
691 if ((ruid != (uid_t) -1) && !uid_valid(kruid)) in __sys_setresuid()
692 return -EINVAL; in __sys_setresuid()
694 if ((euid != (uid_t) -1) && !uid_valid(keuid)) in __sys_setresuid()
695 return -EINVAL; in __sys_setresuid()
697 if ((suid != (uid_t) -1) && !uid_valid(ksuid)) in __sys_setresuid()
698 return -EINVAL; in __sys_setresuid()
702 /* check for no-op */ in __sys_setresuid()
703 if ((ruid == (uid_t) -1 || uid_eq(kruid, old->uid)) && in __sys_setresuid()
704 (euid == (uid_t) -1 || (uid_eq(keuid, old->euid) && in __sys_setresuid()
705 uid_eq(keuid, old->fsuid))) && in __sys_setresuid()
706 (suid == (uid_t) -1 || uid_eq(ksuid, old->suid))) in __sys_setresuid()
709 ruid_new = ruid != (uid_t) -1 && !uid_eq(kruid, old->uid) && in __sys_setresuid()
710 !uid_eq(kruid, old->euid) && !uid_eq(kruid, old->suid); in __sys_setresuid()
711 euid_new = euid != (uid_t) -1 && !uid_eq(keuid, old->uid) && in __sys_setresuid()
712 !uid_eq(keuid, old->euid) && !uid_eq(keuid, old->suid); in __sys_setresuid()
713 suid_new = suid != (uid_t) -1 && !uid_eq(ksuid, old->uid) && in __sys_setresuid()
714 !uid_eq(ksuid, old->euid) && !uid_eq(ksuid, old->suid); in __sys_setresuid()
716 !ns_capable_setid(old->user_ns, CAP_SETUID)) in __sys_setresuid()
717 return -EPERM; in __sys_setresuid()
721 return -ENOMEM; in __sys_setresuid()
723 if (ruid != (uid_t) -1) { in __sys_setresuid()
724 new->uid = kruid; in __sys_setresuid()
725 if (!uid_eq(kruid, old->uid)) { in __sys_setresuid()
731 if (euid != (uid_t) -1) in __sys_setresuid()
732 new->euid = keuid; in __sys_setresuid()
733 if (suid != (uid_t) -1) in __sys_setresuid()
734 new->suid = ksuid; in __sys_setresuid()
735 new->fsuid = new->euid; in __sys_setresuid()
764 ruid = from_kuid_munged(cred->user_ns, cred->uid); in SYSCALL_DEFINE3()
765 euid = from_kuid_munged(cred->user_ns, cred->euid); in SYSCALL_DEFINE3()
766 suid = from_kuid_munged(cred->user_ns, cred->suid); in SYSCALL_DEFINE3()
793 if ((rgid != (gid_t) -1) && !gid_valid(krgid)) in __sys_setresgid()
794 return -EINVAL; in __sys_setresgid()
795 if ((egid != (gid_t) -1) && !gid_valid(kegid)) in __sys_setresgid()
796 return -EINVAL; in __sys_setresgid()
797 if ((sgid != (gid_t) -1) && !gid_valid(ksgid)) in __sys_setresgid()
798 return -EINVAL; in __sys_setresgid()
802 /* check for no-op */ in __sys_setresgid()
803 if ((rgid == (gid_t) -1 || gid_eq(krgid, old->gid)) && in __sys_setresgid()
804 (egid == (gid_t) -1 || (gid_eq(kegid, old->egid) && in __sys_setresgid()
805 gid_eq(kegid, old->fsgid))) && in __sys_setresgid()
806 (sgid == (gid_t) -1 || gid_eq(ksgid, old->sgid))) in __sys_setresgid()
809 rgid_new = rgid != (gid_t) -1 && !gid_eq(krgid, old->gid) && in __sys_setresgid()
810 !gid_eq(krgid, old->egid) && !gid_eq(krgid, old->sgid); in __sys_setresgid()
811 egid_new = egid != (gid_t) -1 && !gid_eq(kegid, old->gid) && in __sys_setresgid()
812 !gid_eq(kegid, old->egid) && !gid_eq(kegid, old->sgid); in __sys_setresgid()
813 sgid_new = sgid != (gid_t) -1 && !gid_eq(ksgid, old->gid) && in __sys_setresgid()
814 !gid_eq(ksgid, old->egid) && !gid_eq(ksgid, old->sgid); in __sys_setresgid()
816 !ns_capable_setid(old->user_ns, CAP_SETGID)) in __sys_setresgid()
817 return -EPERM; in __sys_setresgid()
821 return -ENOMEM; in __sys_setresgid()
823 if (rgid != (gid_t) -1) in __sys_setresgid()
824 new->gid = krgid; in __sys_setresgid()
825 if (egid != (gid_t) -1) in __sys_setresgid()
826 new->egid = kegid; in __sys_setresgid()
827 if (sgid != (gid_t) -1) in __sys_setresgid()
828 new->sgid = ksgid; in __sys_setresgid()
829 new->fsgid = new->egid; in __sys_setresgid()
853 rgid = from_kgid_munged(cred->user_ns, cred->gid); in SYSCALL_DEFINE3()
854 egid = from_kgid_munged(cred->user_ns, cred->egid); in SYSCALL_DEFINE3()
855 sgid = from_kgid_munged(cred->user_ns, cred->sgid); in SYSCALL_DEFINE3()
869 * "setfsuid()" sets the fsuid - the uid used for filesystem checks. This
882 old_fsuid = from_kuid_munged(old->user_ns, old->fsuid); in __sys_setfsuid()
884 kuid = make_kuid(old->user_ns, uid); in __sys_setfsuid()
892 if (uid_eq(kuid, old->uid) || uid_eq(kuid, old->euid) || in __sys_setfsuid()
893 uid_eq(kuid, old->suid) || uid_eq(kuid, old->fsuid) || in __sys_setfsuid()
894 ns_capable_setid(old->user_ns, CAP_SETUID)) { in __sys_setfsuid()
895 if (!uid_eq(kuid, old->fsuid)) { in __sys_setfsuid()
896 new->fsuid = kuid; in __sys_setfsuid()
926 old_fsgid = from_kgid_munged(old->user_ns, old->fsgid); in __sys_setfsgid()
928 kgid = make_kgid(old->user_ns, gid); in __sys_setfsgid()
936 if (gid_eq(kgid, old->gid) || gid_eq(kgid, old->egid) || in __sys_setfsgid()
937 gid_eq(kgid, old->sgid) || gid_eq(kgid, old->fsgid) || in __sys_setfsgid()
938 ns_capable_setid(old->user_ns, CAP_SETGID)) { in __sys_setfsgid()
939 if (!gid_eq(kgid, old->fsgid)) { in __sys_setfsgid()
940 new->fsgid = kgid; in __sys_setfsgid()
961 * sys_getpid - return the thread group id of the current process
967 * This is SMP safe as current->tgid does not change.
974 /* Thread ID - the internal kernel "pid" */
981 * Accessing ->real_parent is not SMP-safe, it could
983 * value of ->real_parent under rcu_read_lock(), see
984 * release_task()->call_rcu(delayed_put_task_struct).
991 pid = task_tgid_vnr(rcu_dereference(current->real_parent)); in SYSCALL_DEFINE0()
999 /* Only we change this so SMP safe */ in SYSCALL_DEFINE0()
1005 /* Only we change this so SMP safe */ in SYSCALL_DEFINE0()
1011 /* Only we change this so SMP safe */ in SYSCALL_DEFINE0()
1017 /* Only we change this so SMP safe */ in SYSCALL_DEFINE0()
1026 cutime = current->signal->cutime; in do_sys_times()
1027 cstime = current->signal->cstime; in do_sys_times()
1028 tms->tms_utime = nsec_to_clock_t(tgutime); in do_sys_times()
1029 tms->tms_stime = nsec_to_clock_t(tgstime); in do_sys_times()
1030 tms->tms_cutime = nsec_to_clock_t(cutime); in do_sys_times()
1031 tms->tms_cstime = nsec_to_clock_t(cstime); in do_sys_times()
1041 return -EFAULT; in SYSCALL_DEFINE1()
1066 return -EFAULT; in COMPAT_SYSCALL_DEFINE1()
1079 * only important on a multi-user system anyway, to make sure one user
1080 * can't send a signal to a process owned by another. -TYT, 12/12/91
1087 struct task_struct *group_leader = current->group_leader; in SYSCALL_DEFINE2()
1097 return -EINVAL; in SYSCALL_DEFINE2()
1101 * so that our parent does not change from under us. -DaveM in SYSCALL_DEFINE2()
1105 err = -ESRCH; in SYSCALL_DEFINE2()
1110 err = -EINVAL; in SYSCALL_DEFINE2()
1114 if (same_thread_group(p->real_parent, group_leader)) { in SYSCALL_DEFINE2()
1115 err = -EPERM; in SYSCALL_DEFINE2()
1118 err = -EACCES; in SYSCALL_DEFINE2()
1119 if (!(p->flags & PF_FORKNOEXEC)) in SYSCALL_DEFINE2()
1122 err = -ESRCH; in SYSCALL_DEFINE2()
1127 err = -EPERM; in SYSCALL_DEFINE2()
1128 if (p->signal->leader) in SYSCALL_DEFINE2()
1150 /* All paths lead to here, thus we are safe. -DaveM */ in SYSCALL_DEFINE2()
1167 retval = -ESRCH; in do_getpgid()
1209 retval = -ESRCH; in SYSCALL_DEFINE1()
1229 struct task_struct *curr = current->group_leader; in set_special_pids()
1240 struct task_struct *group_leader = current->group_leader; in ksys_setsid()
1244 int err = -EPERM; in ksys_setsid()
1248 if (group_leader->signal->leader) in ksys_setsid()
1257 group_leader->signal->leader = 1; in ksys_setsid()
1282 (personality(current->personality) == PER_LINUX32 && \
1283 copy_to_user(name->machine, COMPAT_UTS_MACHINE, \
1299 if (current->personality & UNAME26) { in override_release()
1329 return -EFAULT; in SYSCALL_DEFINE1()
1331 if (override_release(name->release, sizeof(name->release))) in SYSCALL_DEFINE1()
1332 return -EFAULT; in SYSCALL_DEFINE1()
1334 return -EFAULT; in SYSCALL_DEFINE1()
1347 return -EFAULT; in SYSCALL_DEFINE1()
1353 return -EFAULT; in SYSCALL_DEFINE1()
1355 if (override_release(name->release, sizeof(name->release))) in SYSCALL_DEFINE1()
1356 return -EFAULT; in SYSCALL_DEFINE1()
1358 return -EFAULT; in SYSCALL_DEFINE1()
1367 return -EFAULT; in SYSCALL_DEFINE1()
1372 memcpy(&tmp.sysname, &utsname()->sysname, __OLD_UTS_LEN); in SYSCALL_DEFINE1()
1373 memcpy(&tmp.nodename, &utsname()->nodename, __OLD_UTS_LEN); in SYSCALL_DEFINE1()
1374 memcpy(&tmp.release, &utsname()->release, __OLD_UTS_LEN); in SYSCALL_DEFINE1()
1375 memcpy(&tmp.version, &utsname()->version, __OLD_UTS_LEN); in SYSCALL_DEFINE1()
1376 memcpy(&tmp.machine, &utsname()->machine, __OLD_UTS_LEN); in SYSCALL_DEFINE1()
1379 return -EFAULT; in SYSCALL_DEFINE1()
1382 return -EFAULT; in SYSCALL_DEFINE1()
1383 if (override_release(name->release, sizeof(name->release))) in SYSCALL_DEFINE1()
1384 return -EFAULT; in SYSCALL_DEFINE1()
1394 if (!ns_capable(current->nsproxy->uts_ns->user_ns, CAP_SYS_ADMIN)) in SYSCALL_DEFINE2()
1395 return -EPERM; in SYSCALL_DEFINE2()
1398 return -EINVAL; in SYSCALL_DEFINE2()
1399 errno = -EFAULT; in SYSCALL_DEFINE2()
1406 memcpy(u->nodename, tmp, len); in SYSCALL_DEFINE2()
1407 memset(u->nodename + len, 0, sizeof(u->nodename) - len); in SYSCALL_DEFINE2()
1424 return -EINVAL; in SYSCALL_DEFINE2()
1427 i = 1 + strlen(u->nodename); in SYSCALL_DEFINE2()
1430 memcpy(tmp, u->nodename, i); in SYSCALL_DEFINE2()
1433 return -EFAULT; in SYSCALL_DEFINE2()
1448 if (!ns_capable(current->nsproxy->uts_ns->user_ns, CAP_SYS_ADMIN)) in SYSCALL_DEFINE2()
1449 return -EPERM; in SYSCALL_DEFINE2()
1451 return -EINVAL; in SYSCALL_DEFINE2()
1453 errno = -EFAULT; in SYSCALL_DEFINE2()
1460 memcpy(u->domainname, tmp, len); in SYSCALL_DEFINE2()
1461 memset(u->domainname + len, 0, sizeof(u->domainname) - len); in SYSCALL_DEFINE2()
1477 return -EINVAL; in do_prlimit()
1481 if (new_rlim->rlim_cur > new_rlim->rlim_max) in do_prlimit()
1482 return -EINVAL; in do_prlimit()
1484 new_rlim->rlim_max > sysctl_nr_open) in do_prlimit()
1485 return -EPERM; in do_prlimit()
1488 /* Holding a refcount on tsk protects tsk->signal from disappearing. */ in do_prlimit()
1489 rlim = tsk->signal->rlim + resource; in do_prlimit()
1490 task_lock(tsk->group_leader); in do_prlimit()
1493 * Keep the capable check against init_user_ns until cgroups can in do_prlimit()
1496 if (new_rlim->rlim_max > rlim->rlim_max && in do_prlimit()
1497 !capable(CAP_SYS_RESOURCE)) in do_prlimit()
1498 retval = -EPERM; in do_prlimit()
1508 task_unlock(tsk->group_leader); in do_prlimit()
1516 new_rlim->rlim_cur != RLIM_INFINITY && in do_prlimit()
1527 update_rlimit_cpu(tsk->group_leader, new_rlim->rlim_cur); in do_prlimit()
1540 ret = copy_to_user(rlim, &value, sizeof(*rlim)) ? -EFAULT : 0; in SYSCALL_DEFINE2()
1554 return -EFAULT; in COMPAT_SYSCALL_DEFINE2()
1586 return -EFAULT; in COMPAT_SYSCALL_DEFINE2()
1603 return -EINVAL; in SYSCALL_DEFINE2()
1606 task_lock(current->group_leader); in SYSCALL_DEFINE2()
1607 x = current->signal->rlim[resource]; in SYSCALL_DEFINE2()
1608 task_unlock(current->group_leader); in SYSCALL_DEFINE2()
1613 return copy_to_user(rlim, &x, sizeof(x)) ? -EFAULT : 0; in SYSCALL_DEFINE2()
1623 return -EINVAL; in COMPAT_SYSCALL_DEFINE2()
1626 task_lock(current->group_leader); in COMPAT_SYSCALL_DEFINE2()
1627 r = current->signal->rlim[resource]; in COMPAT_SYSCALL_DEFINE2()
1628 task_unlock(current->group_leader); in COMPAT_SYSCALL_DEFINE2()
1634 if (put_user(r.rlim_cur, &rlim->rlim_cur) || in COMPAT_SYSCALL_DEFINE2()
1635 put_user(r.rlim_max, &rlim->rlim_max)) in COMPAT_SYSCALL_DEFINE2()
1636 return -EFAULT; in COMPAT_SYSCALL_DEFINE2()
1654 if (rlim->rlim_cur == RLIM_INFINITY) in rlim_to_rlim64()
1655 rlim64->rlim_cur = RLIM64_INFINITY; in rlim_to_rlim64()
1657 rlim64->rlim_cur = rlim->rlim_cur; in rlim_to_rlim64()
1658 if (rlim->rlim_max == RLIM_INFINITY) in rlim_to_rlim64()
1659 rlim64->rlim_max = RLIM64_INFINITY; in rlim_to_rlim64()
1661 rlim64->rlim_max = rlim->rlim_max; in rlim_to_rlim64()
1666 if (rlim64_is_infinity(rlim64->rlim_cur)) in rlim64_to_rlim()
1667 rlim->rlim_cur = RLIM_INFINITY; in rlim64_to_rlim()
1669 rlim->rlim_cur = (unsigned long)rlim64->rlim_cur; in rlim64_to_rlim()
1670 if (rlim64_is_infinity(rlim64->rlim_max)) in rlim64_to_rlim()
1671 rlim->rlim_max = RLIM_INFINITY; in rlim64_to_rlim()
1673 rlim->rlim_max = (unsigned long)rlim64->rlim_max; in rlim64_to_rlim()
1687 id_match = (uid_eq(cred->uid, tcred->euid) && in check_prlimit_permission()
1688 uid_eq(cred->uid, tcred->suid) && in check_prlimit_permission()
1689 uid_eq(cred->uid, tcred->uid) && in check_prlimit_permission()
1690 gid_eq(cred->gid, tcred->egid) && in check_prlimit_permission()
1691 gid_eq(cred->gid, tcred->sgid) && in check_prlimit_permission()
1692 gid_eq(cred->gid, tcred->gid)); in check_prlimit_permission()
1693 if (!id_match && !ns_capable(tcred->user_ns, CAP_SYS_RESOURCE)) in check_prlimit_permission()
1694 return -EPERM; in check_prlimit_permission()
1714 return -EFAULT; in SYSCALL_DEFINE4()
1723 return -ESRCH; in SYSCALL_DEFINE4()
1739 ret = -EFAULT; in SYSCALL_DEFINE4()
1751 return -EFAULT; in SYSCALL_DEFINE2()
1763 * When sampling multiple threads for RUSAGE_SELF, under SMP we might have
1767 * the c* fields from p->signal from races with exit.c updating those
1773 * for the cases current multithreaded, non-current single threaded
1774 * non-current multithreaded. Thread traversal is now safe with
1778 * else can reap the children to update signal->c* counters, and no one else
1779 * can race with the signal-> fields. If we do not take any lock, the
1780 * signal-> fields could be read out of order while another thread was just
1783 * as __exit_signal releases the siglock spinlock after updating the signal->
1790 r->ru_nvcsw += t->nvcsw; in accumulate_thread_rusage()
1791 r->ru_nivcsw += t->nivcsw; in accumulate_thread_rusage()
1792 r->ru_minflt += t->min_flt; in accumulate_thread_rusage()
1793 r->ru_majflt += t->maj_flt; in accumulate_thread_rusage()
1794 r->ru_inblock += task_io_get_inblock(t); in accumulate_thread_rusage()
1795 r->ru_oublock += task_io_get_oublock(t); in accumulate_thread_rusage()
1805 struct signal_struct *sig = p->signal; in getrusage()
1816 maxrss = sig->maxrss; in getrusage()
1820 flags = read_seqbegin_or_lock_irqsave(&sig->stats_lock, &seq); in getrusage()
1825 utime = sig->cutime; in getrusage()
1826 stime = sig->cstime; in getrusage()
1827 r->ru_nvcsw = sig->cnvcsw; in getrusage()
1828 r->ru_nivcsw = sig->cnivcsw; in getrusage()
1829 r->ru_minflt = sig->cmin_flt; in getrusage()
1830 r->ru_majflt = sig->cmaj_flt; in getrusage()
1831 r->ru_inblock = sig->cinblock; in getrusage()
1832 r->ru_oublock = sig->coublock; in getrusage()
1833 maxrss = sig->cmaxrss; in getrusage()
1840 r->ru_nvcsw += sig->nvcsw; in getrusage()
1841 r->ru_nivcsw += sig->nivcsw; in getrusage()
1842 r->ru_minflt += sig->min_flt; in getrusage()
1843 r->ru_majflt += sig->maj_flt; in getrusage()
1844 r->ru_inblock += sig->inblock; in getrusage()
1845 r->ru_oublock += sig->oublock; in getrusage()
1846 if (maxrss < sig->maxrss) in getrusage()
1847 maxrss = sig->maxrss; in getrusage()
1860 if (need_seqretry(&sig->stats_lock, seq)) { in getrusage()
1864 done_seqretry_irqrestore(&sig->stats_lock, seq, flags); in getrusage()
1881 r->ru_maxrss = maxrss * (PAGE_SIZE / 1024); /* convert pages to KBs */ in getrusage()
1882 r->ru_utime = ns_to_kernel_old_timeval(utime); in getrusage()
1883 r->ru_stime = ns_to_kernel_old_timeval(stime); in getrusage()
1892 return -EINVAL; in SYSCALL_DEFINE2()
1895 return copy_to_user(ru, &r, sizeof(r)) ? -EFAULT : 0; in SYSCALL_DEFINE2()
1905 return -EINVAL; in COMPAT_SYSCALL_DEFINE2()
1914 mask = xchg(&current->fs->umask, mask & S_IRWXUGO); in SYSCALL_DEFINE1()
1925 return -EBADF; in prctl_set_mm_exe_file()
1930 * Because the original mm->exe_file points to executable file, make in prctl_set_mm_exe_file()
1934 if (!S_ISREG(inode->i_mode) || path_noexec(&fd_file(exe)->f_path)) in prctl_set_mm_exe_file()
1935 return -EACCES; in prctl_set_mm_exe_file()
1953 int error = -EINVAL, i; in validate_prctl_map_addr()
1985 ((unsigned long)prctl_map->__m1 __op \ in validate_prctl_map_addr()
1986 (unsigned long)prctl_map->__m2) ? 0 : -EINVAL in validate_prctl_map_addr()
1996 error = -EINVAL; in validate_prctl_map_addr()
2001 if (check_data_rlimit(rlimit(RLIMIT_DATA), prctl_map->brk, in validate_prctl_map_addr()
2002 prctl_map->start_brk, prctl_map->end_data, in validate_prctl_map_addr()
2003 prctl_map->start_data)) in validate_prctl_map_addr()
2014 struct prctl_mm_map prctl_map = { .exe_fd = (u32)-1, }; in prctl_set_mm_map()
2016 struct mm_struct *mm = current->mm; in prctl_set_mm_map()
2019 BUILD_BUG_ON(sizeof(user_auxv) != sizeof(mm->saved_auxv)); in prctl_set_mm_map()
2027 return -EINVAL; in prctl_set_mm_map()
2030 return -EFAULT; in prctl_set_mm_map()
2041 prctl_map.auxv_size > sizeof(mm->saved_auxv)) in prctl_set_mm_map()
2042 return -EINVAL; in prctl_set_mm_map()
2048 return -EFAULT; in prctl_set_mm_map()
2051 user_auxv[AT_VECTOR_SIZE - 2] = AT_NULL; in prctl_set_mm_map()
2052 user_auxv[AT_VECTOR_SIZE - 1] = AT_NULL; in prctl_set_mm_map()
2055 if (prctl_map.exe_fd != (u32)-1) { in prctl_set_mm_map()
2057 * Check if the current user is checkpoint/restore capable. in prctl_set_mm_map()
2065 return -EPERM; in prctl_set_mm_map()
2084 * - @start_brk/@brk which are used in do_brk_flags but kernel lookups in prctl_set_mm_map()
2090 spin_lock(&mm->arg_lock); in prctl_set_mm_map()
2091 mm->start_code = prctl_map.start_code; in prctl_set_mm_map()
2092 mm->end_code = prctl_map.end_code; in prctl_set_mm_map()
2093 mm->start_data = prctl_map.start_data; in prctl_set_mm_map()
2094 mm->end_data = prctl_map.end_data; in prctl_set_mm_map()
2095 mm->start_brk = prctl_map.start_brk; in prctl_set_mm_map()
2096 mm->brk = prctl_map.brk; in prctl_set_mm_map()
2097 mm->start_stack = prctl_map.start_stack; in prctl_set_mm_map()
2098 mm->arg_start = prctl_map.arg_start; in prctl_set_mm_map()
2099 mm->arg_end = prctl_map.arg_end; in prctl_set_mm_map()
2100 mm->env_start = prctl_map.env_start; in prctl_set_mm_map()
2101 mm->env_end = prctl_map.env_end; in prctl_set_mm_map()
2102 spin_unlock(&mm->arg_lock); in prctl_set_mm_map()
2107 * updating -- it may get partly updated results. It's in prctl_set_mm_map()
2113 memcpy(mm->saved_auxv, user_auxv, sizeof(user_auxv)); in prctl_set_mm_map()
2132 return -EINVAL; in prctl_set_auxv()
2135 return -EFAULT; in prctl_set_auxv()
2138 user_auxv[AT_VECTOR_SIZE - 2] = 0; in prctl_set_auxv()
2139 user_auxv[AT_VECTOR_SIZE - 1] = 0; in prctl_set_auxv()
2141 BUILD_BUG_ON(sizeof(user_auxv) != sizeof(mm->saved_auxv)); in prctl_set_auxv()
2144 memcpy(mm->saved_auxv, user_auxv, len); in prctl_set_auxv()
2153 struct mm_struct *mm = current->mm; in prctl_set_mm()
2157 .exe_fd = -1, in prctl_set_mm()
2165 return -EINVAL; in prctl_set_mm()
2172 if (!capable(CAP_SYS_RESOURCE)) in prctl_set_mm()
2173 return -EPERM; in prctl_set_mm()
2182 return -EINVAL; in prctl_set_mm()
2184 error = -EINVAL; in prctl_set_mm()
2194 spin_lock(&mm->arg_lock); in prctl_set_mm()
2195 prctl_map.start_code = mm->start_code; in prctl_set_mm()
2196 prctl_map.end_code = mm->end_code; in prctl_set_mm()
2197 prctl_map.start_data = mm->start_data; in prctl_set_mm()
2198 prctl_map.end_data = mm->end_data; in prctl_set_mm()
2199 prctl_map.start_brk = mm->start_brk; in prctl_set_mm()
2200 prctl_map.brk = mm->brk; in prctl_set_mm()
2201 prctl_map.start_stack = mm->start_stack; in prctl_set_mm()
2202 prctl_map.arg_start = mm->arg_start; in prctl_set_mm()
2203 prctl_map.arg_end = mm->arg_end; in prctl_set_mm()
2204 prctl_map.env_start = mm->env_start; in prctl_set_mm()
2205 prctl_map.env_end = mm->env_end; in prctl_set_mm()
2263 error = -EFAULT; in prctl_set_mm()
2268 mm->start_code = prctl_map.start_code; in prctl_set_mm()
2269 mm->end_code = prctl_map.end_code; in prctl_set_mm()
2270 mm->start_data = prctl_map.start_data; in prctl_set_mm()
2271 mm->end_data = prctl_map.end_data; in prctl_set_mm()
2272 mm->start_brk = prctl_map.start_brk; in prctl_set_mm()
2273 mm->brk = prctl_map.brk; in prctl_set_mm()
2274 mm->start_stack = prctl_map.start_stack; in prctl_set_mm()
2275 mm->arg_start = prctl_map.arg_start; in prctl_set_mm()
2276 mm->arg_end = prctl_map.arg_end; in prctl_set_mm()
2277 mm->env_start = prctl_map.env_start; in prctl_set_mm()
2278 mm->env_end = prctl_map.env_end; in prctl_set_mm()
2282 spin_unlock(&mm->arg_lock); in prctl_set_mm()
2290 return put_user(me->clear_child_tid, tid_addr); in prctl_get_tid_address()
2295 return -EINVAL; in prctl_get_tid_address()
2302 * If task has has_child_subreaper - all its descendants in propagate_has_child_subreaper()
2306 * If we've found child_reaper - skip descendants in in propagate_has_child_subreaper()
2309 if (p->signal->has_child_subreaper || in propagate_has_child_subreaper()
2313 p->signal->has_child_subreaper = 1; in propagate_has_child_subreaper()
2319 return -EINVAL; in arch_prctl_spec_ctrl_get()
2325 return -EINVAL; in arch_prctl_spec_ctrl_set()
2330 return -EINVAL; in arch_get_shadow_stack_status()
2335 return -EINVAL; in arch_set_shadow_stack_status()
2340 return -EINVAL; in arch_lock_shadow_stack_status()
2360 struct mm_struct *mm = current->mm; in prctl_set_vma()
2378 return -EINVAL; in prctl_set_vma()
2385 return -ENOMEM; in prctl_set_vma()
2395 error = -EINVAL; in prctl_set_vma()
2405 return -EINVAL; in prctl_set_vma()
2413 if (test_bit(MMF_HAS_MDWE, &current->mm->flags)) in get_current_mdwe()
2415 if (test_bit(MMF_HAS_MDWE_NO_INHERIT, &current->mm->flags)) in get_current_mdwe()
2427 return -EINVAL; in prctl_set_mdwe()
2430 return -EINVAL; in prctl_set_mdwe()
2434 return -EINVAL; in prctl_set_mdwe()
2441 return -EINVAL; in prctl_set_mdwe()
2445 return -EPERM; /* Cannot unset the flags */ in prctl_set_mdwe()
2448 set_bit(MMF_HAS_MDWE_NO_INHERIT, &current->mm->flags); in prctl_set_mdwe()
2450 set_bit(MMF_HAS_MDWE, &current->mm->flags); in prctl_set_mdwe()
2459 return -EINVAL; in prctl_get_mdwe()
2465 struct mm_struct *mm = current->mm; in prctl_get_auxv()
2466 unsigned long size = min_t(unsigned long, sizeof(mm->saved_auxv), len); in prctl_get_auxv()
2468 if (size && copy_to_user(addr, mm->saved_auxv, size)) in prctl_get_auxv()
2469 return -EFAULT; in prctl_get_auxv()
2470 return sizeof(mm->saved_auxv); in prctl_get_auxv()
2477 unsigned char comm[sizeof(me->comm)]; in SYSCALL_DEFINE5()
2481 if (error != -ENOSYS) in SYSCALL_DEFINE5()
2488 error = -EINVAL; in SYSCALL_DEFINE5()
2491 me->pdeath_signal = arg2; in SYSCALL_DEFINE5()
2494 error = put_user(me->pdeath_signal, (int __user *)arg2); in SYSCALL_DEFINE5()
2497 error = get_dumpable(me->mm); in SYSCALL_DEFINE5()
2501 error = -EINVAL; in SYSCALL_DEFINE5()
2504 set_dumpable(me->mm, arg2); in SYSCALL_DEFINE5()
2530 error = -EINVAL; in SYSCALL_DEFINE5()
2533 comm[sizeof(me->comm) - 1] = 0; in SYSCALL_DEFINE5()
2535 sizeof(me->comm) - 1) < 0) in SYSCALL_DEFINE5()
2536 return -EFAULT; in SYSCALL_DEFINE5()
2543 return -EFAULT; in SYSCALL_DEFINE5()
2570 if (current->timer_slack_ns > ULONG_MAX) in SYSCALL_DEFINE5()
2573 error = current->timer_slack_ns; in SYSCALL_DEFINE5()
2579 current->timer_slack_ns = in SYSCALL_DEFINE5()
2580 current->default_timer_slack_ns; in SYSCALL_DEFINE5()
2582 current->timer_slack_ns = arg2; in SYSCALL_DEFINE5()
2586 return -EINVAL; in SYSCALL_DEFINE5()
2590 return -EINVAL; in SYSCALL_DEFINE5()
2591 current->flags &= ~PF_MCE_PROCESS; in SYSCALL_DEFINE5()
2594 current->flags |= PF_MCE_PROCESS; in SYSCALL_DEFINE5()
2596 current->flags |= PF_MCE_EARLY; in SYSCALL_DEFINE5()
2598 current->flags &= ~PF_MCE_EARLY; in SYSCALL_DEFINE5()
2600 current->flags &= in SYSCALL_DEFINE5()
2603 return -EINVAL; in SYSCALL_DEFINE5()
2606 return -EINVAL; in SYSCALL_DEFINE5()
2611 return -EINVAL; in SYSCALL_DEFINE5()
2612 if (current->flags & PF_MCE_PROCESS) in SYSCALL_DEFINE5()
2613 error = (current->flags & PF_MCE_EARLY) ? in SYSCALL_DEFINE5()
2625 me->signal->is_child_subreaper = !!arg2; in SYSCALL_DEFINE5()
2632 error = put_user(me->signal->is_child_subreaper, in SYSCALL_DEFINE5()
2637 return -EINVAL; in SYSCALL_DEFINE5()
2643 return -EINVAL; in SYSCALL_DEFINE5()
2647 return -EINVAL; in SYSCALL_DEFINE5()
2648 error = !!test_bit(MMF_DISABLE_THP, &me->mm->flags); in SYSCALL_DEFINE5()
2652 return -EINVAL; in SYSCALL_DEFINE5()
2653 if (mmap_write_lock_killable(me->mm)) in SYSCALL_DEFINE5()
2654 return -EINTR; in SYSCALL_DEFINE5()
2656 set_bit(MMF_DISABLE_THP, &me->mm->flags); in SYSCALL_DEFINE5()
2658 clear_bit(MMF_DISABLE_THP, &me->mm->flags); in SYSCALL_DEFINE5()
2659 mmap_write_unlock(me->mm); in SYSCALL_DEFINE5()
2664 return -EINVAL; in SYSCALL_DEFINE5()
2685 return -EINVAL; in SYSCALL_DEFINE5()
2690 return -EINVAL; in SYSCALL_DEFINE5()
2695 return -EINVAL; in SYSCALL_DEFINE5()
2700 return -EINVAL; in SYSCALL_DEFINE5()
2705 return -EINVAL; in SYSCALL_DEFINE5()
2710 return -EINVAL; in SYSCALL_DEFINE5()
2715 return -EINVAL; in SYSCALL_DEFINE5()
2719 if (!capable(CAP_SYS_RESOURCE)) in SYSCALL_DEFINE5()
2720 return -EPERM; in SYSCALL_DEFINE5()
2723 return -EINVAL; in SYSCALL_DEFINE5()
2726 current->flags |= PR_IO_FLUSHER; in SYSCALL_DEFINE5()
2728 current->flags &= ~PR_IO_FLUSHER; in SYSCALL_DEFINE5()
2730 return -EINVAL; in SYSCALL_DEFINE5()
2733 if (!capable(CAP_SYS_RESOURCE)) in SYSCALL_DEFINE5()
2734 return -EPERM; in SYSCALL_DEFINE5()
2737 return -EINVAL; in SYSCALL_DEFINE5()
2739 error = (current->flags & PR_IO_FLUSHER) == PR_IO_FLUSHER; in SYSCALL_DEFINE5()
2758 return -EINVAL; in SYSCALL_DEFINE5()
2763 return -EINVAL; in SYSCALL_DEFINE5()
2771 return -EINVAL; in SYSCALL_DEFINE5()
2777 return -EINVAL; in SYSCALL_DEFINE5()
2778 if (mmap_write_lock_killable(me->mm)) in SYSCALL_DEFINE5()
2779 return -EINTR; in SYSCALL_DEFINE5()
2782 error = ksm_enable_merge_any(me->mm); in SYSCALL_DEFINE5()
2784 error = ksm_disable_merge_any(me->mm); in SYSCALL_DEFINE5()
2785 mmap_write_unlock(me->mm); in SYSCALL_DEFINE5()
2789 return -EINVAL; in SYSCALL_DEFINE5()
2791 error = !!test_bit(MMF_VM_MERGE_ANY, &me->mm->flags); in SYSCALL_DEFINE5()
2805 return -EINVAL; in SYSCALL_DEFINE5()
2810 return -EINVAL; in SYSCALL_DEFINE5()
2815 return -EINVAL; in SYSCALL_DEFINE5()
2820 return -EINVAL; in SYSCALL_DEFINE5()
2825 error = -EINVAL; in SYSCALL_DEFINE5()
2841 return err ? -EFAULT : 0; in SYSCALL_DEFINE3()
2845 * do_sysinfo - fill in sysinfo struct
2858 info->uptime = tp.tv_sec + (tp.tv_nsec ? 1 : 0); in do_sysinfo()
2860 get_avenrun(info->loads, 0, SI_LOAD_SHIFT - FSHIFT); in do_sysinfo()
2862 info->procs = nr_threads; in do_sysinfo()
2873 * -Erik Andersen <andersee@debian.org> in do_sysinfo()
2876 mem_total = info->totalram + info->totalswap; in do_sysinfo()
2877 if (mem_total < info->totalram || mem_total < info->totalswap) in do_sysinfo()
2880 mem_unit = info->mem_unit; in do_sysinfo()
2892 * info->mem_unit and set it to 1. This leaves things compatible in do_sysinfo()
2897 info->mem_unit = 1; in do_sysinfo()
2898 info->totalram <<= bitcount; in do_sysinfo()
2899 info->freeram <<= bitcount; in do_sysinfo()
2900 info->sharedram <<= bitcount; in do_sysinfo()
2901 info->bufferram <<= bitcount; in do_sysinfo()
2902 info->totalswap <<= bitcount; in do_sysinfo()
2903 info->freeswap <<= bitcount; in do_sysinfo()
2904 info->totalhigh <<= bitcount; in do_sysinfo()
2905 info->freehigh <<= bitcount; in do_sysinfo()
2918 return -EFAULT; in SYSCALL_DEFINE1()
2938 char _f[20-2*sizeof(u32)-sizeof(int)];
2948 /* Check to see if any memory value is too large for 32-bit and scale in COMPAT_SYSCALL_DEFINE1()
2985 return -EFAULT; in COMPAT_SYSCALL_DEFINE1()