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:
Родитель
d9588725e5
Коммит
0cf062d0ff
|
@ -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)
|
||||
|
|
Загрузка…
Ссылка в новой задаче