1
2
3
4
5
6
7#include <linux/export.h>
8#include <linux/mm.h>
9#include <linux/utsname.h>
10#include <linux/mman.h>
11#include <linux/reboot.h>
12#include <linux/prctl.h>
13#include <linux/highuid.h>
14#include <linux/fs.h>
15#include <linux/kmod.h>
16#include <linux/perf_event.h>
17#include <linux/resource.h>
18#include <linux/kernel.h>
19#include <linux/kexec.h>
20#include <linux/workqueue.h>
21#include <linux/capability.h>
22#include <linux/device.h>
23#include <linux/key.h>
24#include <linux/times.h>
25#include <linux/posix-timers.h>
26#include <linux/security.h>
27#include <linux/dcookies.h>
28#include <linux/suspend.h>
29#include <linux/tty.h>
30#include <linux/signal.h>
31#include <linux/cn_proc.h>
32#include <linux/getcpu.h>
33#include <linux/task_io_accounting_ops.h>
34#include <linux/seccomp.h>
35#include <linux/cpu.h>
36#include <linux/personality.h>
37#include <linux/ptrace.h>
38#include <linux/fs_struct.h>
39#include <linux/gfp.h>
40#include <linux/syscore_ops.h>
41#include <linux/version.h>
42#include <linux/ctype.h>
43
44#include <linux/compat.h>
45#include <linux/syscalls.h>
46#include <linux/kprobes.h>
47#include <linux/user_namespace.h>
48
49#include <linux/kmsg_dump.h>
50
51#include <generated/utsrelease.h>
52
53#include <asm/uaccess.h>
54#include <asm/io.h>
55#include <asm/unistd.h>
56
57#ifndef SET_UNALIGN_CTL
58# define SET_UNALIGN_CTL(a,b) (-EINVAL)
59#endif
60#ifndef GET_UNALIGN_CTL
61# define GET_UNALIGN_CTL(a,b) (-EINVAL)
62#endif
63#ifndef SET_FPEMU_CTL
64# define SET_FPEMU_CTL(a,b) (-EINVAL)
65#endif
66#ifndef GET_FPEMU_CTL
67# define GET_FPEMU_CTL(a,b) (-EINVAL)
68#endif
69#ifndef SET_FPEXC_CTL
70# define SET_FPEXC_CTL(a,b) (-EINVAL)
71#endif
72#ifndef GET_FPEXC_CTL
73# define GET_FPEXC_CTL(a,b) (-EINVAL)
74#endif
75#ifndef GET_ENDIAN
76# define GET_ENDIAN(a,b) (-EINVAL)
77#endif
78#ifndef SET_ENDIAN
79# define SET_ENDIAN(a,b) (-EINVAL)
80#endif
81#ifndef GET_TSC_CTL
82# define GET_TSC_CTL(a) (-EINVAL)
83#endif
84#ifndef SET_TSC_CTL
85# define SET_TSC_CTL(a) (-EINVAL)
86#endif
87
88
89
90
91
92
93int overflowuid = DEFAULT_OVERFLOWUID;
94int overflowgid = DEFAULT_OVERFLOWGID;
95
96#ifdef CONFIG_UID16
97EXPORT_SYMBOL(overflowuid);
98EXPORT_SYMBOL(overflowgid);
99#endif
100
101
102
103
104
105
106int fs_overflowuid = DEFAULT_FS_OVERFLOWUID;
107int fs_overflowgid = DEFAULT_FS_OVERFLOWUID;
108
109EXPORT_SYMBOL(fs_overflowuid);
110EXPORT_SYMBOL(fs_overflowgid);
111
112
113
114
115
116int C_A_D = 1;
117struct pid *cad_pid;
118EXPORT_SYMBOL(cad_pid);
119
120
121
122
123
124void (*pm_power_off_prepare)(void);
125
126
127
128
129
130
131
132static bool set_one_prio_perm(struct task_struct *p)
133{
134 const struct cred *cred = current_cred(), *pcred = __task_cred(p);
135
136 if (pcred->user->user_ns == cred->user->user_ns &&
137 (pcred->uid == cred->euid ||
138 pcred->euid == cred->euid))
139 return true;
140 if (ns_capable(pcred->user->user_ns, CAP_SYS_NICE))
141 return true;
142 return false;
143}
144
145
146
147
148
149static int set_one_prio(struct task_struct *p, int niceval, int error)
150{
151 int no_nice;
152
153 if (!set_one_prio_perm(p)) {
154 error = -EPERM;
155 goto out;
156 }
157 if (niceval < task_nice(p) && !can_nice(p, niceval)) {
158 error = -EACCES;
159 goto out;
160 }
161 no_nice = security_task_setnice(p, niceval);
162 if (no_nice) {
163 error = no_nice;
164 goto out;
165 }
166 if (error == -ESRCH)
167 error = 0;
168 set_user_nice(p, niceval);
169out:
170 return error;
171}
172
173SYSCALL_DEFINE3(setpriority, int, which, int, who, int, niceval)
174{
175 struct task_struct *g, *p;
176 struct user_struct *user;
177 const struct cred *cred = current_cred();
178 int error = -EINVAL;
179 struct pid *pgrp;
180
181 if (which > PRIO_USER || which < PRIO_PROCESS)
182 goto out;
183
184
185 error = -ESRCH;
186 if (niceval < -20)
187 niceval = -20;
188 if (niceval > 19)
189 niceval = 19;
190
191 rcu_read_lock();
192 read_lock(&tasklist_lock);
193 switch (which) {
194 case PRIO_PROCESS:
195 if (who)
196 p = find_task_by_vpid(who);
197 else
198 p = current;
199 if (p)
200 error = set_one_prio(p, niceval, error);
201 break;
202 case PRIO_PGRP:
203 if (who)
204 pgrp = find_vpid(who);
205 else
206 pgrp = task_pgrp(current);
207 do_each_pid_thread(pgrp, PIDTYPE_PGID, p) {
208 error = set_one_prio(p, niceval, error);
209 } while_each_pid_thread(pgrp, PIDTYPE_PGID, p);
210 break;
211 case PRIO_USER:
212 user = (struct user_struct *) cred->user;
213 if (!who)
214 who = cred->uid;
215 else if ((who != cred->uid) &&
216 !(user = find_user(who)))
217 goto out_unlock;
218
219 do_each_thread(g, p) {
220 if (__task_cred(p)->uid == who)
221 error = set_one_prio(p, niceval, error);
222 } while_each_thread(g, p);
223 if (who != cred->uid)
224 free_uid(user);
225 break;
226 }
227out_unlock:
228 read_unlock(&tasklist_lock);
229 rcu_read_unlock();
230out:
231 return error;
232}
233
234
235
236
237
238
239
240SYSCALL_DEFINE2(getpriority, int, which, int, who)
241{
242 struct task_struct *g, *p;
243 struct user_struct *user;
244 const struct cred *cred = current_cred();
245 long niceval, retval = -ESRCH;
246 struct pid *pgrp;
247
248 if (which > PRIO_USER || which < PRIO_PROCESS)
249 return -EINVAL;
250
251 rcu_read_lock();
252 read_lock(&tasklist_lock);
253 switch (which) {
254 case PRIO_PROCESS:
255 if (who)
256 p = find_task_by_vpid(who);
257 else
258 p = current;
259 if (p) {
260 niceval = 20 - task_nice(p);
261 if (niceval > retval)
262 retval = niceval;
263 }
264 break;
265 case PRIO_PGRP:
266 if (who)
267 pgrp = find_vpid(who);
268 else
269 pgrp = task_pgrp(current);
270 do_each_pid_thread(pgrp, PIDTYPE_PGID, p) {
271 niceval = 20 - task_nice(p);
272 if (niceval > retval)
273 retval = niceval;
274 } while_each_pid_thread(pgrp, PIDTYPE_PGID, p);
275 break;
276 case PRIO_USER:
277 user = (struct user_struct *) cred->user;
278 if (!who)
279 who = cred->uid;
280 else if ((who != cred->uid) &&
281 !(user = find_user(who)))
282 goto out_unlock;
283
284 do_each_thread(g, p) {
285 if (__task_cred(p)->uid == who) {
286 niceval = 20 - task_nice(p);
287 if (niceval > retval)
288 retval = niceval;
289 }
290 } while_each_thread(g, p);
291 if (who != cred->uid)
292 free_uid(user);
293 break;
294 }
295out_unlock:
296 read_unlock(&tasklist_lock);
297 rcu_read_unlock();
298
299 return retval;
300}
301
302
303
304
305
306
307
308
309
310void emergency_restart(void)
311{
312 kmsg_dump(KMSG_DUMP_EMERG);
313 machine_emergency_restart();
314}
315EXPORT_SYMBOL_GPL(emergency_restart);
316
317void kernel_restart_prepare(char *cmd)
318{
319 blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd);
320 system_state = SYSTEM_RESTART;
321 usermodehelper_disable();
322 device_shutdown();
323 syscore_shutdown();
324}
325
326
327
328
329
330
331
332
333
334
335
336int register_reboot_notifier(struct notifier_block *nb)
337{
338 return blocking_notifier_chain_register(&reboot_notifier_list, nb);
339}
340EXPORT_SYMBOL(register_reboot_notifier);
341
342
343
344
345
346
347
348
349
350
351int unregister_reboot_notifier(struct notifier_block *nb)
352{
353 return blocking_notifier_chain_unregister(&reboot_notifier_list, nb);
354}
355EXPORT_SYMBOL(unregister_reboot_notifier);
356
357
358
359
360
361
362
363
364
365void kernel_restart(char *cmd)
366{
367 kernel_restart_prepare(cmd);
368 if (!cmd)
369 printk(KERN_EMERG "Restarting system.\n");
370 else
371 printk(KERN_EMERG "Restarting system with command '%s'.\n", cmd);
372 kmsg_dump(KMSG_DUMP_RESTART);
373 machine_restart(cmd);
374}
375EXPORT_SYMBOL_GPL(kernel_restart);
376
377static void kernel_shutdown_prepare(enum system_states state)
378{
379 blocking_notifier_call_chain(&reboot_notifier_list,
380 (state == SYSTEM_HALT)?SYS_HALT:SYS_POWER_OFF, NULL);
381 system_state = state;
382 usermodehelper_disable();
383 device_shutdown();
384}
385
386
387
388
389
390void kernel_halt(void)
391{
392 kernel_shutdown_prepare(SYSTEM_HALT);
393 syscore_shutdown();
394 printk(KERN_EMERG "System halted.\n");
395 kmsg_dump(KMSG_DUMP_HALT);
396 machine_halt();
397}
398
399EXPORT_SYMBOL_GPL(kernel_halt);
400
401
402
403
404
405
406void kernel_power_off(void)
407{
408 kernel_shutdown_prepare(SYSTEM_POWER_OFF);
409 if (pm_power_off_prepare)
410 pm_power_off_prepare();
411 disable_nonboot_cpus();
412 syscore_shutdown();
413 printk(KERN_EMERG "Power down.\n");
414 kmsg_dump(KMSG_DUMP_POWEROFF);
415 machine_power_off();
416}
417EXPORT_SYMBOL_GPL(kernel_power_off);
418
419static DEFINE_MUTEX(reboot_mutex);
420
421
422
423
424
425
426
427
428
429SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
430 void __user *, arg)
431{
432 char buffer[256];
433 int ret = 0;
434
435
436 if (!capable(CAP_SYS_BOOT))
437 return -EPERM;
438
439
440 if (magic1 != LINUX_REBOOT_MAGIC1 ||
441 (magic2 != LINUX_REBOOT_MAGIC2 &&
442 magic2 != LINUX_REBOOT_MAGIC2A &&
443 magic2 != LINUX_REBOOT_MAGIC2B &&
444 magic2 != LINUX_REBOOT_MAGIC2C))
445 return -EINVAL;
446
447
448
449
450 if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !pm_power_off)
451 cmd = LINUX_REBOOT_CMD_HALT;
452
453 mutex_lock(&reboot_mutex);
454 switch (cmd) {
455 case LINUX_REBOOT_CMD_RESTART:
456 kernel_restart(NULL);
457 break;
458
459 case LINUX_REBOOT_CMD_CAD_ON:
460 C_A_D = 1;
461 break;
462
463 case LINUX_REBOOT_CMD_CAD_OFF:
464 C_A_D = 0;
465 break;
466
467 case LINUX_REBOOT_CMD_HALT:
468 kernel_halt();
469 do_exit(0);
470 panic("cannot halt");
471
472 case LINUX_REBOOT_CMD_POWER_OFF:
473 kernel_power_off();
474 do_exit(0);
475 break;
476
477 case LINUX_REBOOT_CMD_RESTART2:
478 if (strncpy_from_user(&buffer[0], arg, sizeof(buffer) - 1) < 0) {
479 ret = -EFAULT;
480 break;
481 }
482 buffer[sizeof(buffer) - 1] = '\0';
483
484 kernel_restart(buffer);
485 break;
486
487#ifdef CONFIG_KEXEC
488 case LINUX_REBOOT_CMD_KEXEC:
489 ret = kernel_kexec();
490 break;
491#endif
492
493#ifdef CONFIG_HIBERNATION
494 case LINUX_REBOOT_CMD_SW_SUSPEND:
495 ret = hibernate();
496 break;
497#endif
498
499 default:
500 ret = -EINVAL;
501 break;
502 }
503 mutex_unlock(&reboot_mutex);
504 return ret;
505}
506
507static void deferred_cad(struct work_struct *dummy)
508{
509 kernel_restart(NULL);
510}
511
512
513
514
515
516
517void ctrl_alt_del(void)
518{
519 static DECLARE_WORK(cad_work, deferred_cad);
520
521 if (C_A_D)
522 schedule_work(&cad_work);
523 else
524 kill_cad_pid(SIGINT, 1);
525}
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545SYSCALL_DEFINE2(setregid, gid_t, rgid, gid_t, egid)
546{
547 const struct cred *old;
548 struct cred *new;
549 int retval;
550
551 new = prepare_creds();
552 if (!new)
553 return -ENOMEM;
554 old = current_cred();
555
556 retval = -EPERM;
557 if (rgid != (gid_t) -1) {
558 if (old->gid == rgid ||
559 old->egid == rgid ||
560 nsown_capable(CAP_SETGID))
561 new->gid = rgid;
562 else
563 goto error;
564 }
565 if (egid != (gid_t) -1) {
566 if (old->gid == egid ||
567 old->egid == egid ||
568 old->sgid == egid ||
569 nsown_capable(CAP_SETGID))
570 new->egid = egid;
571 else
572 goto error;
573 }
574
575 if (rgid != (gid_t) -1 ||
576 (egid != (gid_t) -1 && egid != old->gid))
577 new->sgid = new->egid;
578 new->fsgid = new->egid;
579
580 return commit_creds(new);
581
582error:
583 abort_creds(new);
584 return retval;
585}
586
587
588
589
590
591
592SYSCALL_DEFINE1(setgid, gid_t, gid)
593{
594 const struct cred *old;
595 struct cred *new;
596 int retval;
597
598 new = prepare_creds();
599 if (!new)
600 return -ENOMEM;
601 old = current_cred();
602
603 retval = -EPERM;
604 if (nsown_capable(CAP_SETGID))
605 new->gid = new->egid = new->sgid = new->fsgid = gid;
606 else if (gid == old->gid || gid == old->sgid)
607 new->egid = new->fsgid = gid;
608 else
609 goto error;
610
611 return commit_creds(new);
612
613error:
614 abort_creds(new);
615 return retval;
616}
617
618
619
620
621static int set_user(struct cred *new)
622{
623 struct user_struct *new_user;
624
625 new_user = alloc_uid(current_user_ns(), new->uid);
626 if (!new_user)
627 return -EAGAIN;
628
629
630
631
632
633
634
635
636 if (atomic_read(&new_user->processes) >= rlimit(RLIMIT_NPROC) &&
637 new_user != INIT_USER)
638 current->flags |= PF_NPROC_EXCEEDED;
639 else
640 current->flags &= ~PF_NPROC_EXCEEDED;
641
642 free_uid(new->user);
643 new->user = new_user;
644 return 0;
645}
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662SYSCALL_DEFINE2(setreuid, uid_t, ruid, uid_t, euid)
663{
664 const struct cred *old;
665 struct cred *new;
666 int retval;
667
668 new = prepare_creds();
669 if (!new)
670 return -ENOMEM;
671 old = current_cred();
672
673 retval = -EPERM;
674 if (ruid != (uid_t) -1) {
675 new->uid = ruid;
676 if (old->uid != ruid &&
677 old->euid != ruid &&
678 !nsown_capable(CAP_SETUID))
679 goto error;
680 }
681
682 if (euid != (uid_t) -1) {
683 new->euid = euid;
684 if (old->uid != euid &&
685 old->euid != euid &&
686 old->suid != euid &&
687 !nsown_capable(CAP_SETUID))
688 goto error;
689 }
690
691 if (new->uid != old->uid) {
692 retval = set_user(new);
693 if (retval < 0)
694 goto error;
695 }
696 if (ruid != (uid_t) -1 ||
697 (euid != (uid_t) -1 && euid != old->uid))
698 new->suid = new->euid;
699 new->fsuid = new->euid;
700
701 retval = security_task_fix_setuid(new, old, LSM_SETID_RE);
702 if (retval < 0)
703 goto error;
704
705 return commit_creds(new);
706
707error:
708 abort_creds(new);
709 return retval;
710}
711
712
713
714
715
716
717
718
719
720
721
722
723SYSCALL_DEFINE1(setuid, uid_t, uid)
724{
725 const struct cred *old;
726 struct cred *new;
727 int retval;
728
729 new = prepare_creds();
730 if (!new)
731 return -ENOMEM;
732 old = current_cred();
733
734 retval = -EPERM;
735 if (nsown_capable(CAP_SETUID)) {
736 new->suid = new->uid = uid;
737 if (uid != old->uid) {
738 retval = set_user(new);
739 if (retval < 0)
740 goto error;
741 }
742 } else if (uid != old->uid && uid != new->suid) {
743 goto error;
744 }
745
746 new->fsuid = new->euid = uid;
747
748 retval = security_task_fix_setuid(new, old, LSM_SETID_ID);
749 if (retval < 0)
750 goto error;
751
752 return commit_creds(new);
753
754error:
755 abort_creds(new);
756 return retval;
757}
758
759
760
761
762
763
764SYSCALL_DEFINE3(setresuid, uid_t, ruid, uid_t, euid, uid_t, suid)
765{
766 const struct cred *old;
767 struct cred *new;
768 int retval;
769
770 new = prepare_creds();
771 if (!new)
772 return -ENOMEM;
773
774 old = current_cred();
775
776 retval = -EPERM;
777 if (!nsown_capable(CAP_SETUID)) {
778 if (ruid != (uid_t) -1 && ruid != old->uid &&
779 ruid != old->euid && ruid != old->suid)
780 goto error;
781 if (euid != (uid_t) -1 && euid != old->uid &&
782 euid != old->euid && euid != old->suid)
783 goto error;
784 if (suid != (uid_t) -1 && suid != old->uid &&
785 suid != old->euid && suid != old->suid)
786 goto error;
787 }
788
789 if (ruid != (uid_t) -1) {
790 new->uid = ruid;
791 if (ruid != old->uid) {
792 retval = set_user(new);
793 if (retval < 0)
794 goto error;
795 }
796 }
797 if (euid != (uid_t) -1)
798 new->euid = euid;
799 if (suid != (uid_t) -1)
800 new->suid = suid;
801 new->fsuid = new->euid;
802
803 retval = security_task_fix_setuid(new, old, LSM_SETID_RES);
804 if (retval < 0)
805 goto error;
806
807 return commit_creds(new);
808
809error:
810 abort_creds(new);
811 return retval;
812}
813
814SYSCALL_DEFINE3(getresuid, uid_t __user *, ruid, uid_t __user *, euid, uid_t __user *, suid)
815{
816 const struct cred *cred = current_cred();
817 int retval;
818
819 if (!(retval = put_user(cred->uid, ruid)) &&
820 !(retval = put_user(cred->euid, euid)))
821 retval = put_user(cred->suid, suid);
822
823 return retval;
824}
825
826
827
828
829SYSCALL_DEFINE3(setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid)
830{
831 const struct cred *old;
832 struct cred *new;
833 int retval;
834
835 new = prepare_creds();
836 if (!new)
837 return -ENOMEM;
838 old = current_cred();
839
840 retval = -EPERM;
841 if (!nsown_capable(CAP_SETGID)) {
842 if (rgid != (gid_t) -1 && rgid != old->gid &&
843 rgid != old->egid && rgid != old->sgid)
844 goto error;
845 if (egid != (gid_t) -1 && egid != old->gid &&
846 egid != old->egid && egid != old->sgid)
847 goto error;
848 if (sgid != (gid_t) -1 && sgid != old->gid &&
849 sgid != old->egid && sgid != old->sgid)
850 goto error;
851 }
852
853 if (rgid != (gid_t) -1)
854 new->gid = rgid;
855 if (egid != (gid_t) -1)
856 new->egid = egid;
857 if (sgid != (gid_t) -1)
858 new->sgid = sgid;
859 new->fsgid = new->egid;
860
861 return commit_creds(new);
862
863error:
864 abort_creds(new);
865 return retval;
866}
867
868SYSCALL_DEFINE3(getresgid, gid_t __user *, rgid, gid_t __user *, egid, gid_t __user *, sgid)
869{
870 const struct cred *cred = current_cred();
871 int retval;
872
873 if (!(retval = put_user(cred->gid, rgid)) &&
874 !(retval = put_user(cred->egid, egid)))
875 retval = put_user(cred->sgid, sgid);
876
877 return retval;
878}
879
880
881
882
883
884
885
886
887SYSCALL_DEFINE1(setfsuid, uid_t, uid)
888{
889 const struct cred *old;
890 struct cred *new;
891 uid_t old_fsuid;
892
893 new = prepare_creds();
894 if (!new)
895 return current_fsuid();
896 old = current_cred();
897 old_fsuid = old->fsuid;
898
899 if (uid == old->uid || uid == old->euid ||
900 uid == old->suid || uid == old->fsuid ||
901 nsown_capable(CAP_SETUID)) {
902 if (uid != old_fsuid) {
903 new->fsuid = uid;
904 if (security_task_fix_setuid(new, old, LSM_SETID_FS) == 0)
905 goto change_okay;
906 }
907 }
908
909 abort_creds(new);
910 return old_fsuid;
911
912change_okay:
913 commit_creds(new);
914 return old_fsuid;
915}
916
917
918
919
920SYSCALL_DEFINE1(setfsgid, gid_t, gid)
921{
922 const struct cred *old;
923 struct cred *new;
924 gid_t old_fsgid;
925
926 new = prepare_creds();
927 if (!new)
928 return current_fsgid();
929 old = current_cred();
930 old_fsgid = old->fsgid;
931
932 if (gid == old->gid || gid == old->egid ||
933 gid == old->sgid || gid == old->fsgid ||
934 nsown_capable(CAP_SETGID)) {
935 if (gid != old_fsgid) {
936 new->fsgid = gid;
937 goto change_okay;
938 }
939 }
940
941 abort_creds(new);
942 return old_fsgid;
943
944change_okay:
945 commit_creds(new);
946 return old_fsgid;
947}
948
949void do_sys_times(struct tms *tms)
950{
951 cputime_t tgutime, tgstime, cutime, cstime;
952
953 spin_lock_irq(¤t->sighand->siglock);
954 thread_group_times(current, &tgutime, &tgstime);
955 cutime = current->signal->cutime;
956 cstime = current->signal->cstime;
957 spin_unlock_irq(¤t->sighand->siglock);
958 tms->tms_utime = cputime_to_clock_t(tgutime);
959 tms->tms_stime = cputime_to_clock_t(tgstime);
960 tms->tms_cutime = cputime_to_clock_t(cutime);
961 tms->tms_cstime = cputime_to_clock_t(cstime);
962}
963
964SYSCALL_DEFINE1(times, struct tms __user *, tbuf)
965{
966 if (tbuf) {
967 struct tms tmp;
968
969 do_sys_times(&tmp);
970 if (copy_to_user(tbuf, &tmp, sizeof(struct tms)))
971 return -EFAULT;
972 }
973 force_successful_syscall_return();
974 return (long) jiffies_64_to_clock_t(get_jiffies_64());
975}
976
977
978
979
980
981
982
983
984
985
986
987
988
989SYSCALL_DEFINE2(setpgid, pid_t, pid, pid_t, pgid)
990{
991 struct task_struct *p;
992 struct task_struct *group_leader = current->group_leader;
993 struct pid *pgrp;
994 int err;
995
996 if (!pid)
997 pid = task_pid_vnr(group_leader);
998 if (!pgid)
999 pgid = pid;
1000 if (pgid < 0)
1001 return -EINVAL;
1002 rcu_read_lock();
1003
1004
1005
1006
1007 write_lock_irq(&tasklist_lock);
1008
1009 err = -ESRCH;
1010 p = find_task_by_vpid(pid);
1011 if (!p)
1012 goto out;
1013
1014 err = -EINVAL;
1015 if (!thread_group_leader(p))
1016 goto out;
1017
1018 if (same_thread_group(p->real_parent, group_leader)) {
1019 err = -EPERM;
1020 if (task_session(p) != task_session(group_leader))
1021 goto out;
1022 err = -EACCES;
1023 if (p->did_exec)
1024 goto out;
1025 } else {
1026 err = -ESRCH;
1027 if (p != group_leader)
1028 goto out;
1029 }
1030
1031 err = -EPERM;
1032 if (p->signal->leader)
1033 goto out;
1034
1035 pgrp = task_pid(p);
1036 if (pgid != pid) {
1037 struct task_struct *g;
1038
1039 pgrp = find_vpid(pgid);
1040 g = pid_task(pgrp, PIDTYPE_PGID);
1041 if (!g || task_session(g) != task_session(group_leader))
1042 goto out;
1043 }
1044
1045 err = security_task_setpgid(p, pgid);
1046 if (err)
1047 goto out;
1048
1049 if (task_pgrp(p) != pgrp)
1050 change_pid(p, PIDTYPE_PGID, pgrp);
1051
1052 err = 0;
1053out:
1054
1055 write_unlock_irq(&tasklist_lock);
1056 rcu_read_unlock();
1057 return err;
1058}
1059
1060SYSCALL_DEFINE1(getpgid, pid_t, pid)
1061{
1062 struct task_struct *p;
1063 struct pid *grp;
1064 int retval;
1065
1066 rcu_read_lock();
1067 if (!pid)
1068 grp = task_pgrp(current);
1069 else {
1070 retval = -ESRCH;
1071 p = find_task_by_vpid(pid);
1072 if (!p)
1073 goto out;
1074 grp = task_pgrp(p);
1075 if (!grp)
1076 goto out;
1077
1078 retval = security_task_getpgid(p);
1079 if (retval)
1080 goto out;
1081 }
1082 retval = pid_vnr(grp);
1083out:
1084 rcu_read_unlock();
1085 return retval;
1086}
1087
1088#ifdef __ARCH_WANT_SYS_GETPGRP
1089
1090SYSCALL_DEFINE0(getpgrp)
1091{
1092 return sys_getpgid(0);
1093}
1094
1095#endif
1096
1097SYSCALL_DEFINE1(getsid, pid_t, pid)
1098{
1099 struct task_struct *p;
1100 struct pid *sid;
1101 int retval;
1102
1103 rcu_read_lock();
1104 if (!pid)
1105 sid = task_session(current);
1106 else {
1107 retval = -ESRCH;
1108 p = find_task_by_vpid(pid);
1109 if (!p)
1110 goto out;
1111 sid = task_session(p);
1112 if (!sid)
1113 goto out;
1114
1115 retval = security_task_getsid(p);
1116 if (retval)
1117 goto out;
1118 }
1119 retval = pid_vnr(sid);
1120out:
1121 rcu_read_unlock();
1122 return retval;
1123}
1124
1125SYSCALL_DEFINE0(setsid)
1126{
1127 struct task_struct *group_leader = current->group_leader;
1128 struct pid *sid = task_pid(group_leader);
1129 pid_t session = pid_vnr(sid);
1130 int err = -EPERM;
1131
1132 write_lock_irq(&tasklist_lock);
1133
1134 if (group_leader->signal->leader)
1135 goto out;
1136
1137
1138
1139
1140 if (pid_task(sid, PIDTYPE_PGID))
1141 goto out;
1142
1143 group_leader->signal->leader = 1;
1144 __set_special_pids(sid);
1145
1146 proc_clear_tty(group_leader);
1147
1148 err = session;
1149out:
1150 write_unlock_irq(&tasklist_lock);
1151 if (err > 0) {
1152 proc_sid_connector(group_leader);
1153 sched_autogroup_create_attach(group_leader);
1154 }
1155 return err;
1156}
1157
1158DECLARE_RWSEM(uts_sem);
1159
1160#ifdef COMPAT_UTS_MACHINE
1161#define override_architecture(name) \
1162 (personality(current->personality) == PER_LINUX32 && \
1163 copy_to_user(name->machine, COMPAT_UTS_MACHINE, \
1164 sizeof(COMPAT_UTS_MACHINE)))
1165#else
1166#define override_architecture(name) 0
1167#endif
1168
1169
1170
1171
1172
1173static int override_release(char __user *release, int len)
1174{
1175 int ret = 0;
1176 char buf[65];
1177
1178 if (current->personality & UNAME26) {
1179 char *rest = UTS_RELEASE;
1180 int ndots = 0;
1181 unsigned v;
1182
1183 while (*rest) {
1184 if (*rest == '.' && ++ndots >= 3)
1185 break;
1186 if (!isdigit(*rest) && *rest != '.')
1187 break;
1188 rest++;
1189 }
1190 v = ((LINUX_VERSION_CODE >> 8) & 0xff) + 40;
1191 snprintf(buf, len, "2.6.%u%s", v, rest);
1192 ret = copy_to_user(release, buf, len);
1193 }
1194 return ret;
1195}
1196
1197SYSCALL_DEFINE1(newuname, struct new_utsname __user *, name)
1198{
1199 int errno = 0;
1200
1201 down_read(&uts_sem);
1202 if (copy_to_user(name, utsname(), sizeof *name))
1203 errno = -EFAULT;
1204 up_read(&uts_sem);
1205
1206 if (!errno && override_release(name->release, sizeof(name->release)))
1207 errno = -EFAULT;
1208 if (!errno && override_architecture(name))
1209 errno = -EFAULT;
1210 return errno;
1211}
1212
1213#ifdef __ARCH_WANT_SYS_OLD_UNAME
1214
1215
1216
1217SYSCALL_DEFINE1(uname, struct old_utsname __user *, name)
1218{
1219 int error = 0;
1220
1221 if (!name)
1222 return -EFAULT;
1223
1224 down_read(&uts_sem);
1225 if (copy_to_user(name, utsname(), sizeof(*name)))
1226 error = -EFAULT;
1227 up_read(&uts_sem);
1228
1229 if (!error && override_release(name->release, sizeof(name->release)))
1230 error = -EFAULT;
1231 if (!error && override_architecture(name))
1232 error = -EFAULT;
1233 return error;
1234}
1235
1236SYSCALL_DEFINE1(olduname, struct oldold_utsname __user *, name)
1237{
1238 int error;
1239
1240 if (!name)
1241 return -EFAULT;
1242 if (!access_ok(VERIFY_WRITE, name, sizeof(struct oldold_utsname)))
1243 return -EFAULT;
1244
1245 down_read(&uts_sem);
1246 error = __copy_to_user(&name->sysname, &utsname()->sysname,
1247 __OLD_UTS_LEN);
1248 error |= __put_user(0, name->sysname + __OLD_UTS_LEN);
1249 error |= __copy_to_user(&name->nodename, &utsname()->nodename,
1250 __OLD_UTS_LEN);
1251 error |= __put_user(0, name->nodename + __OLD_UTS_LEN);
1252 error |= __copy_to_user(&name->release, &utsname()->release,
1253 __OLD_UTS_LEN);
1254 error |= __put_user(0, name->release + __OLD_UTS_LEN);
1255 error |= __copy_to_user(&name->version, &utsname()->version,
1256 __OLD_UTS_LEN);
1257 error |= __put_user(0, name->version + __OLD_UTS_LEN);
1258 error |= __copy_to_user(&name->machine, &utsname()->machine,
1259 __OLD_UTS_LEN);
1260 error |= __put_user(0, name->machine + __OLD_UTS_LEN);
1261 up_read(&uts_sem);
1262
1263 if (!error && override_architecture(name))
1264 error = -EFAULT;
1265 if (!error && override_release(name->release, sizeof(name->release)))
1266 error = -EFAULT;
1267 return error ? -EFAULT : 0;
1268}
1269#endif
1270
1271SYSCALL_DEFINE2(sethostname, char __user *, name, int, len)
1272{
1273 int errno;
1274 char tmp[__NEW_UTS_LEN];
1275
1276 if (!ns_capable(current->nsproxy->uts_ns->user_ns, CAP_SYS_ADMIN))
1277 return -EPERM;
1278
1279 if (len < 0 || len > __NEW_UTS_LEN)
1280 return -EINVAL;
1281 down_write(&uts_sem);
1282 errno = -EFAULT;
1283 if (!copy_from_user(tmp, name, len)) {
1284 struct new_utsname *u = utsname();
1285
1286 memcpy(u->nodename, tmp, len);
1287 memset(u->nodename + len, 0, sizeof(u->nodename) - len);
1288 errno = 0;
1289 }
1290 uts_proc_notify(UTS_PROC_HOSTNAME);
1291 up_write(&uts_sem);
1292 return errno;
1293}
1294
1295#ifdef __ARCH_WANT_SYS_GETHOSTNAME
1296
1297SYSCALL_DEFINE2(gethostname, char __user *, name, int, len)
1298{
1299 int i, errno;
1300 struct new_utsname *u;
1301
1302 if (len < 0)
1303 return -EINVAL;
1304 down_read(&uts_sem);
1305 u = utsname();
1306 i = 1 + strlen(u->nodename);
1307 if (i > len)
1308 i = len;
1309 errno = 0;
1310 if (copy_to_user(name, u->nodename, i))
1311 errno = -EFAULT;
1312 up_read(&uts_sem);
1313 return errno;
1314}
1315
1316#endif
1317
1318
1319
1320
1321
1322SYSCALL_DEFINE2(setdomainname, char __user *, name, int, len)
1323{
1324 int errno;
1325 char tmp[__NEW_UTS_LEN];
1326
1327 if (!ns_capable(current->nsproxy->uts_ns->user_ns, CAP_SYS_ADMIN))
1328 return -EPERM;
1329 if (len < 0 || len > __NEW_UTS_LEN)
1330 return -EINVAL;
1331
1332 down_write(&uts_sem);
1333 errno = -EFAULT;
1334 if (!copy_from_user(tmp, name, len)) {
1335 struct new_utsname *u = utsname();
1336
1337 memcpy(u->domainname, tmp, len);
1338 memset(u->domainname + len, 0, sizeof(u->domainname) - len);
1339 errno = 0;
1340 }
1341 uts_proc_notify(UTS_PROC_DOMAINNAME);
1342 up_write(&uts_sem);
1343 return errno;
1344}
1345
1346SYSCALL_DEFINE2(getrlimit, unsigned int, resource, struct rlimit __user *, rlim)
1347{
1348 struct rlimit value;
1349 int ret;
1350
1351 ret = do_prlimit(current, resource, NULL, &value);
1352 if (!ret)
1353 ret = copy_to_user(rlim, &value, sizeof(*rlim)) ? -EFAULT : 0;
1354
1355 return ret;
1356}
1357
1358#ifdef __ARCH_WANT_SYS_OLD_GETRLIMIT
1359
1360
1361
1362
1363
1364SYSCALL_DEFINE2(old_getrlimit, unsigned int, resource,
1365 struct rlimit __user *, rlim)
1366{
1367 struct rlimit x;
1368 if (resource >= RLIM_NLIMITS)
1369 return -EINVAL;
1370
1371 task_lock(current->group_leader);
1372 x = current->signal->rlim[resource];
1373 task_unlock(current->group_leader);
1374 if (x.rlim_cur > 0x7FFFFFFF)
1375 x.rlim_cur = 0x7FFFFFFF;
1376 if (x.rlim_max > 0x7FFFFFFF)
1377 x.rlim_max = 0x7FFFFFFF;
1378 return copy_to_user(rlim, &x, sizeof(x))?-EFAULT:0;
1379}
1380
1381#endif
1382
1383static inline bool rlim64_is_infinity(__u64 rlim64)
1384{
1385#if BITS_PER_LONG < 64
1386 return rlim64 >= ULONG_MAX;
1387#else
1388 return rlim64 == RLIM64_INFINITY;
1389#endif
1390}
1391
1392static void rlim_to_rlim64(const struct rlimit *rlim, struct rlimit64 *rlim64)
1393{
1394 if (rlim->rlim_cur == RLIM_INFINITY)
1395 rlim64->rlim_cur = RLIM64_INFINITY;
1396 else
1397 rlim64->rlim_cur = rlim->rlim_cur;
1398 if (rlim->rlim_max == RLIM_INFINITY)
1399 rlim64->rlim_max = RLIM64_INFINITY;
1400 else
1401 rlim64->rlim_max = rlim->rlim_max;
1402}
1403
1404static void rlim64_to_rlim(const struct rlimit64 *rlim64, struct rlimit *rlim)
1405{
1406 if (rlim64_is_infinity(rlim64->rlim_cur))
1407 rlim->rlim_cur = RLIM_INFINITY;
1408 else
1409 rlim->rlim_cur = (unsigned long)rlim64->rlim_cur;
1410 if (rlim64_is_infinity(rlim64->rlim_max))
1411 rlim->rlim_max = RLIM_INFINITY;
1412 else
1413 rlim->rlim_max = (unsigned long)rlim64->rlim_max;
1414}
1415
1416
1417int do_prlimit(struct task_struct *tsk, unsigned int resource,
1418 struct rlimit *new_rlim, struct rlimit *old_rlim)
1419{
1420 struct rlimit *rlim;
1421 int retval = 0;
1422
1423 if (resource >= RLIM_NLIMITS)
1424 return -EINVAL;
1425 if (new_rlim) {
1426 if (new_rlim->rlim_cur > new_rlim->rlim_max)
1427 return -EINVAL;
1428 if (resource == RLIMIT_NOFILE &&
1429 new_rlim->rlim_max > sysctl_nr_open)
1430 return -EPERM;
1431 }
1432
1433
1434 read_lock(&tasklist_lock);
1435 if (!tsk->sighand) {
1436 retval = -ESRCH;
1437 goto out;
1438 }
1439
1440 rlim = tsk->signal->rlim + resource;
1441 task_lock(tsk->group_leader);
1442 if (new_rlim) {
1443
1444
1445 if (new_rlim->rlim_max > rlim->rlim_max &&
1446 !capable(CAP_SYS_RESOURCE))
1447 retval = -EPERM;
1448 if (!retval)
1449 retval = security_task_setrlimit(tsk->group_leader,
1450 resource, new_rlim);
1451 if (resource == RLIMIT_CPU && new_rlim->rlim_cur == 0) {
1452
1453
1454
1455
1456
1457
1458 new_rlim->rlim_cur = 1;
1459 }
1460 }
1461 if (!retval) {
1462 if (old_rlim)
1463 *old_rlim = *rlim;
1464 if (new_rlim)
1465 *rlim = *new_rlim;
1466 }
1467 task_unlock(tsk->group_leader);
1468
1469
1470
1471
1472
1473
1474
1475 if (!retval && new_rlim && resource == RLIMIT_CPU &&
1476 new_rlim->rlim_cur != RLIM_INFINITY)
1477 update_rlimit_cpu(tsk, new_rlim->rlim_cur);
1478out:
1479 read_unlock(&tasklist_lock);
1480 return retval;
1481}
1482
1483
1484static int check_prlimit_permission(struct task_struct *task)
1485{
1486 const struct cred *cred = current_cred(), *tcred;
1487
1488 if (current == task)
1489 return 0;
1490
1491 tcred = __task_cred(task);
1492 if (cred->user->user_ns == tcred->user->user_ns &&
1493 (cred->uid == tcred->euid &&
1494 cred->uid == tcred->suid &&
1495 cred->uid == tcred->uid &&
1496 cred->gid == tcred->egid &&
1497 cred->gid == tcred->sgid &&
1498 cred->gid == tcred->gid))
1499 return 0;
1500 if (ns_capable(tcred->user->user_ns, CAP_SYS_RESOURCE))
1501 return 0;
1502
1503 return -EPERM;
1504}
1505
1506SYSCALL_DEFINE4(prlimit64, pid_t, pid, unsigned int, resource,
1507 const struct rlimit64 __user *, new_rlim,
1508 struct rlimit64 __user *, old_rlim)
1509{
1510 struct rlimit64 old64, new64;
1511 struct rlimit old, new;
1512 struct task_struct *tsk;
1513 int ret;
1514
1515 if (new_rlim) {
1516 if (copy_from_user(&new64, new_rlim, sizeof(new64)))
1517 return -EFAULT;
1518 rlim64_to_rlim(&new64, &new);
1519 }
1520
1521 rcu_read_lock();
1522 tsk = pid ? find_task_by_vpid(pid) : current;
1523 if (!tsk) {
1524 rcu_read_unlock();
1525 return -ESRCH;
1526 }
1527 ret = check_prlimit_permission(tsk);
1528 if (ret) {
1529 rcu_read_unlock();
1530 return ret;
1531 }
1532 get_task_struct(tsk);
1533 rcu_read_unlock();
1534
1535 ret = do_prlimit(tsk, resource, new_rlim ? &new : NULL,
1536 old_rlim ? &old : NULL);
1537
1538 if (!ret && old_rlim) {
1539 rlim_to_rlim64(&old, &old64);
1540 if (copy_to_user(old_rlim, &old64, sizeof(old64)))
1541 ret = -EFAULT;
1542 }
1543
1544 put_task_struct(tsk);
1545 return ret;
1546}
1547
1548SYSCALL_DEFINE2(setrlimit, unsigned int, resource, struct rlimit __user *, rlim)
1549{
1550 struct rlimit new_rlim;
1551
1552 if (copy_from_user(&new_rlim, rlim, sizeof(*rlim)))
1553 return -EFAULT;
1554 return do_prlimit(current, resource, &new_rlim, NULL);
1555}
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590static void accumulate_thread_rusage(struct task_struct *t, struct rusage *r)
1591{
1592 r->ru_nvcsw += t->nvcsw;
1593 r->ru_nivcsw += t->nivcsw;
1594 r->ru_minflt += t->min_flt;
1595 r->ru_majflt += t->maj_flt;
1596 r->ru_inblock += task_io_get_inblock(t);
1597 r->ru_oublock += task_io_get_oublock(t);
1598}
1599
1600static void k_getrusage(struct task_struct *p, int who, struct rusage *r)
1601{
1602 struct task_struct *t;
1603 unsigned long flags;
1604 cputime_t tgutime, tgstime, utime, stime;
1605 unsigned long maxrss = 0;
1606
1607 memset((char *) r, 0, sizeof *r);
1608 utime = stime = 0;
1609
1610 if (who == RUSAGE_THREAD) {
1611 task_times(current, &utime, &stime);
1612 accumulate_thread_rusage(p, r);
1613 maxrss = p->signal->maxrss;
1614 goto out;
1615 }
1616
1617 if (!lock_task_sighand(p, &flags))
1618 return;
1619
1620 switch (who) {
1621 case RUSAGE_BOTH:
1622 case RUSAGE_CHILDREN:
1623 utime = p->signal->cutime;
1624 stime = p->signal->cstime;
1625 r->ru_nvcsw = p->signal->cnvcsw;
1626 r->ru_nivcsw = p->signal->cnivcsw;
1627 r->ru_minflt = p->signal->cmin_flt;
1628 r->ru_majflt = p->signal->cmaj_flt;
1629 r->ru_inblock = p->signal->cinblock;
1630 r->ru_oublock = p->signal->coublock;
1631 maxrss = p->signal->cmaxrss;
1632
1633 if (who == RUSAGE_CHILDREN)
1634 break;
1635
1636 case RUSAGE_SELF:
1637 thread_group_times(p, &tgutime, &tgstime);
1638 utime += tgutime;
1639 stime += tgstime;
1640 r->ru_nvcsw += p->signal->nvcsw;
1641 r->ru_nivcsw += p->signal->nivcsw;
1642 r->ru_minflt += p->signal->min_flt;
1643 r->ru_majflt += p->signal->maj_flt;
1644 r->ru_inblock += p->signal->inblock;
1645 r->ru_oublock += p->signal->oublock;
1646 if (maxrss < p->signal->maxrss)
1647 maxrss = p->signal->maxrss;
1648 t = p;
1649 do {
1650 accumulate_thread_rusage(t, r);
1651 t = next_thread(t);
1652 } while (t != p);
1653 break;
1654
1655 default:
1656 BUG();
1657 }
1658 unlock_task_sighand(p, &flags);
1659
1660out:
1661 cputime_to_timeval(utime, &r->ru_utime);
1662 cputime_to_timeval(stime, &r->ru_stime);
1663
1664 if (who != RUSAGE_CHILDREN) {
1665 struct mm_struct *mm = get_task_mm(p);
1666 if (mm) {
1667 setmax_mm_hiwater_rss(&maxrss, mm);
1668 mmput(mm);
1669 }
1670 }
1671 r->ru_maxrss = maxrss * (PAGE_SIZE / 1024);
1672}
1673
1674int getrusage(struct task_struct *p, int who, struct rusage __user *ru)
1675{
1676 struct rusage r;
1677 k_getrusage(p, who, &r);
1678 return copy_to_user(ru, &r, sizeof(r)) ? -EFAULT : 0;
1679}
1680
1681SYSCALL_DEFINE2(getrusage, int, who, struct rusage __user *, ru)
1682{
1683 if (who != RUSAGE_SELF && who != RUSAGE_CHILDREN &&
1684 who != RUSAGE_THREAD)
1685 return -EINVAL;
1686 return getrusage(current, who, ru);
1687}
1688
1689SYSCALL_DEFINE1(umask, int, mask)
1690{
1691 mask = xchg(¤t->fs->umask, mask & S_IRWXUGO);
1692 return mask;
1693}
1694
1695#ifdef CONFIG_CHECKPOINT_RESTORE
1696static int prctl_set_mm(int opt, unsigned long addr,
1697 unsigned long arg4, unsigned long arg5)
1698{
1699 unsigned long rlim = rlimit(RLIMIT_DATA);
1700 unsigned long vm_req_flags;
1701 unsigned long vm_bad_flags;
1702 struct vm_area_struct *vma;
1703 int error = 0;
1704 struct mm_struct *mm = current->mm;
1705
1706 if (arg4 | arg5)
1707 return -EINVAL;
1708
1709 if (!capable(CAP_SYS_RESOURCE))
1710 return -EPERM;
1711
1712 if (addr >= TASK_SIZE)
1713 return -EINVAL;
1714
1715 down_read(&mm->mmap_sem);
1716 vma = find_vma(mm, addr);
1717
1718 if (opt != PR_SET_MM_START_BRK && opt != PR_SET_MM_BRK) {
1719
1720 if (!vma || vma->vm_start > addr)
1721 goto out;
1722 }
1723
1724 error = -EINVAL;
1725 switch (opt) {
1726 case PR_SET_MM_START_CODE:
1727 case PR_SET_MM_END_CODE:
1728 vm_req_flags = VM_READ | VM_EXEC;
1729 vm_bad_flags = VM_WRITE | VM_MAYSHARE;
1730
1731 if ((vma->vm_flags & vm_req_flags) != vm_req_flags ||
1732 (vma->vm_flags & vm_bad_flags))
1733 goto out;
1734
1735 if (opt == PR_SET_MM_START_CODE)
1736 mm->start_code = addr;
1737 else
1738 mm->end_code = addr;
1739 break;
1740
1741 case PR_SET_MM_START_DATA:
1742 case PR_SET_MM_END_DATA:
1743 vm_req_flags = VM_READ | VM_WRITE;
1744 vm_bad_flags = VM_EXEC | VM_MAYSHARE;
1745
1746 if ((vma->vm_flags & vm_req_flags) != vm_req_flags ||
1747 (vma->vm_flags & vm_bad_flags))
1748 goto out;
1749
1750 if (opt == PR_SET_MM_START_DATA)
1751 mm->start_data = addr;
1752 else
1753 mm->end_data = addr;
1754 break;
1755
1756 case PR_SET_MM_START_STACK:
1757
1758#ifdef CONFIG_STACK_GROWSUP
1759 vm_req_flags = VM_READ | VM_WRITE | VM_GROWSUP;
1760#else
1761 vm_req_flags = VM_READ | VM_WRITE | VM_GROWSDOWN;
1762#endif
1763 if ((vma->vm_flags & vm_req_flags) != vm_req_flags)
1764 goto out;
1765
1766 mm->start_stack = addr;
1767 break;
1768
1769 case PR_SET_MM_START_BRK:
1770 if (addr <= mm->end_data)
1771 goto out;
1772
1773 if (rlim < RLIM_INFINITY &&
1774 (mm->brk - addr) +
1775 (mm->end_data - mm->start_data) > rlim)
1776 goto out;
1777
1778 mm->start_brk = addr;
1779 break;
1780
1781 case PR_SET_MM_BRK:
1782 if (addr <= mm->end_data)
1783 goto out;
1784
1785 if (rlim < RLIM_INFINITY &&
1786 (addr - mm->start_brk) +
1787 (mm->end_data - mm->start_data) > rlim)
1788 goto out;
1789
1790 mm->brk = addr;
1791 break;
1792
1793 default:
1794 error = -EINVAL;
1795 goto out;
1796 }
1797
1798 error = 0;
1799
1800out:
1801 up_read(&mm->mmap_sem);
1802
1803 return error;
1804}
1805#else
1806static int prctl_set_mm(int opt, unsigned long addr,
1807 unsigned long arg4, unsigned long arg5)
1808{
1809 return -EINVAL;
1810}
1811#endif
1812
1813SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
1814 unsigned long, arg4, unsigned long, arg5)
1815{
1816 struct task_struct *me = current;
1817 unsigned char comm[sizeof(me->comm)];
1818 long error;
1819
1820 error = security_task_prctl(option, arg2, arg3, arg4, arg5);
1821 if (error != -ENOSYS)
1822 return error;
1823
1824 error = 0;
1825 switch (option) {
1826 case PR_SET_PDEATHSIG:
1827 if (!valid_signal(arg2)) {
1828 error = -EINVAL;
1829 break;
1830 }
1831 me->pdeath_signal = arg2;
1832 error = 0;
1833 break;
1834 case PR_GET_PDEATHSIG:
1835 error = put_user(me->pdeath_signal, (int __user *)arg2);
1836 break;
1837 case PR_GET_DUMPABLE:
1838 error = get_dumpable(me->mm);
1839 break;
1840 case PR_SET_DUMPABLE:
1841 if (arg2 < 0 || arg2 > 1) {
1842 error = -EINVAL;
1843 break;
1844 }
1845 set_dumpable(me->mm, arg2);
1846 error = 0;
1847 break;
1848
1849 case PR_SET_UNALIGN:
1850 error = SET_UNALIGN_CTL(me, arg2);
1851 break;
1852 case PR_GET_UNALIGN:
1853 error = GET_UNALIGN_CTL(me, arg2);
1854 break;
1855 case PR_SET_FPEMU:
1856 error = SET_FPEMU_CTL(me, arg2);
1857 break;
1858 case PR_GET_FPEMU:
1859 error = GET_FPEMU_CTL(me, arg2);
1860 break;
1861 case PR_SET_FPEXC:
1862 error = SET_FPEXC_CTL(me, arg2);
1863 break;
1864 case PR_GET_FPEXC:
1865 error = GET_FPEXC_CTL(me, arg2);
1866 break;
1867 case PR_GET_TIMING:
1868 error = PR_TIMING_STATISTICAL;
1869 break;
1870 case PR_SET_TIMING:
1871 if (arg2 != PR_TIMING_STATISTICAL)
1872 error = -EINVAL;
1873 else
1874 error = 0;
1875 break;
1876
1877 case PR_SET_NAME:
1878 comm[sizeof(me->comm)-1] = 0;
1879 if (strncpy_from_user(comm, (char __user *)arg2,
1880 sizeof(me->comm) - 1) < 0)
1881 return -EFAULT;
1882 set_task_comm(me, comm);
1883 proc_comm_connector(me);
1884 return 0;
1885 case PR_GET_NAME:
1886 get_task_comm(comm, me);
1887 if (copy_to_user((char __user *)arg2, comm,
1888 sizeof(comm)))
1889 return -EFAULT;
1890 return 0;
1891 case PR_GET_ENDIAN:
1892 error = GET_ENDIAN(me, arg2);
1893 break;
1894 case PR_SET_ENDIAN:
1895 error = SET_ENDIAN(me, arg2);
1896 break;
1897
1898 case PR_GET_SECCOMP:
1899 error = prctl_get_seccomp();
1900 break;
1901 case PR_SET_SECCOMP:
1902 error = prctl_set_seccomp(arg2);
1903 break;
1904 case PR_GET_TSC:
1905 error = GET_TSC_CTL(arg2);
1906 break;
1907 case PR_SET_TSC:
1908 error = SET_TSC_CTL(arg2);
1909 break;
1910 case PR_TASK_PERF_EVENTS_DISABLE:
1911 error = perf_event_task_disable();
1912 break;
1913 case PR_TASK_PERF_EVENTS_ENABLE:
1914 error = perf_event_task_enable();
1915 break;
1916 case PR_GET_TIMERSLACK:
1917 error = current->timer_slack_ns;
1918 break;
1919 case PR_SET_TIMERSLACK:
1920 if (arg2 <= 0)
1921 current->timer_slack_ns =
1922 current->default_timer_slack_ns;
1923 else
1924 current->timer_slack_ns = arg2;
1925 error = 0;
1926 break;
1927 case PR_MCE_KILL:
1928 if (arg4 | arg5)
1929 return -EINVAL;
1930 switch (arg2) {
1931 case PR_MCE_KILL_CLEAR:
1932 if (arg3 != 0)
1933 return -EINVAL;
1934 current->flags &= ~PF_MCE_PROCESS;
1935 break;
1936 case PR_MCE_KILL_SET:
1937 current->flags |= PF_MCE_PROCESS;
1938 if (arg3 == PR_MCE_KILL_EARLY)
1939 current->flags |= PF_MCE_EARLY;
1940 else if (arg3 == PR_MCE_KILL_LATE)
1941 current->flags &= ~PF_MCE_EARLY;
1942 else if (arg3 == PR_MCE_KILL_DEFAULT)
1943 current->flags &=
1944 ~(PF_MCE_EARLY|PF_MCE_PROCESS);
1945 else
1946 return -EINVAL;
1947 break;
1948 default:
1949 return -EINVAL;
1950 }
1951 error = 0;
1952 break;
1953 case PR_MCE_KILL_GET:
1954 if (arg2 | arg3 | arg4 | arg5)
1955 return -EINVAL;
1956 if (current->flags & PF_MCE_PROCESS)
1957 error = (current->flags & PF_MCE_EARLY) ?
1958 PR_MCE_KILL_EARLY : PR_MCE_KILL_LATE;
1959 else
1960 error = PR_MCE_KILL_DEFAULT;
1961 break;
1962 case PR_SET_MM:
1963 error = prctl_set_mm(arg2, arg3, arg4, arg5);
1964 break;
1965 default:
1966 error = -EINVAL;
1967 break;
1968 }
1969 return error;
1970}
1971
1972SYSCALL_DEFINE3(getcpu, unsigned __user *, cpup, unsigned __user *, nodep,
1973 struct getcpu_cache __user *, unused)
1974{
1975 int err = 0;
1976 int cpu = raw_smp_processor_id();
1977 if (cpup)
1978 err |= put_user(cpu, cpup);
1979 if (nodep)
1980 err |= put_user(cpu_to_node(cpu), nodep);
1981 return err ? -EFAULT : 0;
1982}
1983
1984char poweroff_cmd[POWEROFF_CMD_PATH_LEN] = "/sbin/poweroff";
1985
1986static void argv_cleanup(struct subprocess_info *info)
1987{
1988 argv_free(info->argv);
1989}
1990
1991
1992
1993
1994
1995
1996
1997
1998int orderly_poweroff(bool force)
1999{
2000 int argc;
2001 char **argv = argv_split(GFP_ATOMIC, poweroff_cmd, &argc);
2002 static char *envp[] = {
2003 "HOME=/",
2004 "PATH=/sbin:/bin:/usr/sbin:/usr/bin",
2005 NULL
2006 };
2007 int ret = -ENOMEM;
2008 struct subprocess_info *info;
2009
2010 if (argv == NULL) {
2011 printk(KERN_WARNING "%s failed to allocate memory for \"%s\"\n",
2012 __func__, poweroff_cmd);
2013 goto out;
2014 }
2015
2016 info = call_usermodehelper_setup(argv[0], argv, envp, GFP_ATOMIC);
2017 if (info == NULL) {
2018 argv_free(argv);
2019 goto out;
2020 }
2021
2022 call_usermodehelper_setfns(info, NULL, argv_cleanup, NULL);
2023
2024 ret = call_usermodehelper_exec(info, UMH_NO_WAIT);
2025
2026 out:
2027 if (ret && force) {
2028 printk(KERN_WARNING "Failed to start orderly shutdown: "
2029 "forcing the issue\n");
2030
2031
2032
2033
2034 emergency_sync();
2035 kernel_power_off();
2036 }
2037
2038 return ret;
2039}
2040EXPORT_SYMBOL_GPL(orderly_poweroff);
2041