diff options
Diffstat (limited to 'fs/exec.c')
-rw-r--r-- | fs/exec.c | 7 |
1 files changed, 7 insertions, 0 deletions
@@ -2066,6 +2066,7 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs) | |||
2066 | int retval = 0; | 2066 | int retval = 0; |
2067 | int flag = 0; | 2067 | int flag = 0; |
2068 | int ispipe; | 2068 | int ispipe; |
2069 | struct files_struct *displaced; | ||
2069 | bool need_nonrelative = false; | 2070 | bool need_nonrelative = false; |
2070 | static atomic_t core_dump_count = ATOMIC_INIT(0); | 2071 | static atomic_t core_dump_count = ATOMIC_INIT(0); |
2071 | struct coredump_params cprm = { | 2072 | struct coredump_params cprm = { |
@@ -2219,6 +2220,12 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs) | |||
2219 | goto close_fail; | 2220 | goto close_fail; |
2220 | } | 2221 | } |
2221 | 2222 | ||
2223 | /* get us an unshared descriptor table; almost always a no-op */ | ||
2224 | retval = unshare_files(&displaced); | ||
2225 | if (retval) | ||
2226 | goto close_fail; | ||
2227 | if (displaced) | ||
2228 | put_files_struct(displaced); | ||
2222 | retval = binfmt->core_dump(&cprm); | 2229 | retval = binfmt->core_dump(&cprm); |
2223 | if (retval) | 2230 | if (retval) |
2224 | current->signal->group_exit_code |= 0x80; | 2231 | current->signal->group_exit_code |= 0x80; |