2014-07-11 10:01:20

by Silesh C V

[permalink] [raw]
Subject: [PATCH] coredump: Fix the setting of PF_DUMPCORE

commit 079148b91 (coredump: factor out the setting of PF_DUMPCORE)
cleaned up the setting of PF_DUMPCORE by removing it from all the
linux_binfmt->core_dump() and moving it to zap_threads().But this
ended up clearing all the previously set flags. This causes issues
during core generation when tsk->flags is checked again
(eg. for PF_USED_MATH to dump floating point registers). Fix this.

Signed-off-by: Silesh C V <[email protected]>
Cc: Oleg Nesterov <[email protected]>
Cc: Mandeep Singh Baines <[email protected]>

---
fs/coredump.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/fs/coredump.c b/fs/coredump.c
index 0b2528f..a93f7e6 100644
--- a/fs/coredump.c
+++ b/fs/coredump.c
@@ -306,7 +306,7 @@ static int zap_threads(struct task_struct *tsk, struct mm_struct *mm,
if (unlikely(nr < 0))
return nr;

- tsk->flags = PF_DUMPCORE;
+ tsk->flags |= PF_DUMPCORE;
if (atomic_read(&mm->mm_users) == nr + 1)
goto done;
/*
--
1.8.1.2


2014-07-11 10:38:20

by Oleg Nesterov

[permalink] [raw]
Subject: Re: [PATCH] coredump: Fix the setting of PF_DUMPCORE

OOPS. Thanks a lot Silesh.

Hopefully Andrew can take this patch. And it probably needs
Cc: [email protected] # v3.10+

On 07/11, Silesh C V wrote:
>
> commit 079148b91 (coredump: factor out the setting of PF_DUMPCORE)
> cleaned up the setting of PF_DUMPCORE by removing it from all the
> linux_binfmt->core_dump() and moving it to zap_threads().But this
> ended up clearing all the previously set flags. This causes issues
> during core generation when tsk->flags is checked again
> (eg. for PF_USED_MATH to dump floating point registers). Fix this.
>
> Signed-off-by: Silesh C V <[email protected]>
> Cc: Oleg Nesterov <[email protected]>
> Cc: Mandeep Singh Baines <[email protected]>
>
> ---
> fs/coredump.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/coredump.c b/fs/coredump.c
> index 0b2528f..a93f7e6 100644
> --- a/fs/coredump.c
> +++ b/fs/coredump.c
> @@ -306,7 +306,7 @@ static int zap_threads(struct task_struct *tsk, struct mm_struct *mm,
> if (unlikely(nr < 0))
> return nr;
>
> - tsk->flags = PF_DUMPCORE;
> + tsk->flags |= PF_DUMPCORE;
> if (atomic_read(&mm->mm_users) == nr + 1)
> goto done;
> /*
> --
> 1.8.1.2
>