diff options
-rw-r--r-- | fs/exec.c | 17 |
1 files changed, 15 insertions, 2 deletions
@@ -1762,14 +1762,27 @@ int do_coredump(long signr, int exit_code, struct pt_regs * regs) | |||
1762 | goto fail_unlock; | 1762 | goto fail_unlock; |
1763 | 1763 | ||
1764 | if (ispipe) { | 1764 | if (ispipe) { |
1765 | core_limit = RLIM_INFINITY; | ||
1766 | helper_argv = argv_split(GFP_KERNEL, corename+1, &helper_argc); | 1765 | helper_argv = argv_split(GFP_KERNEL, corename+1, &helper_argc); |
1767 | /* Terminate the string before the first option */ | 1766 | /* Terminate the string before the first option */ |
1768 | delimit = strchr(corename, ' '); | 1767 | delimit = strchr(corename, ' '); |
1769 | if (delimit) | 1768 | if (delimit) |
1770 | *delimit = '\0'; | 1769 | *delimit = '\0'; |
1770 | delimit = strrchr(helper_argv[0], '/'); | ||
1771 | if (delimit) | ||
1772 | delimit++; | ||
1773 | else | ||
1774 | delimit = helper_argv[0]; | ||
1775 | if (!strcmp(delimit, current->comm)) { | ||
1776 | printk(KERN_NOTICE "Recursive core dump detected, " | ||
1777 | "aborting\n"); | ||
1778 | goto fail_unlock; | ||
1779 | } | ||
1780 | |||
1781 | core_limit = RLIM_INFINITY; | ||
1782 | |||
1771 | /* SIGPIPE can happen, but it's just never processed */ | 1783 | /* SIGPIPE can happen, but it's just never processed */ |
1772 | if(call_usermodehelper_pipe(corename+1, helper_argv, NULL, &file)) { | 1784 | if (call_usermodehelper_pipe(corename+1, helper_argv, NULL, |
1785 | &file)) { | ||
1773 | printk(KERN_INFO "Core dump to %s pipe failed\n", | 1786 | printk(KERN_INFO "Core dump to %s pipe failed\n", |
1774 | corename); | 1787 | corename); |
1775 | goto fail_unlock; | 1788 | goto fail_unlock; |