diff options
Diffstat (limited to 'kernel/sys.c')
| -rw-r--r-- | kernel/sys.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/kernel/sys.c b/kernel/sys.c index 241507f23eca..c5cb5b99cb81 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
| @@ -368,6 +368,7 @@ EXPORT_SYMBOL(unregister_reboot_notifier); | |||
| 368 | void kernel_restart(char *cmd) | 368 | void kernel_restart(char *cmd) |
| 369 | { | 369 | { |
| 370 | kernel_restart_prepare(cmd); | 370 | kernel_restart_prepare(cmd); |
| 371 | disable_nonboot_cpus(); | ||
| 371 | if (!cmd) | 372 | if (!cmd) |
| 372 | printk(KERN_EMERG "Restarting system.\n"); | 373 | printk(KERN_EMERG "Restarting system.\n"); |
| 373 | else | 374 | else |
| @@ -1788,15 +1789,15 @@ SYSCALL_DEFINE1(umask, int, mask) | |||
| 1788 | #ifdef CONFIG_CHECKPOINT_RESTORE | 1789 | #ifdef CONFIG_CHECKPOINT_RESTORE |
| 1789 | static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd) | 1790 | static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd) |
| 1790 | { | 1791 | { |
| 1791 | struct file *exe_file; | 1792 | struct fd exe; |
| 1792 | struct dentry *dentry; | 1793 | struct dentry *dentry; |
| 1793 | int err; | 1794 | int err; |
| 1794 | 1795 | ||
| 1795 | exe_file = fget(fd); | 1796 | exe = fdget(fd); |
| 1796 | if (!exe_file) | 1797 | if (!exe.file) |
| 1797 | return -EBADF; | 1798 | return -EBADF; |
| 1798 | 1799 | ||
| 1799 | dentry = exe_file->f_path.dentry; | 1800 | dentry = exe.file->f_path.dentry; |
| 1800 | 1801 | ||
| 1801 | /* | 1802 | /* |
| 1802 | * Because the original mm->exe_file points to executable file, make | 1803 | * Because the original mm->exe_file points to executable file, make |
| @@ -1805,7 +1806,7 @@ static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd) | |||
| 1805 | */ | 1806 | */ |
| 1806 | err = -EACCES; | 1807 | err = -EACCES; |
| 1807 | if (!S_ISREG(dentry->d_inode->i_mode) || | 1808 | if (!S_ISREG(dentry->d_inode->i_mode) || |
| 1808 | exe_file->f_path.mnt->mnt_flags & MNT_NOEXEC) | 1809 | exe.file->f_path.mnt->mnt_flags & MNT_NOEXEC) |
| 1809 | goto exit; | 1810 | goto exit; |
| 1810 | 1811 | ||
| 1811 | err = inode_permission(dentry->d_inode, MAY_EXEC); | 1812 | err = inode_permission(dentry->d_inode, MAY_EXEC); |
| @@ -1839,12 +1840,12 @@ static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd) | |||
| 1839 | goto exit_unlock; | 1840 | goto exit_unlock; |
| 1840 | 1841 | ||
| 1841 | err = 0; | 1842 | err = 0; |
| 1842 | set_mm_exe_file(mm, exe_file); | 1843 | set_mm_exe_file(mm, exe.file); /* this grabs a reference to exe.file */ |
| 1843 | exit_unlock: | 1844 | exit_unlock: |
| 1844 | up_write(&mm->mmap_sem); | 1845 | up_write(&mm->mmap_sem); |
| 1845 | 1846 | ||
| 1846 | exit: | 1847 | exit: |
| 1847 | fput(exe_file); | 1848 | fdput(exe); |
| 1848 | return err; | 1849 | return err; |
| 1849 | } | 1850 | } |
| 1850 | 1851 | ||
| @@ -2204,7 +2205,7 @@ static int __orderly_poweroff(void) | |||
| 2204 | return -ENOMEM; | 2205 | return -ENOMEM; |
| 2205 | } | 2206 | } |
| 2206 | 2207 | ||
| 2207 | ret = call_usermodehelper_fns(argv[0], argv, envp, UMH_NO_WAIT, | 2208 | ret = call_usermodehelper_fns(argv[0], argv, envp, UMH_WAIT_EXEC, |
| 2208 | NULL, argv_cleanup, NULL); | 2209 | NULL, argv_cleanup, NULL); |
| 2209 | if (ret == -ENOMEM) | 2210 | if (ret == -ENOMEM) |
| 2210 | argv_free(argv); | 2211 | argv_free(argv); |
