|
@@ -862,6 +862,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
|
|
|
i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {
|
|
|
int elf_prot = 0, elf_flags;
|
|
|
unsigned long k, vaddr;
|
|
|
+ unsigned long total_size = 0;
|
|
|
|
|
|
if (elf_ppnt->p_type != PT_LOAD)
|
|
|
continue;
|
|
@@ -924,10 +925,16 @@ static int load_elf_binary(struct linux_binprm *bprm)
|
|
|
#else
|
|
|
load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr);
|
|
|
#endif
|
|
|
+ total_size = total_mapping_size(elf_phdata,
|
|
|
+ loc->elf_ex.e_phnum);
|
|
|
+ if (!total_size) {
|
|
|
+ error = -EINVAL;
|
|
|
+ goto out_free_dentry;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt,
|
|
|
- elf_prot, elf_flags, 0);
|
|
|
+ elf_prot, elf_flags, total_size);
|
|
|
if (BAD_ADDR(error)) {
|
|
|
retval = IS_ERR((void *)error) ?
|
|
|
PTR_ERR((void*)error) : -EINVAL;
|