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: WANG 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: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Amerigo Wang 2009-09-23 15:57:05 -07:00 committed by Linus Torvalds
parent d9588725e5
commit 0cf062d0ff
1 changed files with 30 additions and 22 deletions

View File

@ -1711,42 +1711,52 @@ struct elf_note_info {
int numnote;
};
static int fill_note_info(struct elfhdr *elf, int phdrs,
struct elf_note_info *info,
long signr, struct pt_regs *regs)
static int elf_note_info_init(struct elf_note_info *info)
{
#define NUM_NOTES 6
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
memset(info, 0, sizeof(*info));
INIT_LIST_HEAD(&info->thread_list);
info->notes = kmalloc(NUM_NOTES * sizeof(struct memelfnote),
GFP_KERNEL);
/* Allocate space for six ELF notes */
info->notes = kmalloc(6 * sizeof(struct memelfnote), GFP_KERNEL);
if (!info->notes)
return 0;
info->psinfo = kmalloc(sizeof(*info->psinfo), GFP_KERNEL);
if (!info->psinfo)
return 0;
goto notes_free;
info->prstatus = kmalloc(sizeof(*info->prstatus), GFP_KERNEL);
if (!info->prstatus)
return 0;
goto psinfo_free;
info->fpu = kmalloc(sizeof(*info->fpu), GFP_KERNEL);
if (!info->fpu)
return 0;
goto prstatus_free;
#ifdef ELF_CORE_COPY_XFPREGS
info->xfpu = kmalloc(sizeof(*info->xfpu), GFP_KERNEL);
if (!info->xfpu)
return 0;
goto fpu_free;
#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,
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) {
struct core_thread *ct;
struct elf_thread_status *ets;
@ -1806,8 +1816,6 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
#endif
return 1;
#undef NUM_NOTES
}
static size_t get_note_info_size(struct elf_note_info *info)