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

1 // SPDX-License-Identifier: GPL-2.0
25 #include <linux/posix-timers.h>
78 # define SET_UNALIGN_CTL(a, b) (-EINVAL)
81 # define GET_UNALIGN_CTL(a, b) (-EINVAL)
84 # define SET_FPEMU_CTL(a, b) (-EINVAL)
87 # define GET_FPEMU_CTL(a, b) (-EINVAL)
90 # define SET_FPEXC_CTL(a, b) (-EINVAL)
93 # define GET_FPEXC_CTL(a, b) (-EINVAL)
96 # define GET_ENDIAN(a, b) (-EINVAL)
99 # define SET_ENDIAN(a, b) (-EINVAL)
102 # define GET_TSC_CTL(a) (-EINVAL)
105 # define SET_TSC_CTL(a) (-EINVAL)
108 # define GET_FP_MODE(a) (-EINVAL)
111 # define SET_FP_MODE(a,b) (-EINVAL)
114 # define SVE_SET_VL(a) (-EINVAL)
117 # define SVE_GET_VL() (-EINVAL)
120 # define PAC_RESET_KEYS(a, b) (-EINVAL)
123 # define SET_TAGGED_ADDR_CTRL(a) (-EINVAL)
126 # define GET_TAGGED_ADDR_CTRL() (-EINVAL)
130 * this is where the system-wide overflow UID and GID are defined, for
131 * architectures that now have 32-bit UID/GID but didn't in the past
141 * the same as above, but for filesystems which can only store a 16-bit
161 if (uid_eq(pcred->uid, cred->euid) || in set_one_prio_perm()
162 uid_eq(pcred->euid, cred->euid)) in set_one_prio_perm()
164 if (ns_capable(pcred->user_ns, CAP_SYS_NICE)) in set_one_prio_perm()
171 * - the caller must hold the RCU read lock
178 error = -EPERM; in set_one_prio()
182 error = -EACCES; in set_one_prio()
190 if (error == -ESRCH) in set_one_prio()
202 int error = -EINVAL; in SYSCALL_DEFINE3()
210 error = -ESRCH; in SYSCALL_DEFINE3()
237 uid = make_kuid(cred->user_ns, who); in SYSCALL_DEFINE3()
238 user = cred->user; in SYSCALL_DEFINE3()
240 uid = cred->uid; in SYSCALL_DEFINE3()
241 else if (!uid_eq(uid, cred->uid)) { in SYSCALL_DEFINE3()
250 if (!uid_eq(uid, cred->uid)) in SYSCALL_DEFINE3()
263 * not return the normal nice-value, but a negated value that
264 * has been offset by 20 (ie it returns 40..1 instead of -20..19)
272 long niceval, retval = -ESRCH; in SYSCALL_DEFINE2()
277 return -EINVAL; in SYSCALL_DEFINE2()
305 uid = make_kuid(cred->user_ns, who); in SYSCALL_DEFINE2()
306 user = cred->user; in SYSCALL_DEFINE2()
308 uid = cred->uid; in SYSCALL_DEFINE2()
309 else if (!uid_eq(uid, cred->uid)) { in SYSCALL_DEFINE2()
321 if (!uid_eq(uid, cred->uid)) in SYSCALL_DEFINE2()
334 * or vice versa. (BSD-style)
347 * SMP: There are not races, the GIDs are checked only by filesystem
362 if ((rgid != (gid_t) -1) && !gid_valid(krgid)) in __sys_setregid()
363 return -EINVAL; in __sys_setregid()
364 if ((egid != (gid_t) -1) && !gid_valid(kegid)) in __sys_setregid()
365 return -EINVAL; in __sys_setregid()
369 return -ENOMEM; in __sys_setregid()
372 retval = -EPERM; in __sys_setregid()
373 if (rgid != (gid_t) -1) { in __sys_setregid()
374 if (gid_eq(old->gid, krgid) || in __sys_setregid()
375 gid_eq(old->egid, krgid) || in __sys_setregid()
376 ns_capable_setid(old->user_ns, CAP_SETGID)) in __sys_setregid()
377 new->gid = krgid; in __sys_setregid()
381 if (egid != (gid_t) -1) { in __sys_setregid()
382 if (gid_eq(old->gid, kegid) || in __sys_setregid()
383 gid_eq(old->egid, kegid) || in __sys_setregid()
384 gid_eq(old->sgid, kegid) || in __sys_setregid()
385 ns_capable_setid(old->user_ns, CAP_SETGID)) in __sys_setregid()
386 new->egid = kegid; in __sys_setregid()
391 if (rgid != (gid_t) -1 || in __sys_setregid()
392 (egid != (gid_t) -1 && !gid_eq(kegid, old->gid))) in __sys_setregid()
393 new->sgid = new->egid; in __sys_setregid()
394 new->fsgid = new->egid; in __sys_setregid()
415 * SMP: Same implicit races as above.
427 return -EINVAL; in __sys_setgid()
431 return -ENOMEM; in __sys_setgid()
434 retval = -EPERM; in __sys_setgid()
435 if (ns_capable_setid(old->user_ns, CAP_SETGID)) in __sys_setgid()
436 new->gid = new->egid = new->sgid = new->fsgid = kgid; in __sys_setgid()
437 else if (gid_eq(kgid, old->gid) || gid_eq(kgid, old->sgid)) in __sys_setgid()
438 new->egid = new->fsgid = kgid; in __sys_setgid()
465 new_user = alloc_uid(new->uid); in set_user()
467 return -EAGAIN; in set_user()
476 if (atomic_read(&new_user->processes) >= rlimit(RLIMIT_NPROC) && in set_user()
478 current->flags |= PF_NPROC_EXCEEDED; in set_user()
480 current->flags &= ~PF_NPROC_EXCEEDED; in set_user()
482 free_uid(new->user); in set_user()
483 new->user = new_user; in set_user()
489 * or vice versa. (BSD-style)
513 if ((ruid != (uid_t) -1) && !uid_valid(kruid)) in __sys_setreuid()
514 return -EINVAL; in __sys_setreuid()
515 if ((euid != (uid_t) -1) && !uid_valid(keuid)) in __sys_setreuid()
516 return -EINVAL; in __sys_setreuid()
520 return -ENOMEM; in __sys_setreuid()
523 retval = -EPERM; in __sys_setreuid()
524 if (ruid != (uid_t) -1) { in __sys_setreuid()
525 new->uid = kruid; in __sys_setreuid()
526 if (!uid_eq(old->uid, kruid) && in __sys_setreuid()
527 !uid_eq(old->euid, kruid) && in __sys_setreuid()
528 !ns_capable_setid(old->user_ns, CAP_SETUID)) in __sys_setreuid()
532 if (euid != (uid_t) -1) { in __sys_setreuid()
533 new->euid = keuid; in __sys_setreuid()
534 if (!uid_eq(old->uid, keuid) && in __sys_setreuid()
535 !uid_eq(old->euid, keuid) && in __sys_setreuid()
536 !uid_eq(old->suid, keuid) && in __sys_setreuid()
537 !ns_capable_setid(old->user_ns, CAP_SETUID)) in __sys_setreuid()
541 if (!uid_eq(new->uid, old->uid)) { in __sys_setreuid()
546 if (ruid != (uid_t) -1 || in __sys_setreuid()
547 (euid != (uid_t) -1 && !uid_eq(keuid, old->uid))) in __sys_setreuid()
548 new->suid = new->euid; in __sys_setreuid()
549 new->fsuid = new->euid; in __sys_setreuid()
574 * in the POSIX committee and/or USG. Note that the BSD-style setreuid()
588 return -EINVAL; in __sys_setuid()
592 return -ENOMEM; in __sys_setuid()
595 retval = -EPERM; in __sys_setuid()
596 if (ns_capable_setid(old->user_ns, CAP_SETUID)) { in __sys_setuid()
597 new->suid = new->uid = kuid; in __sys_setuid()
598 if (!uid_eq(kuid, old->uid)) { in __sys_setuid()
603 } else if (!uid_eq(kuid, old->uid) && !uid_eq(kuid, new->suid)) { in __sys_setuid()
607 new->fsuid = new->euid = kuid; in __sys_setuid()
642 if ((ruid != (uid_t) -1) && !uid_valid(kruid)) in __sys_setresuid()
643 return -EINVAL; in __sys_setresuid()
645 if ((euid != (uid_t) -1) && !uid_valid(keuid)) in __sys_setresuid()
646 return -EINVAL; in __sys_setresuid()
648 if ((suid != (uid_t) -1) && !uid_valid(ksuid)) in __sys_setresuid()
649 return -EINVAL; in __sys_setresuid()
653 return -ENOMEM; in __sys_setresuid()
657 retval = -EPERM; in __sys_setresuid()
658 if (!ns_capable_setid(old->user_ns, CAP_SETUID)) { in __sys_setresuid()
659 if (ruid != (uid_t) -1 && !uid_eq(kruid, old->uid) && in __sys_setresuid()
660 !uid_eq(kruid, old->euid) && !uid_eq(kruid, old->suid)) in __sys_setresuid()
662 if (euid != (uid_t) -1 && !uid_eq(keuid, old->uid) && in __sys_setresuid()
663 !uid_eq(keuid, old->euid) && !uid_eq(keuid, old->suid)) in __sys_setresuid()
665 if (suid != (uid_t) -1 && !uid_eq(ksuid, old->uid) && in __sys_setresuid()
666 !uid_eq(ksuid, old->euid) && !uid_eq(ksuid, old->suid)) in __sys_setresuid()
670 if (ruid != (uid_t) -1) { in __sys_setresuid()
671 new->uid = kruid; in __sys_setresuid()
672 if (!uid_eq(kruid, old->uid)) { in __sys_setresuid()
678 if (euid != (uid_t) -1) in __sys_setresuid()
679 new->euid = keuid; in __sys_setresuid()
680 if (suid != (uid_t) -1) in __sys_setresuid()
681 new->suid = ksuid; in __sys_setresuid()
682 new->fsuid = new->euid; in __sys_setresuid()
706 ruid = from_kuid_munged(cred->user_ns, cred->uid); in SYSCALL_DEFINE3()
707 euid = from_kuid_munged(cred->user_ns, cred->euid); in SYSCALL_DEFINE3()
708 suid = from_kuid_munged(cred->user_ns, cred->suid); in SYSCALL_DEFINE3()
734 if ((rgid != (gid_t) -1) && !gid_valid(krgid)) in __sys_setresgid()
735 return -EINVAL; in __sys_setresgid()
736 if ((egid != (gid_t) -1) && !gid_valid(kegid)) in __sys_setresgid()
737 return -EINVAL; in __sys_setresgid()
738 if ((sgid != (gid_t) -1) && !gid_valid(ksgid)) in __sys_setresgid()
739 return -EINVAL; in __sys_setresgid()
743 return -ENOMEM; in __sys_setresgid()
746 retval = -EPERM; in __sys_setresgid()
747 if (!ns_capable_setid(old->user_ns, CAP_SETGID)) { in __sys_setresgid()
748 if (rgid != (gid_t) -1 && !gid_eq(krgid, old->gid) && in __sys_setresgid()
749 !gid_eq(krgid, old->egid) && !gid_eq(krgid, old->sgid)) in __sys_setresgid()
751 if (egid != (gid_t) -1 && !gid_eq(kegid, old->gid) && in __sys_setresgid()
752 !gid_eq(kegid, old->egid) && !gid_eq(kegid, old->sgid)) in __sys_setresgid()
754 if (sgid != (gid_t) -1 && !gid_eq(ksgid, old->gid) && in __sys_setresgid()
755 !gid_eq(ksgid, old->egid) && !gid_eq(ksgid, old->sgid)) in __sys_setresgid()
759 if (rgid != (gid_t) -1) in __sys_setresgid()
760 new->gid = krgid; in __sys_setresgid()
761 if (egid != (gid_t) -1) in __sys_setresgid()
762 new->egid = kegid; in __sys_setresgid()
763 if (sgid != (gid_t) -1) in __sys_setresgid()
764 new->sgid = ksgid; in __sys_setresgid()
765 new->fsgid = new->egid; in __sys_setresgid()
789 rgid = from_kgid_munged(cred->user_ns, cred->gid); in SYSCALL_DEFINE3()
790 egid = from_kgid_munged(cred->user_ns, cred->egid); in SYSCALL_DEFINE3()
791 sgid = from_kgid_munged(cred->user_ns, cred->sgid); in SYSCALL_DEFINE3()
805 * "setfsuid()" sets the fsuid - the uid used for filesystem checks. This
818 old_fsuid = from_kuid_munged(old->user_ns, old->fsuid); in __sys_setfsuid()
820 kuid = make_kuid(old->user_ns, uid); in __sys_setfsuid()
828 if (uid_eq(kuid, old->uid) || uid_eq(kuid, old->euid) || in __sys_setfsuid()
829 uid_eq(kuid, old->suid) || uid_eq(kuid, old->fsuid) || in __sys_setfsuid()
830 ns_capable_setid(old->user_ns, CAP_SETUID)) { in __sys_setfsuid()
831 if (!uid_eq(kuid, old->fsuid)) { in __sys_setfsuid()
832 new->fsuid = kuid; in __sys_setfsuid()
862 old_fsgid = from_kgid_munged(old->user_ns, old->fsgid); in __sys_setfsgid()
864 kgid = make_kgid(old->user_ns, gid); in __sys_setfsgid()
872 if (gid_eq(kgid, old->gid) || gid_eq(kgid, old->egid) || in __sys_setfsgid()
873 gid_eq(kgid, old->sgid) || gid_eq(kgid, old->fsgid) || in __sys_setfsgid()
874 ns_capable_setid(old->user_ns, CAP_SETGID)) { in __sys_setfsgid()
875 if (!gid_eq(kgid, old->fsgid)) { in __sys_setfsgid()
876 new->fsgid = kgid; in __sys_setfsgid()
897 * sys_getpid - return the thread group id of the current process
903 * This is SMP safe as current->tgid does not change.
910 /* Thread ID - the internal kernel "pid" */
917 * Accessing ->real_parent is not SMP-safe, it could
919 * value of ->real_parent under rcu_read_lock(), see
920 * release_task()->call_rcu(delayed_put_task_struct).
927 pid = task_tgid_vnr(rcu_dereference(current->real_parent)); in SYSCALL_DEFINE0()
935 /* Only we change this so SMP safe */ in SYSCALL_DEFINE0()
941 /* Only we change this so SMP safe */ in SYSCALL_DEFINE0()
947 /* Only we change this so SMP safe */ in SYSCALL_DEFINE0()
953 /* Only we change this so SMP safe */ in SYSCALL_DEFINE0()
962 cutime = current->signal->cutime; in do_sys_times()
963 cstime = current->signal->cstime; in do_sys_times()
964 tms->tms_utime = nsec_to_clock_t(tgutime); in do_sys_times()
965 tms->tms_stime = nsec_to_clock_t(tgstime); in do_sys_times()
966 tms->tms_cutime = nsec_to_clock_t(cutime); in do_sys_times()
967 tms->tms_cstime = nsec_to_clock_t(cstime); in do_sys_times()
977 return -EFAULT; in SYSCALL_DEFINE1()
1002 return -EFAULT; in COMPAT_SYSCALL_DEFINE1()
1015 * only important on a multi-user system anyway, to make sure one user
1016 * can't send a signal to a process owned by another. -TYT, 12/12/91
1023 struct task_struct *group_leader = current->group_leader; in SYSCALL_DEFINE2()
1032 return -EINVAL; in SYSCALL_DEFINE2()
1036 * so that our parent does not change from under us. -DaveM in SYSCALL_DEFINE2()
1040 err = -ESRCH; in SYSCALL_DEFINE2()
1045 err = -EINVAL; in SYSCALL_DEFINE2()
1049 if (same_thread_group(p->real_parent, group_leader)) { in SYSCALL_DEFINE2()
1050 err = -EPERM; in SYSCALL_DEFINE2()
1053 err = -EACCES; in SYSCALL_DEFINE2()
1054 if (!(p->flags & PF_FORKNOEXEC)) in SYSCALL_DEFINE2()
1057 err = -ESRCH; in SYSCALL_DEFINE2()
1062 err = -EPERM; in SYSCALL_DEFINE2()
1063 if (p->signal->leader) in SYSCALL_DEFINE2()
1085 /* All paths lead to here, thus we are safe. -DaveM */ in SYSCALL_DEFINE2()
1101 retval = -ESRCH; in do_getpgid()
1143 retval = -ESRCH; in SYSCALL_DEFINE1()
1163 struct task_struct *curr = current->group_leader; in set_special_pids()
1174 struct task_struct *group_leader = current->group_leader; in ksys_setsid()
1177 int err = -EPERM; in ksys_setsid()
1181 if (group_leader->signal->leader) in ksys_setsid()
1190 group_leader->signal->leader = 1; in ksys_setsid()
1214 (personality(current->personality) == PER_LINUX32 && \
1215 copy_to_user(name->machine, COMPAT_UTS_MACHINE, \
1231 if (current->personality & UNAME26) { in override_release()
1261 return -EFAULT; in SYSCALL_DEFINE1()
1263 if (override_release(name->release, sizeof(name->release))) in SYSCALL_DEFINE1()
1264 return -EFAULT; in SYSCALL_DEFINE1()
1266 return -EFAULT; in SYSCALL_DEFINE1()
1279 return -EFAULT; in SYSCALL_DEFINE1()
1285 return -EFAULT; in SYSCALL_DEFINE1()
1287 if (override_release(name->release, sizeof(name->release))) in SYSCALL_DEFINE1()
1288 return -EFAULT; in SYSCALL_DEFINE1()
1290 return -EFAULT; in SYSCALL_DEFINE1()
1299 return -EFAULT; in SYSCALL_DEFINE1()
1304 memcpy(&tmp.sysname, &utsname()->sysname, __OLD_UTS_LEN); in SYSCALL_DEFINE1()
1305 memcpy(&tmp.nodename, &utsname()->nodename, __OLD_UTS_LEN); in SYSCALL_DEFINE1()
1306 memcpy(&tmp.release, &utsname()->release, __OLD_UTS_LEN); in SYSCALL_DEFINE1()
1307 memcpy(&tmp.version, &utsname()->version, __OLD_UTS_LEN); in SYSCALL_DEFINE1()
1308 memcpy(&tmp.machine, &utsname()->machine, __OLD_UTS_LEN); in SYSCALL_DEFINE1()
1311 return -EFAULT; in SYSCALL_DEFINE1()
1314 return -EFAULT; in SYSCALL_DEFINE1()
1315 if (override_release(name->release, sizeof(name->release))) in SYSCALL_DEFINE1()
1316 return -EFAULT; in SYSCALL_DEFINE1()
1326 if (!ns_capable(current->nsproxy->uts_ns->user_ns, CAP_SYS_ADMIN)) in SYSCALL_DEFINE2()
1327 return -EPERM; in SYSCALL_DEFINE2()
1330 return -EINVAL; in SYSCALL_DEFINE2()
1331 errno = -EFAULT; in SYSCALL_DEFINE2()
1337 memcpy(u->nodename, tmp, len); in SYSCALL_DEFINE2()
1338 memset(u->nodename + len, 0, sizeof(u->nodename) - len); in SYSCALL_DEFINE2()
1355 return -EINVAL; in SYSCALL_DEFINE2()
1358 i = 1 + strlen(u->nodename); in SYSCALL_DEFINE2()
1361 memcpy(tmp, u->nodename, i); in SYSCALL_DEFINE2()
1364 return -EFAULT; in SYSCALL_DEFINE2()
1379 if (!ns_capable(current->nsproxy->uts_ns->user_ns, CAP_SYS_ADMIN)) in SYSCALL_DEFINE2()
1380 return -EPERM; in SYSCALL_DEFINE2()
1382 return -EINVAL; in SYSCALL_DEFINE2()
1384 errno = -EFAULT; in SYSCALL_DEFINE2()
1390 memcpy(u->domainname, tmp, len); in SYSCALL_DEFINE2()
1391 memset(u->domainname + len, 0, sizeof(u->domainname) - len); in SYSCALL_DEFINE2()
1406 ret = copy_to_user(rlim, &value, sizeof(*rlim)) ? -EFAULT : 0; in SYSCALL_DEFINE2()
1420 return -EFAULT; in COMPAT_SYSCALL_DEFINE2()
1452 return -EFAULT; in COMPAT_SYSCALL_DEFINE2()
1469 return -EINVAL; in SYSCALL_DEFINE2()
1472 task_lock(current->group_leader); in SYSCALL_DEFINE2()
1473 x = current->signal->rlim[resource]; in SYSCALL_DEFINE2()
1474 task_unlock(current->group_leader); in SYSCALL_DEFINE2()
1479 return copy_to_user(rlim, &x, sizeof(x)) ? -EFAULT : 0; in SYSCALL_DEFINE2()
1489 return -EINVAL; in COMPAT_SYSCALL_DEFINE2()
1492 task_lock(current->group_leader); in COMPAT_SYSCALL_DEFINE2()
1493 r = current->signal->rlim[resource]; in COMPAT_SYSCALL_DEFINE2()
1494 task_unlock(current->group_leader); in COMPAT_SYSCALL_DEFINE2()
1500 if (put_user(r.rlim_cur, &rlim->rlim_cur) || in COMPAT_SYSCALL_DEFINE2()
1501 put_user(r.rlim_max, &rlim->rlim_max)) in COMPAT_SYSCALL_DEFINE2()
1502 return -EFAULT; in COMPAT_SYSCALL_DEFINE2()
1520 if (rlim->rlim_cur == RLIM_INFINITY) in rlim_to_rlim64()
1521 rlim64->rlim_cur = RLIM64_INFINITY; in rlim_to_rlim64()
1523 rlim64->rlim_cur = rlim->rlim_cur; in rlim_to_rlim64()
1524 if (rlim->rlim_max == RLIM_INFINITY) in rlim_to_rlim64()
1525 rlim64->rlim_max = RLIM64_INFINITY; in rlim_to_rlim64()
1527 rlim64->rlim_max = rlim->rlim_max; in rlim_to_rlim64()
1532 if (rlim64_is_infinity(rlim64->rlim_cur)) in rlim64_to_rlim()
1533 rlim->rlim_cur = RLIM_INFINITY; in rlim64_to_rlim()
1535 rlim->rlim_cur = (unsigned long)rlim64->rlim_cur; in rlim64_to_rlim()
1536 if (rlim64_is_infinity(rlim64->rlim_max)) in rlim64_to_rlim()
1537 rlim->rlim_max = RLIM_INFINITY; in rlim64_to_rlim()
1539 rlim->rlim_max = (unsigned long)rlim64->rlim_max; in rlim64_to_rlim()
1550 return -EINVAL; in do_prlimit()
1552 if (new_rlim->rlim_cur > new_rlim->rlim_max) in do_prlimit()
1553 return -EINVAL; in do_prlimit()
1555 new_rlim->rlim_max > sysctl_nr_open) in do_prlimit()
1556 return -EPERM; in do_prlimit()
1559 /* protect tsk->signal and tsk->sighand from disappearing */ in do_prlimit()
1561 if (!tsk->sighand) { in do_prlimit()
1562 retval = -ESRCH; in do_prlimit()
1566 rlim = tsk->signal->rlim + resource; in do_prlimit()
1567 task_lock(tsk->group_leader); in do_prlimit()
1569 /* Keep the capable check against init_user_ns until in do_prlimit()
1571 if (new_rlim->rlim_max > rlim->rlim_max && in do_prlimit()
1572 !capable(CAP_SYS_RESOURCE)) in do_prlimit()
1573 retval = -EPERM; in do_prlimit()
1583 task_unlock(tsk->group_leader); in do_prlimit()
1591 new_rlim->rlim_cur != RLIM_INFINITY && in do_prlimit()
1593 update_rlimit_cpu(tsk, new_rlim->rlim_cur); in do_prlimit()
1610 id_match = (uid_eq(cred->uid, tcred->euid) && in check_prlimit_permission()
1611 uid_eq(cred->uid, tcred->suid) && in check_prlimit_permission()
1612 uid_eq(cred->uid, tcred->uid) && in check_prlimit_permission()
1613 gid_eq(cred->gid, tcred->egid) && in check_prlimit_permission()
1614 gid_eq(cred->gid, tcred->sgid) && in check_prlimit_permission()
1615 gid_eq(cred->gid, tcred->gid)); in check_prlimit_permission()
1616 if (!id_match && !ns_capable(tcred->user_ns, CAP_SYS_RESOURCE)) in check_prlimit_permission()
1617 return -EPERM; in check_prlimit_permission()
1637 return -EFAULT; in SYSCALL_DEFINE4()
1646 return -ESRCH; in SYSCALL_DEFINE4()
1662 ret = -EFAULT; in SYSCALL_DEFINE4()
1674 return -EFAULT; in SYSCALL_DEFINE2()
1686 * When sampling multiple threads for RUSAGE_SELF, under SMP we might have
1690 * the c* fields from p->signal from races with exit.c updating those
1696 * for the cases current multithreaded, non-current single threaded
1697 * non-current multithreaded. Thread traversal is now safe with
1701 * else can reap the children to update signal->c* counters, and no one else
1702 * can race with the signal-> fields. If we do not take any lock, the
1703 * signal-> fields could be read out of order while another thread was just
1706 * as __exit_signal releases the siglock spinlock after updating the signal->
1713 r->ru_nvcsw += t->nvcsw; in accumulate_thread_rusage()
1714 r->ru_nivcsw += t->nivcsw; in accumulate_thread_rusage()
1715 r->ru_minflt += t->min_flt; in accumulate_thread_rusage()
1716 r->ru_majflt += t->maj_flt; in accumulate_thread_rusage()
1717 r->ru_inblock += task_io_get_inblock(t); in accumulate_thread_rusage()
1718 r->ru_oublock += task_io_get_oublock(t); in accumulate_thread_rusage()
1734 maxrss = p->signal->maxrss; in getrusage()
1744 utime = p->signal->cutime; in getrusage()
1745 stime = p->signal->cstime; in getrusage()
1746 r->ru_nvcsw = p->signal->cnvcsw; in getrusage()
1747 r->ru_nivcsw = p->signal->cnivcsw; in getrusage()
1748 r->ru_minflt = p->signal->cmin_flt; in getrusage()
1749 r->ru_majflt = p->signal->cmaj_flt; in getrusage()
1750 r->ru_inblock = p->signal->cinblock; in getrusage()
1751 r->ru_oublock = p->signal->coublock; in getrusage()
1752 maxrss = p->signal->cmaxrss; in getrusage()
1762 r->ru_nvcsw += p->signal->nvcsw; in getrusage()
1763 r->ru_nivcsw += p->signal->nivcsw; in getrusage()
1764 r->ru_minflt += p->signal->min_flt; in getrusage()
1765 r->ru_majflt += p->signal->maj_flt; in getrusage()
1766 r->ru_inblock += p->signal->inblock; in getrusage()
1767 r->ru_oublock += p->signal->oublock; in getrusage()
1768 if (maxrss < p->signal->maxrss) in getrusage()
1769 maxrss = p->signal->maxrss; in getrusage()
1782 r->ru_utime = ns_to_kernel_old_timeval(utime); in getrusage()
1783 r->ru_stime = ns_to_kernel_old_timeval(stime); in getrusage()
1793 r->ru_maxrss = maxrss * (PAGE_SIZE / 1024); /* convert pages to KBs */ in getrusage()
1802 return -EINVAL; in SYSCALL_DEFINE2()
1805 return copy_to_user(ru, &r, sizeof(r)) ? -EFAULT : 0; in SYSCALL_DEFINE2()
1815 return -EINVAL; in COMPAT_SYSCALL_DEFINE2()
1824 mask = xchg(&current->fs->umask, mask & S_IRWXUGO); in SYSCALL_DEFINE1()
1837 return -EBADF; in prctl_set_mm_exe_file()
1842 * Because the original mm->exe_file points to executable file, make in prctl_set_mm_exe_file()
1846 err = -EACCES; in prctl_set_mm_exe_file()
1847 if (!S_ISREG(inode->i_mode) || path_noexec(&exe.file->f_path)) in prctl_set_mm_exe_file()
1855 * Forbid mm->exe_file change if old file still mapped. in prctl_set_mm_exe_file()
1858 err = -EBUSY; in prctl_set_mm_exe_file()
1863 for (vma = mm->mmap; vma; vma = vma->vm_next) { in prctl_set_mm_exe_file()
1864 if (!vma->vm_file) in prctl_set_mm_exe_file()
1866 if (path_equal(&vma->vm_file->f_path, in prctl_set_mm_exe_file()
1867 &exe_file->f_path)) in prctl_set_mm_exe_file()
1878 old_exe = xchg(&mm->exe_file, exe.file); in prctl_set_mm_exe_file()
1899 int error = -EINVAL, i; in validate_prctl_map_addr()
1931 ((unsigned long)prctl_map->__m1 __op \ in validate_prctl_map_addr()
1932 (unsigned long)prctl_map->__m2) ? 0 : -EINVAL in validate_prctl_map_addr()
1942 error = -EINVAL; in validate_prctl_map_addr()
1947 if (prctl_map->start_brk <= prctl_map->end_data || in validate_prctl_map_addr()
1948 prctl_map->brk <= prctl_map->end_data) in validate_prctl_map_addr()
1954 if (check_data_rlimit(rlimit(RLIMIT_DATA), prctl_map->brk, in validate_prctl_map_addr()
1955 prctl_map->start_brk, prctl_map->end_data, in validate_prctl_map_addr()
1956 prctl_map->start_data)) in validate_prctl_map_addr()
1967 struct prctl_mm_map prctl_map = { .exe_fd = (u32)-1, }; in prctl_set_mm_map()
1969 struct mm_struct *mm = current->mm; in prctl_set_mm_map()
1972 BUILD_BUG_ON(sizeof(user_auxv) != sizeof(mm->saved_auxv)); in prctl_set_mm_map()
1980 return -EINVAL; in prctl_set_mm_map()
1983 return -EFAULT; in prctl_set_mm_map()
1994 prctl_map.auxv_size > sizeof(mm->saved_auxv)) in prctl_set_mm_map()
1995 return -EINVAL; in prctl_set_mm_map()
2001 return -EFAULT; in prctl_set_mm_map()
2004 user_auxv[AT_VECTOR_SIZE - 2] = AT_NULL; in prctl_set_mm_map()
2005 user_auxv[AT_VECTOR_SIZE - 1] = AT_NULL; in prctl_set_mm_map()
2008 if (prctl_map.exe_fd != (u32)-1) { in prctl_set_mm_map()
2010 * Check if the current user is checkpoint/restore capable. in prctl_set_mm_map()
2018 return -EPERM; in prctl_set_mm_map()
2037 * - @start_brk/@brk which are used in do_brk_flags but kernel lookups in prctl_set_mm_map()
2043 spin_lock(&mm->arg_lock); in prctl_set_mm_map()
2044 mm->start_code = prctl_map.start_code; in prctl_set_mm_map()
2045 mm->end_code = prctl_map.end_code; in prctl_set_mm_map()
2046 mm->start_data = prctl_map.start_data; in prctl_set_mm_map()
2047 mm->end_data = prctl_map.end_data; in prctl_set_mm_map()
2048 mm->start_brk = prctl_map.start_brk; in prctl_set_mm_map()
2049 mm->brk = prctl_map.brk; in prctl_set_mm_map()
2050 mm->start_stack = prctl_map.start_stack; in prctl_set_mm_map()
2051 mm->arg_start = prctl_map.arg_start; in prctl_set_mm_map()
2052 mm->arg_end = prctl_map.arg_end; in prctl_set_mm_map()
2053 mm->env_start = prctl_map.env_start; in prctl_set_mm_map()
2054 mm->env_end = prctl_map.env_end; in prctl_set_mm_map()
2055 spin_unlock(&mm->arg_lock); in prctl_set_mm_map()
2060 * updating -- it may get partly updated results. It's in prctl_set_mm_map()
2066 memcpy(mm->saved_auxv, user_auxv, sizeof(user_auxv)); in prctl_set_mm_map()
2085 return -EINVAL; in prctl_set_auxv()
2088 return -EFAULT; in prctl_set_auxv()
2091 user_auxv[AT_VECTOR_SIZE - 2] = 0; in prctl_set_auxv()
2092 user_auxv[AT_VECTOR_SIZE - 1] = 0; in prctl_set_auxv()
2094 BUILD_BUG_ON(sizeof(user_auxv) != sizeof(mm->saved_auxv)); in prctl_set_auxv()
2097 memcpy(mm->saved_auxv, user_auxv, len); in prctl_set_auxv()
2106 struct mm_struct *mm = current->mm; in prctl_set_mm()
2110 .exe_fd = -1, in prctl_set_mm()
2118 return -EINVAL; in prctl_set_mm()
2125 if (!capable(CAP_SYS_RESOURCE)) in prctl_set_mm()
2126 return -EPERM; in prctl_set_mm()
2135 return -EINVAL; in prctl_set_mm()
2137 error = -EINVAL; in prctl_set_mm()
2147 spin_lock(&mm->arg_lock); in prctl_set_mm()
2148 prctl_map.start_code = mm->start_code; in prctl_set_mm()
2149 prctl_map.end_code = mm->end_code; in prctl_set_mm()
2150 prctl_map.start_data = mm->start_data; in prctl_set_mm()
2151 prctl_map.end_data = mm->end_data; in prctl_set_mm()
2152 prctl_map.start_brk = mm->start_brk; in prctl_set_mm()
2153 prctl_map.brk = mm->brk; in prctl_set_mm()
2154 prctl_map.start_stack = mm->start_stack; in prctl_set_mm()
2155 prctl_map.arg_start = mm->arg_start; in prctl_set_mm()
2156 prctl_map.arg_end = mm->arg_end; in prctl_set_mm()
2157 prctl_map.env_start = mm->env_start; in prctl_set_mm()
2158 prctl_map.env_end = mm->env_end; in prctl_set_mm()
2216 error = -EFAULT; in prctl_set_mm()
2221 mm->start_code = prctl_map.start_code; in prctl_set_mm()
2222 mm->end_code = prctl_map.end_code; in prctl_set_mm()
2223 mm->start_data = prctl_map.start_data; in prctl_set_mm()
2224 mm->end_data = prctl_map.end_data; in prctl_set_mm()
2225 mm->start_brk = prctl_map.start_brk; in prctl_set_mm()
2226 mm->brk = prctl_map.brk; in prctl_set_mm()
2227 mm->start_stack = prctl_map.start_stack; in prctl_set_mm()
2228 mm->arg_start = prctl_map.arg_start; in prctl_set_mm()
2229 mm->arg_end = prctl_map.arg_end; in prctl_set_mm()
2230 mm->env_start = prctl_map.env_start; in prctl_set_mm()
2231 mm->env_end = prctl_map.env_end; in prctl_set_mm()
2235 spin_unlock(&mm->arg_lock); in prctl_set_mm()
2243 return put_user(me->clear_child_tid, tid_addr); in prctl_get_tid_address()
2248 return -EINVAL; in prctl_get_tid_address()
2255 * If task has has_child_subreaper - all its decendants in propagate_has_child_subreaper()
2259 * If we've found child_reaper - skip descendants in in propagate_has_child_subreaper()
2262 if (p->signal->has_child_subreaper || in propagate_has_child_subreaper()
2266 p->signal->has_child_subreaper = 1; in propagate_has_child_subreaper()
2272 return -EINVAL; in arch_prctl_spec_ctrl_get()
2278 return -EINVAL; in arch_prctl_spec_ctrl_set()
2287 unsigned char comm[sizeof(me->comm)]; in SYSCALL_DEFINE5()
2291 if (error != -ENOSYS) in SYSCALL_DEFINE5()
2298 error = -EINVAL; in SYSCALL_DEFINE5()
2301 me->pdeath_signal = arg2; in SYSCALL_DEFINE5()
2304 error = put_user(me->pdeath_signal, (int __user *)arg2); in SYSCALL_DEFINE5()
2307 error = get_dumpable(me->mm); in SYSCALL_DEFINE5()
2311 error = -EINVAL; in SYSCALL_DEFINE5()
2314 set_dumpable(me->mm, arg2); in SYSCALL_DEFINE5()
2340 error = -EINVAL; in SYSCALL_DEFINE5()
2343 comm[sizeof(me->comm) - 1] = 0; in SYSCALL_DEFINE5()
2345 sizeof(me->comm) - 1) < 0) in SYSCALL_DEFINE5()
2346 return -EFAULT; in SYSCALL_DEFINE5()
2353 return -EFAULT; in SYSCALL_DEFINE5()
2380 if (current->timer_slack_ns > ULONG_MAX) in SYSCALL_DEFINE5()
2383 error = current->timer_slack_ns; in SYSCALL_DEFINE5()
2387 current->timer_slack_ns = in SYSCALL_DEFINE5()
2388 current->default_timer_slack_ns; in SYSCALL_DEFINE5()
2390 current->timer_slack_ns = arg2; in SYSCALL_DEFINE5()
2394 return -EINVAL; in SYSCALL_DEFINE5()
2398 return -EINVAL; in SYSCALL_DEFINE5()
2399 current->flags &= ~PF_MCE_PROCESS; in SYSCALL_DEFINE5()
2402 current->flags |= PF_MCE_PROCESS; in SYSCALL_DEFINE5()
2404 current->flags |= PF_MCE_EARLY; in SYSCALL_DEFINE5()
2406 current->flags &= ~PF_MCE_EARLY; in SYSCALL_DEFINE5()
2408 current->flags &= in SYSCALL_DEFINE5()
2411 return -EINVAL; in SYSCALL_DEFINE5()
2414 return -EINVAL; in SYSCALL_DEFINE5()
2419 return -EINVAL; in SYSCALL_DEFINE5()
2420 if (current->flags & PF_MCE_PROCESS) in SYSCALL_DEFINE5()
2421 error = (current->flags & PF_MCE_EARLY) ? in SYSCALL_DEFINE5()
2433 me->signal->is_child_subreaper = !!arg2; in SYSCALL_DEFINE5()
2440 error = put_user(me->signal->is_child_subreaper, in SYSCALL_DEFINE5()
2445 return -EINVAL; in SYSCALL_DEFINE5()
2451 return -EINVAL; in SYSCALL_DEFINE5()
2455 return -EINVAL; in SYSCALL_DEFINE5()
2456 error = !!test_bit(MMF_DISABLE_THP, &me->mm->flags); in SYSCALL_DEFINE5()
2460 return -EINVAL; in SYSCALL_DEFINE5()
2461 if (mmap_write_lock_killable(me->mm)) in SYSCALL_DEFINE5()
2462 return -EINTR; in SYSCALL_DEFINE5()
2464 set_bit(MMF_DISABLE_THP, &me->mm->flags); in SYSCALL_DEFINE5()
2466 clear_bit(MMF_DISABLE_THP, &me->mm->flags); in SYSCALL_DEFINE5()
2467 mmap_write_unlock(me->mm); in SYSCALL_DEFINE5()
2472 return -EINVAL; in SYSCALL_DEFINE5()
2487 return -EINVAL; in SYSCALL_DEFINE5()
2492 return -EINVAL; in SYSCALL_DEFINE5()
2497 return -EINVAL; in SYSCALL_DEFINE5()
2502 return -EINVAL; in SYSCALL_DEFINE5()
2507 return -EINVAL; in SYSCALL_DEFINE5()
2511 if (!capable(CAP_SYS_RESOURCE)) in SYSCALL_DEFINE5()
2512 return -EPERM; in SYSCALL_DEFINE5()
2515 return -EINVAL; in SYSCALL_DEFINE5()
2518 current->flags |= PR_IO_FLUSHER; in SYSCALL_DEFINE5()
2520 current->flags &= ~PR_IO_FLUSHER; in SYSCALL_DEFINE5()
2522 return -EINVAL; in SYSCALL_DEFINE5()
2525 if (!capable(CAP_SYS_RESOURCE)) in SYSCALL_DEFINE5()
2526 return -EPERM; in SYSCALL_DEFINE5()
2529 return -EINVAL; in SYSCALL_DEFINE5()
2531 error = (current->flags & PR_IO_FLUSHER) == PR_IO_FLUSHER; in SYSCALL_DEFINE5()
2534 error = -EINVAL; in SYSCALL_DEFINE5()
2550 return err ? -EFAULT : 0; in SYSCALL_DEFINE3()
2554 * do_sysinfo - fill in sysinfo struct
2567 info->uptime = tp.tv_sec + (tp.tv_nsec ? 1 : 0); in do_sysinfo()
2569 get_avenrun(info->loads, 0, SI_LOAD_SHIFT - FSHIFT); in do_sysinfo()
2571 info->procs = nr_threads; in do_sysinfo()
2582 * -Erik Andersen <andersee@debian.org> in do_sysinfo()
2585 mem_total = info->totalram + info->totalswap; in do_sysinfo()
2586 if (mem_total < info->totalram || mem_total < info->totalswap) in do_sysinfo()
2589 mem_unit = info->mem_unit; in do_sysinfo()
2601 * info->mem_unit and set it to 1. This leaves things compatible in do_sysinfo()
2606 info->mem_unit = 1; in do_sysinfo()
2607 info->totalram <<= bitcount; in do_sysinfo()
2608 info->freeram <<= bitcount; in do_sysinfo()
2609 info->sharedram <<= bitcount; in do_sysinfo()
2610 info->bufferram <<= bitcount; in do_sysinfo()
2611 info->totalswap <<= bitcount; in do_sysinfo()
2612 info->freeswap <<= bitcount; in do_sysinfo()
2613 info->totalhigh <<= bitcount; in do_sysinfo()
2614 info->freehigh <<= bitcount; in do_sysinfo()
2627 return -EFAULT; in SYSCALL_DEFINE1()
2647 char _f[20-2*sizeof(u32)-sizeof(int)];
2657 /* Check to see if any memory value is too large for 32-bit and scale in COMPAT_SYSCALL_DEFINE1()
2694 return -EFAULT; in COMPAT_SYSCALL_DEFINE1()