aboutsummaryrefslogtreecommitdiffstats
path: root/fs/exec.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/exec.c')
-rw-r--r--fs/exec.c165
1 files changed, 80 insertions, 85 deletions
diff --git a/fs/exec.c b/fs/exec.c
index 073b0b8c6d05..070ddf13cb71 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -29,6 +29,7 @@
29#include <linux/stat.h> 29#include <linux/stat.h>
30#include <linux/fcntl.h> 30#include <linux/fcntl.h>
31#include <linux/smp_lock.h> 31#include <linux/smp_lock.h>
32#include <linux/string.h>
32#include <linux/init.h> 33#include <linux/init.h>
33#include <linux/pagemap.h> 34#include <linux/pagemap.h>
34#include <linux/highmem.h> 35#include <linux/highmem.h>
@@ -63,52 +64,28 @@ int core_uses_pid;
63char core_pattern[CORENAME_MAX_SIZE] = "core"; 64char core_pattern[CORENAME_MAX_SIZE] = "core";
64int suid_dumpable = 0; 65int suid_dumpable = 0;
65 66
66EXPORT_SYMBOL(suid_dumpable);
67/* The maximal length of core_pattern is also specified in sysctl.c */ 67/* The maximal length of core_pattern is also specified in sysctl.c */
68 68
69static struct linux_binfmt *formats; 69static LIST_HEAD(formats);
70static DEFINE_RWLOCK(binfmt_lock); 70static DEFINE_RWLOCK(binfmt_lock);
71 71
72int register_binfmt(struct linux_binfmt * fmt) 72int register_binfmt(struct linux_binfmt * fmt)
73{ 73{
74 struct linux_binfmt ** tmp = &formats;
75
76 if (!fmt) 74 if (!fmt)
77 return -EINVAL; 75 return -EINVAL;
78 if (fmt->next)
79 return -EBUSY;
80 write_lock(&binfmt_lock); 76 write_lock(&binfmt_lock);
81 while (*tmp) { 77 list_add(&fmt->lh, &formats);
82 if (fmt == *tmp) {
83 write_unlock(&binfmt_lock);
84 return -EBUSY;
85 }
86 tmp = &(*tmp)->next;
87 }
88 fmt->next = formats;
89 formats = fmt;
90 write_unlock(&binfmt_lock); 78 write_unlock(&binfmt_lock);
91 return 0; 79 return 0;
92} 80}
93 81
94EXPORT_SYMBOL(register_binfmt); 82EXPORT_SYMBOL(register_binfmt);
95 83
96int unregister_binfmt(struct linux_binfmt * fmt) 84void unregister_binfmt(struct linux_binfmt * fmt)
97{ 85{
98 struct linux_binfmt ** tmp = &formats;
99
100 write_lock(&binfmt_lock); 86 write_lock(&binfmt_lock);
101 while (*tmp) { 87 list_del(&fmt->lh);
102 if (fmt == *tmp) {
103 *tmp = fmt->next;
104 fmt->next = NULL;
105 write_unlock(&binfmt_lock);
106 return 0;
107 }
108 tmp = &(*tmp)->next;
109 }
110 write_unlock(&binfmt_lock); 88 write_unlock(&binfmt_lock);
111 return -EINVAL;
112} 89}
113 90
114EXPORT_SYMBOL(unregister_binfmt); 91EXPORT_SYMBOL(unregister_binfmt);
@@ -134,9 +111,6 @@ asmlinkage long sys_uselib(const char __user * library)
134 if (error) 111 if (error)
135 goto out; 112 goto out;
136 113
137 error = -EACCES;
138 if (nd.mnt->mnt_flags & MNT_NOEXEC)
139 goto exit;
140 error = -EINVAL; 114 error = -EINVAL;
141 if (!S_ISREG(nd.dentry->d_inode->i_mode)) 115 if (!S_ISREG(nd.dentry->d_inode->i_mode))
142 goto exit; 116 goto exit;
@@ -155,7 +129,7 @@ asmlinkage long sys_uselib(const char __user * library)
155 struct linux_binfmt * fmt; 129 struct linux_binfmt * fmt;
156 130
157 read_lock(&binfmt_lock); 131 read_lock(&binfmt_lock);
158 for (fmt = formats ; fmt ; fmt = fmt->next) { 132 list_for_each_entry(fmt, &formats, lh) {
159 if (!fmt->load_shlib) 133 if (!fmt->load_shlib)
160 continue; 134 continue;
161 if (!try_module_get(fmt->module)) 135 if (!try_module_get(fmt->module))
@@ -680,8 +654,7 @@ struct file *open_exec(const char *name)
680 if (!err) { 654 if (!err) {
681 struct inode *inode = nd.dentry->d_inode; 655 struct inode *inode = nd.dentry->d_inode;
682 file = ERR_PTR(-EACCES); 656 file = ERR_PTR(-EACCES);
683 if (!(nd.mnt->mnt_flags & MNT_NOEXEC) && 657 if (S_ISREG(inode->i_mode)) {
684 S_ISREG(inode->i_mode)) {
685 int err = vfs_permission(&nd, MAY_EXEC); 658 int err = vfs_permission(&nd, MAY_EXEC);
686 file = ERR_PTR(err); 659 file = ERR_PTR(err);
687 if (!err) { 660 if (!err) {
@@ -773,24 +746,11 @@ static int exec_mmap(struct mm_struct *mm)
773static int de_thread(struct task_struct *tsk) 746static int de_thread(struct task_struct *tsk)
774{ 747{
775 struct signal_struct *sig = tsk->signal; 748 struct signal_struct *sig = tsk->signal;
776 struct sighand_struct *newsighand, *oldsighand = tsk->sighand; 749 struct sighand_struct *oldsighand = tsk->sighand;
777 spinlock_t *lock = &oldsighand->siglock; 750 spinlock_t *lock = &oldsighand->siglock;
778 struct task_struct *leader = NULL; 751 struct task_struct *leader = NULL;
779 int count; 752 int count;
780 753
781 /*
782 * If we don't share sighandlers, then we aren't sharing anything
783 * and we can just re-use it all.
784 */
785 if (atomic_read(&oldsighand->count) <= 1) {
786 exit_itimers(sig);
787 return 0;
788 }
789
790 newsighand = kmem_cache_alloc(sighand_cachep, GFP_KERNEL);
791 if (!newsighand)
792 return -ENOMEM;
793
794 if (thread_group_empty(tsk)) 754 if (thread_group_empty(tsk))
795 goto no_thread_group; 755 goto no_thread_group;
796 756
@@ -807,7 +767,6 @@ static int de_thread(struct task_struct *tsk)
807 */ 767 */
808 spin_unlock_irq(lock); 768 spin_unlock_irq(lock);
809 read_unlock(&tasklist_lock); 769 read_unlock(&tasklist_lock);
810 kmem_cache_free(sighand_cachep, newsighand);
811 return -EAGAIN; 770 return -EAGAIN;
812 } 771 }
813 772
@@ -841,16 +800,15 @@ static int de_thread(struct task_struct *tsk)
841 hrtimer_restart(&sig->real_timer); 800 hrtimer_restart(&sig->real_timer);
842 spin_lock_irq(lock); 801 spin_lock_irq(lock);
843 } 802 }
803
804 sig->notify_count = count;
805 sig->group_exit_task = tsk;
844 while (atomic_read(&sig->count) > count) { 806 while (atomic_read(&sig->count) > count) {
845 sig->group_exit_task = tsk;
846 sig->notify_count = count;
847 __set_current_state(TASK_UNINTERRUPTIBLE); 807 __set_current_state(TASK_UNINTERRUPTIBLE);
848 spin_unlock_irq(lock); 808 spin_unlock_irq(lock);
849 schedule(); 809 schedule();
850 spin_lock_irq(lock); 810 spin_lock_irq(lock);
851 } 811 }
852 sig->group_exit_task = NULL;
853 sig->notify_count = 0;
854 spin_unlock_irq(lock); 812 spin_unlock_irq(lock);
855 813
856 /* 814 /*
@@ -859,14 +817,17 @@ static int de_thread(struct task_struct *tsk)
859 * and to assume its PID: 817 * and to assume its PID:
860 */ 818 */
861 if (!thread_group_leader(tsk)) { 819 if (!thread_group_leader(tsk)) {
862 /*
863 * Wait for the thread group leader to be a zombie.
864 * It should already be zombie at this point, most
865 * of the time.
866 */
867 leader = tsk->group_leader; 820 leader = tsk->group_leader;
868 while (leader->exit_state != EXIT_ZOMBIE) 821
869 yield(); 822 sig->notify_count = -1;
823 for (;;) {
824 write_lock_irq(&tasklist_lock);
825 if (likely(leader->exit_state))
826 break;
827 __set_current_state(TASK_UNINTERRUPTIBLE);
828 write_unlock_irq(&tasklist_lock);
829 schedule();
830 }
870 831
871 /* 832 /*
872 * The only record we have of the real-time age of a 833 * The only record we have of the real-time age of a
@@ -880,8 +841,6 @@ static int de_thread(struct task_struct *tsk)
880 */ 841 */
881 tsk->start_time = leader->start_time; 842 tsk->start_time = leader->start_time;
882 843
883 write_lock_irq(&tasklist_lock);
884
885 BUG_ON(leader->tgid != tsk->tgid); 844 BUG_ON(leader->tgid != tsk->tgid);
886 BUG_ON(tsk->pid == tsk->tgid); 845 BUG_ON(tsk->pid == tsk->tgid);
887 /* 846 /*
@@ -914,6 +873,8 @@ static int de_thread(struct task_struct *tsk)
914 write_unlock_irq(&tasklist_lock); 873 write_unlock_irq(&tasklist_lock);
915 } 874 }
916 875
876 sig->group_exit_task = NULL;
877 sig->notify_count = 0;
917 /* 878 /*
918 * There may be one thread left which is just exiting, 879 * There may be one thread left which is just exiting,
919 * but it's safe to stop telling the group to kill themselves. 880 * but it's safe to stop telling the group to kill themselves.
@@ -925,29 +886,23 @@ no_thread_group:
925 if (leader) 886 if (leader)
926 release_task(leader); 887 release_task(leader);
927 888
928 if (atomic_read(&oldsighand->count) == 1) { 889 if (atomic_read(&oldsighand->count) != 1) {
929 /* 890 struct sighand_struct *newsighand;
930 * Now that we nuked the rest of the thread group,
931 * it turns out we are not sharing sighand any more either.
932 * So we can just keep it.
933 */
934 kmem_cache_free(sighand_cachep, newsighand);
935 } else {
936 /* 891 /*
937 * Move our state over to newsighand and switch it in. 892 * This ->sighand is shared with the CLONE_SIGHAND
893 * but not CLONE_THREAD task, switch to the new one.
938 */ 894 */
895 newsighand = kmem_cache_alloc(sighand_cachep, GFP_KERNEL);
896 if (!newsighand)
897 return -ENOMEM;
898
939 atomic_set(&newsighand->count, 1); 899 atomic_set(&newsighand->count, 1);
940 memcpy(newsighand->action, oldsighand->action, 900 memcpy(newsighand->action, oldsighand->action,
941 sizeof(newsighand->action)); 901 sizeof(newsighand->action));
942 902
943 write_lock_irq(&tasklist_lock); 903 write_lock_irq(&tasklist_lock);
944 spin_lock(&oldsighand->siglock); 904 spin_lock(&oldsighand->siglock);
945 spin_lock_nested(&newsighand->siglock, SINGLE_DEPTH_NESTING);
946
947 rcu_assign_pointer(tsk->sighand, newsighand); 905 rcu_assign_pointer(tsk->sighand, newsighand);
948 recalc_sigpending();
949
950 spin_unlock(&newsighand->siglock);
951 spin_unlock(&oldsighand->siglock); 906 spin_unlock(&oldsighand->siglock);
952 write_unlock_irq(&tasklist_lock); 907 write_unlock_irq(&tasklist_lock);
953 908
@@ -957,12 +912,11 @@ no_thread_group:
957 BUG_ON(!thread_group_leader(tsk)); 912 BUG_ON(!thread_group_leader(tsk));
958 return 0; 913 return 0;
959} 914}
960 915
961/* 916/*
962 * These functions flushes out all traces of the currently running executable 917 * These functions flushes out all traces of the currently running executable
963 * so that a new one can be started 918 * so that a new one can be started
964 */ 919 */
965
966static void flush_old_files(struct files_struct * files) 920static void flush_old_files(struct files_struct * files)
967{ 921{
968 long j = -1; 922 long j = -1;
@@ -1284,7 +1238,7 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)
1284 retval = -ENOENT; 1238 retval = -ENOENT;
1285 for (try=0; try<2; try++) { 1239 for (try=0; try<2; try++) {
1286 read_lock(&binfmt_lock); 1240 read_lock(&binfmt_lock);
1287 for (fmt = formats ; fmt ; fmt = fmt->next) { 1241 list_for_each_entry(fmt, &formats, lh) {
1288 int (*fn)(struct linux_binprm *, struct pt_regs *) = fmt->load_binary; 1242 int (*fn)(struct linux_binprm *, struct pt_regs *) = fmt->load_binary;
1289 if (!fn) 1243 if (!fn)
1290 continue; 1244 continue;
@@ -1537,6 +1491,14 @@ static int format_corename(char *corename, const char *pattern, long signr)
1537 goto out; 1491 goto out;
1538 out_ptr += rc; 1492 out_ptr += rc;
1539 break; 1493 break;
1494 /* core limit size */
1495 case 'c':
1496 rc = snprintf(out_ptr, out_end - out_ptr,
1497 "%lu", current->signal->rlim[RLIMIT_CORE].rlim_cur);
1498 if (rc > out_end - out_ptr)
1499 goto out;
1500 out_ptr += rc;
1501 break;
1540 default: 1502 default:
1541 break; 1503 break;
1542 } 1504 }
@@ -1699,7 +1661,6 @@ void set_dumpable(struct mm_struct *mm, int value)
1699 break; 1661 break;
1700 } 1662 }
1701} 1663}
1702EXPORT_SYMBOL_GPL(set_dumpable);
1703 1664
1704int get_dumpable(struct mm_struct *mm) 1665int get_dumpable(struct mm_struct *mm)
1705{ 1666{
@@ -1720,6 +1681,10 @@ int do_coredump(long signr, int exit_code, struct pt_regs * regs)
1720 int fsuid = current->fsuid; 1681 int fsuid = current->fsuid;
1721 int flag = 0; 1682 int flag = 0;
1722 int ispipe = 0; 1683 int ispipe = 0;
1684 unsigned long core_limit = current->signal->rlim[RLIMIT_CORE].rlim_cur;
1685 char **helper_argv = NULL;
1686 int helper_argc = 0;
1687 char *delimit;
1723 1688
1724 audit_core_dumps(signr); 1689 audit_core_dumps(signr);
1725 1690
@@ -1753,9 +1718,6 @@ int do_coredump(long signr, int exit_code, struct pt_regs * regs)
1753 */ 1718 */
1754 clear_thread_flag(TIF_SIGPENDING); 1719 clear_thread_flag(TIF_SIGPENDING);
1755 1720
1756 if (current->signal->rlim[RLIMIT_CORE].rlim_cur < binfmt->min_coredump)
1757 goto fail_unlock;
1758
1759 /* 1721 /*
1760 * lock_kernel() because format_corename() is controlled by sysctl, which 1722 * lock_kernel() because format_corename() is controlled by sysctl, which
1761 * uses lock_kernel() 1723 * uses lock_kernel()
@@ -1763,9 +1725,39 @@ int do_coredump(long signr, int exit_code, struct pt_regs * regs)
1763 lock_kernel(); 1725 lock_kernel();
1764 ispipe = format_corename(corename, core_pattern, signr); 1726 ispipe = format_corename(corename, core_pattern, signr);
1765 unlock_kernel(); 1727 unlock_kernel();
1728 /*
1729 * Don't bother to check the RLIMIT_CORE value if core_pattern points
1730 * to a pipe. Since we're not writing directly to the filesystem
1731 * RLIMIT_CORE doesn't really apply, as no actual core file will be
1732 * created unless the pipe reader choses to write out the core file
1733 * at which point file size limits and permissions will be imposed
1734 * as it does with any other process
1735 */
1736 if ((!ispipe) && (core_limit < binfmt->min_coredump))
1737 goto fail_unlock;
1738
1766 if (ispipe) { 1739 if (ispipe) {
1740 helper_argv = argv_split(GFP_KERNEL, corename+1, &helper_argc);
1741 /* Terminate the string before the first option */
1742 delimit = strchr(corename, ' ');
1743 if (delimit)
1744 *delimit = '\0';
1745 delimit = strrchr(helper_argv[0], '/');
1746 if (delimit)
1747 delimit++;
1748 else
1749 delimit = helper_argv[0];
1750 if (!strcmp(delimit, current->comm)) {
1751 printk(KERN_NOTICE "Recursive core dump detected, "
1752 "aborting\n");
1753 goto fail_unlock;
1754 }
1755
1756 core_limit = RLIM_INFINITY;
1757
1767 /* SIGPIPE can happen, but it's just never processed */ 1758 /* SIGPIPE can happen, but it's just never processed */
1768 if(call_usermodehelper_pipe(corename+1, NULL, NULL, &file)) { 1759 if (call_usermodehelper_pipe(corename+1, helper_argv, NULL,
1760 &file)) {
1769 printk(KERN_INFO "Core dump to %s pipe failed\n", 1761 printk(KERN_INFO "Core dump to %s pipe failed\n",
1770 corename); 1762 corename);
1771 goto fail_unlock; 1763 goto fail_unlock;
@@ -1793,13 +1785,16 @@ int do_coredump(long signr, int exit_code, struct pt_regs * regs)
1793 if (!ispipe && do_truncate(file->f_path.dentry, 0, 0, file) != 0) 1785 if (!ispipe && do_truncate(file->f_path.dentry, 0, 0, file) != 0)
1794 goto close_fail; 1786 goto close_fail;
1795 1787
1796 retval = binfmt->core_dump(signr, regs, file); 1788 retval = binfmt->core_dump(signr, regs, file, core_limit);
1797 1789
1798 if (retval) 1790 if (retval)
1799 current->signal->group_exit_code |= 0x80; 1791 current->signal->group_exit_code |= 0x80;
1800close_fail: 1792close_fail:
1801 filp_close(file, NULL); 1793 filp_close(file, NULL);
1802fail_unlock: 1794fail_unlock:
1795 if (helper_argv)
1796 argv_free(helper_argv);
1797
1803 current->fsuid = fsuid; 1798 current->fsuid = fsuid;
1804 complete_all(&mm->core_done); 1799 complete_all(&mm->core_done);
1805fail: 1800fail: