|
@@ -55,6 +55,7 @@
|
|
|
#include <linux/kmod.h>
|
|
|
#include <linux/fsnotify.h>
|
|
|
#include <linux/fs_struct.h>
|
|
|
+#include <linux/pipe_fs_i.h>
|
|
|
|
|
|
#include <asm/uaccess.h>
|
|
|
#include <asm/mmu_context.h>
|
|
@@ -1729,6 +1730,29 @@ int get_dumpable(struct mm_struct *mm)
|
|
|
return (ret >= 2) ? 2 : ret;
|
|
|
}
|
|
|
|
|
|
+static void wait_for_dump_helpers(struct file *file)
|
|
|
+{
|
|
|
+ struct pipe_inode_info *pipe;
|
|
|
+
|
|
|
+ pipe = file->f_path.dentry->d_inode->i_pipe;
|
|
|
+
|
|
|
+ pipe_lock(pipe);
|
|
|
+ pipe->readers++;
|
|
|
+ pipe->writers--;
|
|
|
+
|
|
|
+ while ((pipe->readers > 1) && (!signal_pending(current))) {
|
|
|
+ wake_up_interruptible_sync(&pipe->wait);
|
|
|
+ kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
|
|
|
+ pipe_wait(pipe);
|
|
|
+ }
|
|
|
+
|
|
|
+ pipe->readers--;
|
|
|
+ pipe->writers++;
|
|
|
+ pipe_unlock(pipe);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
void do_coredump(long signr, int exit_code, struct pt_regs *regs)
|
|
|
{
|
|
|
struct core_state core_state;
|
|
@@ -1886,6 +1910,8 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs)
|
|
|
if (retval)
|
|
|
current->signal->group_exit_code |= 0x80;
|
|
|
close_fail:
|
|
|
+ if (ispipe && core_pipe_limit)
|
|
|
+ wait_for_dump_helpers(file);
|
|
|
filp_close(file, NULL);
|
|
|
fail_dropcount:
|
|
|
if (dump_count)
|