diff options
-rw-r--r-- | arch/x86_64/ia32/ia32_binfmt.c | 57 |
1 files changed, 31 insertions, 26 deletions
diff --git a/arch/x86_64/ia32/ia32_binfmt.c b/arch/x86_64/ia32/ia32_binfmt.c index a9dc0f3b5b51..2fd5a67fd435 100644 --- a/arch/x86_64/ia32/ia32_binfmt.c +++ b/arch/x86_64/ia32/ia32_binfmt.c | |||
@@ -73,39 +73,44 @@ typedef elf_greg_t elf_gregset_t[ELF_NGREG]; | |||
73 | * Dumping its extra ELF program headers includes all the other information | 73 | * Dumping its extra ELF program headers includes all the other information |
74 | * a debugger needs to easily find how the vsyscall DSO was being used. | 74 | * a debugger needs to easily find how the vsyscall DSO was being used. |
75 | */ | 75 | */ |
76 | #define ELF_CORE_EXTRA_PHDRS (VSYSCALL32_EHDR->e_phnum) | 76 | #define ELF_CORE_EXTRA_PHDRS (find_vma(current->mm, VSYSCALL32_BASE) ? \ |
77 | (VSYSCALL32_EHDR->e_phnum) : 0) | ||
77 | #define ELF_CORE_WRITE_EXTRA_PHDRS \ | 78 | #define ELF_CORE_WRITE_EXTRA_PHDRS \ |
78 | do { \ | 79 | do { \ |
79 | const struct elf32_phdr *const vsyscall_phdrs = \ | 80 | if (find_vma(current->mm, VSYSCALL32_BASE)) { \ |
80 | (const struct elf32_phdr *) (VSYSCALL32_BASE \ | 81 | const struct elf32_phdr *const vsyscall_phdrs = \ |
81 | + VSYSCALL32_EHDR->e_phoff); \ | 82 | (const struct elf32_phdr *) (VSYSCALL32_BASE \ |
82 | int i; \ | 83 | + VSYSCALL32_EHDR->e_phoff);\ |
83 | Elf32_Off ofs = 0; \ | 84 | int i; \ |
84 | for (i = 0; i < VSYSCALL32_EHDR->e_phnum; ++i) { \ | 85 | Elf32_Off ofs = 0; \ |
85 | struct elf32_phdr phdr = vsyscall_phdrs[i]; \ | 86 | for (i = 0; i < VSYSCALL32_EHDR->e_phnum; ++i) { \ |
86 | if (phdr.p_type == PT_LOAD) { \ | 87 | struct elf32_phdr phdr = vsyscall_phdrs[i]; \ |
87 | BUG_ON(ofs != 0); \ | 88 | if (phdr.p_type == PT_LOAD) { \ |
88 | ofs = phdr.p_offset = offset; \ | 89 | BUG_ON(ofs != 0); \ |
89 | phdr.p_memsz = PAGE_ALIGN(phdr.p_memsz); \ | 90 | ofs = phdr.p_offset = offset; \ |
90 | phdr.p_filesz = phdr.p_memsz; \ | 91 | phdr.p_memsz = PAGE_ALIGN(phdr.p_memsz); \ |
91 | offset += phdr.p_filesz; \ | 92 | phdr.p_filesz = phdr.p_memsz; \ |
93 | offset += phdr.p_filesz; \ | ||
94 | } \ | ||
95 | else \ | ||
96 | phdr.p_offset += ofs; \ | ||
97 | phdr.p_paddr = 0; /* match other core phdrs */ \ | ||
98 | DUMP_WRITE(&phdr, sizeof(phdr)); \ | ||
92 | } \ | 99 | } \ |
93 | else \ | ||
94 | phdr.p_offset += ofs; \ | ||
95 | phdr.p_paddr = 0; /* match other core phdrs */ \ | ||
96 | DUMP_WRITE(&phdr, sizeof(phdr)); \ | ||
97 | } \ | 100 | } \ |
98 | } while (0) | 101 | } while (0) |
99 | #define ELF_CORE_WRITE_EXTRA_DATA \ | 102 | #define ELF_CORE_WRITE_EXTRA_DATA \ |
100 | do { \ | 103 | do { \ |
101 | const struct elf32_phdr *const vsyscall_phdrs = \ | 104 | if (find_vma(current->mm, VSYSCALL32_BASE)) { \ |
102 | (const struct elf32_phdr *) (VSYSCALL32_BASE \ | 105 | const struct elf32_phdr *const vsyscall_phdrs = \ |
103 | + VSYSCALL32_EHDR->e_phoff); \ | 106 | (const struct elf32_phdr *) (VSYSCALL32_BASE \ |
104 | int i; \ | 107 | + VSYSCALL32_EHDR->e_phoff); \ |
105 | for (i = 0; i < VSYSCALL32_EHDR->e_phnum; ++i) { \ | 108 | int i; \ |
106 | if (vsyscall_phdrs[i].p_type == PT_LOAD) \ | 109 | for (i = 0; i < VSYSCALL32_EHDR->e_phnum; ++i) { \ |
107 | DUMP_WRITE((void *) (u64) vsyscall_phdrs[i].p_vaddr, \ | 110 | if (vsyscall_phdrs[i].p_type == PT_LOAD) \ |
108 | PAGE_ALIGN(vsyscall_phdrs[i].p_memsz)); \ | 111 | DUMP_WRITE((void *) (u64) vsyscall_phdrs[i].p_vaddr,\ |
112 | PAGE_ALIGN(vsyscall_phdrs[i].p_memsz)); \ | ||
113 | } \ | ||
109 | } \ | 114 | } \ |
110 | } while (0) | 115 | } while (0) |
111 | 116 | ||