Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 198745
b: refs/heads/master
c: d5bf4c4
h: refs/heads/master
i:
  198743: 8feeb6e
v: v3
  • Loading branch information
Oleg Nesterov authored and Linus Torvalds committed May 27, 2010
1 parent 1977bc7 commit 8f3e841
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 23 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c713541125002b8bc9e681af3b09118e771e2d8a
refs/heads/master: d5bf4c4f5f9dcc90b7e25dbb2f7c4436cf6e7ed0
39 changes: 17 additions & 22 deletions trunk/fs/exec.c
Original file line number Diff line number Diff line change
Expand Up @@ -1841,10 +1841,7 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs)
struct cred *cred;
int retval = 0;
int flag = 0;
int ispipe = 0;
char **helper_argv = NULL;
int helper_argc = 0;
int dump_count = 0;
int ispipe;
static atomic_t core_dump_count = ATOMIC_INIT(0);
struct coredump_params cprm = {
.signr = signr,
Expand Down Expand Up @@ -1914,6 +1911,9 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs)
unlock_kernel();

if (ispipe) {
int dump_count;
char **helper_argv;

if (cprm.limit == 1) {
/*
* Normally core limits are irrelevant to pipes, since
Expand All @@ -1935,6 +1935,7 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs)
printk(KERN_WARNING "Aborting core\n");
goto fail_unlock;
}
cprm.limit = RLIM_INFINITY;

dump_count = atomic_inc_return(&core_dump_count);
if (core_pipe_limit && (core_pipe_limit < dump_count)) {
Expand All @@ -1944,26 +1945,21 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs)
goto fail_dropcount;
}

helper_argv = argv_split(GFP_KERNEL, corename+1, &helper_argc);
helper_argv = argv_split(GFP_KERNEL, corename+1, NULL);
if (!helper_argv) {
printk(KERN_WARNING "%s failed to allocate memory\n",
__func__);
goto fail_dropcount;
}

cprm.limit = RLIM_INFINITY;

/* SIGPIPE can happen, but it's just never processed */
cprm.file = NULL;
if (call_usermodehelper_fns(helper_argv[0], helper_argv, NULL,
UMH_WAIT_EXEC, umh_pipe_setup,
NULL, &cprm)) {
if (cprm.file)
filp_close(cprm.file, NULL);

retval = call_usermodehelper_fns(helper_argv[0], helper_argv,
NULL, UMH_WAIT_EXEC, umh_pipe_setup,
NULL, &cprm);
argv_free(helper_argv);
if (retval) {
printk(KERN_INFO "Core dump to %s pipe failed\n",
corename);
goto fail_dropcount;
goto close_fail;
}
} else {
struct inode *inode;
Expand Down Expand Up @@ -2003,17 +1999,16 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs)
retval = binfmt->core_dump(&cprm);
if (retval)
current->signal->group_exit_code |= 0x80;
close_fail:

if (ispipe && core_pipe_limit)
wait_for_dump_helpers(cprm.file);
filp_close(cprm.file, NULL);
close_fail:
if (cprm.file)
filp_close(cprm.file, NULL);
fail_dropcount:
if (dump_count)
if (ispipe)
atomic_dec(&core_dump_count);
fail_unlock:
if (helper_argv)
argv_free(helper_argv);

revert_creds(old_cred);
put_cred(cred);
coredump_finish(mm);
Expand Down

0 comments on commit 8f3e841

Please sign in to comment.