From: Oleg Nesterov <oleg@redhat.com>
To: Denys Vlasenko <vda.linux@googlemail.com>
Cc: linux-kernel@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>,
Amerigo Wang <amwang@redhat.com>,
Roland McGrath <roland@hack.frob.com>
Subject: Re: [PATCH] fs: prevent double-free on an error path in core dumper
Date: Tue, 11 Sep 2012 17:59:50 +0200 [thread overview]
Message-ID: <20120911155950.GA7431@redhat.com> (raw)
In-Reply-To: <1347380162-2359-1-git-send-email-vda.linux@googlemail.com>
Denys, let's not discuss this offlist... add lkml/cc's
On 09/11, Denys Vlasenko wrote:
>
> If elf_note_info_init fails to allocate memory for info->fields,
> it frees already alloceted stuff and returns error to its caller,
> fill_note_info. Which in turn returns error to its caller,
> elf_core_dump. Which jumps to cleanup label and calls free_note_info,
> which will happily try to free all info->fields again. BOOM.
This is !CORE_DUMP_USE_REGSET case, please mention this in the
changelog. And s/fs:/coredump:/ in the subject ;)
OK, I think you are right, but unless I missed something there
is a better fix.
> This is the fix.
>
> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
> ---
> fs/binfmt_elf.c | 4 +++-
> 1 files changed, 3 insertions(+), 1 deletions(-)
>
> diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
> index 760d7f5..b2b7034 100644
> --- a/fs/binfmt_elf.c
> +++ b/fs/binfmt_elf.c
> @@ -1617,7 +1617,7 @@ static void free_note_info(struct elf_note_info *info)
> kfree(info->psinfo.data);
> }
>
> -#else
> +#else /* !CORE_DUMP_USE_REGSET */
>
> /* Here is the structure in which status of each thread is captured. */
> struct elf_thread_status
> @@ -1718,6 +1718,8 @@ static int elf_note_info_init(struct elf_note_info *info)
> kfree(info->psinfo);
> notes_free:
> kfree(info->notes);
> + /* The caller will try to clean us up again, must set ptrs to NULL */
Exactly. The caller will do free_note_info() and info was zeroed at the
start. See below
> + memset(info, 0, sizeof(*info));
Yes, this will fix the problem.
But, again, the caller does free_note_info(), so why elf_note_info_init()
tries to handle the kmalloc failures? Afaics, we can simplify the code
and fix the bug.
What do you think about the patch below?
Oleg.
--- x/fs/binfmt_elf.c
+++ x/fs/binfmt_elf.c
@@ -1696,30 +1696,19 @@ static int elf_note_info_init(struct elf
return 0;
info->psinfo = kmalloc(sizeof(*info->psinfo), GFP_KERNEL);
if (!info->psinfo)
- goto notes_free;
+ return 0;
info->prstatus = kmalloc(sizeof(*info->prstatus), GFP_KERNEL);
if (!info->prstatus)
- goto psinfo_free;
+ return 0;
info->fpu = kmalloc(sizeof(*info->fpu), GFP_KERNEL);
if (!info->fpu)
- goto prstatus_free;
+ return 0;
#ifdef ELF_CORE_COPY_XFPREGS
info->xfpu = kmalloc(sizeof(*info->xfpu), GFP_KERNEL);
if (!info->xfpu)
- goto fpu_free;
+ return 0;
#endif
return 1;
-#ifdef ELF_CORE_COPY_XFPREGS
- fpu_free:
- kfree(info->fpu);
-#endif
- prstatus_free:
- kfree(info->prstatus);
- psinfo_free:
- kfree(info->psinfo);
- notes_free:
- kfree(info->notes);
- return 0;
}
static int fill_note_info(struct elfhdr *elf, int phdrs,
next parent reply other threads:[~2012-09-11 15:57 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1347380162-2359-1-git-send-email-vda.linux@googlemail.com>
2012-09-11 15:59 ` Oleg Nesterov [this message]
2012-09-12 5:06 ` [PATCH] fs: prevent double-free on an error path in core dumper Cong Wang
2012-09-12 11:33 ` Denys Vlasenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120911155950.GA7431@redhat.com \
--to=oleg@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=amwang@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=roland@hack.frob.com \
--cc=vda.linux@googlemail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.