Commit 0cf062d0 authored by Amerigo Wang's avatar Amerigo Wang Committed by Linus Torvalds

elf: clean up fill_note_info()

Introduce a helper function elf_note_info_init() to help fill_note_info()
to do initializations, also fix the potential memory leaks.

[akpm@linux-foundation.org: remove NUM_NOTES]
Signed-off-by: default avatarWANG Cong <amwang@redhat.com>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: David Howells <dhowells@redhat.com>
Cc: Roland McGrath <roland@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d9588725
...@@ -1711,42 +1711,52 @@ struct elf_note_info { ...@@ -1711,42 +1711,52 @@ struct elf_note_info {
int numnote; int numnote;
}; };
static int fill_note_info(struct elfhdr *elf, int phdrs, static int elf_note_info_init(struct elf_note_info *info)
struct elf_note_info *info,
long signr, struct pt_regs *regs)
{ {
#define NUM_NOTES 6 memset(info, 0, sizeof(*info));
struct list_head *t;
info->notes = NULL;
info->prstatus = NULL;
info->psinfo = NULL;
info->fpu = NULL;
#ifdef ELF_CORE_COPY_XFPREGS
info->xfpu = NULL;
#endif
INIT_LIST_HEAD(&info->thread_list); INIT_LIST_HEAD(&info->thread_list);
info->notes = kmalloc(NUM_NOTES * sizeof(struct memelfnote), /* Allocate space for six ELF notes */
GFP_KERNEL); info->notes = kmalloc(6 * sizeof(struct memelfnote), GFP_KERNEL);
if (!info->notes) if (!info->notes)
return 0; return 0;
info->psinfo = kmalloc(sizeof(*info->psinfo), GFP_KERNEL); info->psinfo = kmalloc(sizeof(*info->psinfo), GFP_KERNEL);
if (!info->psinfo) if (!info->psinfo)
return 0; goto notes_free;
info->prstatus = kmalloc(sizeof(*info->prstatus), GFP_KERNEL); info->prstatus = kmalloc(sizeof(*info->prstatus), GFP_KERNEL);
if (!info->prstatus) if (!info->prstatus)
return 0; goto psinfo_free;
info->fpu = kmalloc(sizeof(*info->fpu), GFP_KERNEL); info->fpu = kmalloc(sizeof(*info->fpu), GFP_KERNEL);
if (!info->fpu) if (!info->fpu)
return 0; goto prstatus_free;
#ifdef ELF_CORE_COPY_XFPREGS #ifdef ELF_CORE_COPY_XFPREGS
info->xfpu = kmalloc(sizeof(*info->xfpu), GFP_KERNEL); info->xfpu = kmalloc(sizeof(*info->xfpu), GFP_KERNEL);
if (!info->xfpu) if (!info->xfpu)
return 0; goto fpu_free;
#endif
return 1;
#ifdef ELF_CORE_COPY_XFPREGS
fpu_free:
kfree(info->fpu);
#endif #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,
struct elf_note_info *info,
long signr, struct pt_regs *regs)
{
struct list_head *t;
if (!elf_note_info_init(info))
return 0;
info->thread_status_size = 0;
if (signr) { if (signr) {
struct core_thread *ct; struct core_thread *ct;
struct elf_thread_status *ets; struct elf_thread_status *ets;
...@@ -1806,8 +1816,6 @@ static int fill_note_info(struct elfhdr *elf, int phdrs, ...@@ -1806,8 +1816,6 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
#endif #endif
return 1; return 1;
#undef NUM_NOTES
} }
static size_t get_note_info_size(struct elf_note_info *info) static size_t get_note_info_size(struct elf_note_info *info)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment