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