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:
parent
d9588725e5
commit
0cf062d0ff
|
@ -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
|
#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) {
|
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,
|
||||||
#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)
|
||||||
|
|
Loading…
Reference in New Issue