|
@@ -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)
|