mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-04 02:16:45 +07:00
binfmt_flat: don't offset the data start
Ever since the initial commit of the binfmt_flat shared library support back in the bitkeeper days we've offset the actual in-memory .data start by one field per possible shared library, or 1 in case shared library support isn't enabled. I can't find anything in the loader that actually makes use of it, nor was it present before shared library support it. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Greg Ungerer <gerg@linux-m68k.org>
This commit is contained in:
parent
a445d988b4
commit
a2357223c5
@ -573,7 +573,7 @@ static int load_flat_file(struct linux_binprm *bprm,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
len = data_len + extra + MAX_SHARED_LIBS * sizeof(unsigned long);
|
len = data_len + extra;
|
||||||
len = PAGE_ALIGN(len);
|
len = PAGE_ALIGN(len);
|
||||||
realdatastart = vm_mmap(NULL, 0, len,
|
realdatastart = vm_mmap(NULL, 0, len,
|
||||||
PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 0);
|
PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 0);
|
||||||
@ -587,9 +587,7 @@ static int load_flat_file(struct linux_binprm *bprm,
|
|||||||
vm_munmap(textpos, text_len);
|
vm_munmap(textpos, text_len);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
datapos = ALIGN(realdatastart +
|
datapos = ALIGN(realdatastart, FLAT_DATA_ALIGN);
|
||||||
MAX_SHARED_LIBS * sizeof(unsigned long),
|
|
||||||
FLAT_DATA_ALIGN);
|
|
||||||
|
|
||||||
pr_debug("Allocated data+bss+stack (%u bytes): %lx\n",
|
pr_debug("Allocated data+bss+stack (%u bytes): %lx\n",
|
||||||
data_len + bss_len + stack_len, datapos);
|
data_len + bss_len + stack_len, datapos);
|
||||||
@ -619,7 +617,7 @@ static int load_flat_file(struct linux_binprm *bprm,
|
|||||||
memp_size = len;
|
memp_size = len;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
len = text_len + data_len + extra + MAX_SHARED_LIBS * sizeof(u32);
|
len = text_len + data_len + extra;
|
||||||
len = PAGE_ALIGN(len);
|
len = PAGE_ALIGN(len);
|
||||||
textpos = vm_mmap(NULL, 0, len,
|
textpos = vm_mmap(NULL, 0, len,
|
||||||
PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE, 0);
|
PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE, 0);
|
||||||
@ -634,9 +632,7 @@ static int load_flat_file(struct linux_binprm *bprm,
|
|||||||
}
|
}
|
||||||
|
|
||||||
realdatastart = textpos + ntohl(hdr->data_start);
|
realdatastart = textpos + ntohl(hdr->data_start);
|
||||||
datapos = ALIGN(realdatastart +
|
datapos = ALIGN(realdatastart, FLAT_DATA_ALIGN);
|
||||||
MAX_SHARED_LIBS * sizeof(u32),
|
|
||||||
FLAT_DATA_ALIGN);
|
|
||||||
|
|
||||||
reloc = (__be32 __user *)
|
reloc = (__be32 __user *)
|
||||||
(datapos + (ntohl(hdr->reloc_start) - text_len));
|
(datapos + (ntohl(hdr->reloc_start) - text_len));
|
||||||
@ -653,6 +649,7 @@ static int load_flat_file(struct linux_binprm *bprm,
|
|||||||
(text_len + full_data
|
(text_len + full_data
|
||||||
- sizeof(struct flat_hdr)),
|
- sizeof(struct flat_hdr)),
|
||||||
0);
|
0);
|
||||||
|
if (datapos != realdatastart)
|
||||||
memmove((void *)datapos, (void *)realdatastart,
|
memmove((void *)datapos, (void *)realdatastart,
|
||||||
full_data);
|
full_data);
|
||||||
#else
|
#else
|
||||||
@ -710,8 +707,7 @@ static int load_flat_file(struct linux_binprm *bprm,
|
|||||||
if (IS_ERR_VALUE(result)) {
|
if (IS_ERR_VALUE(result)) {
|
||||||
ret = result;
|
ret = result;
|
||||||
pr_err("Unable to read code+data+bss, errno %d\n", ret);
|
pr_err("Unable to read code+data+bss, errno %d\n", ret);
|
||||||
vm_munmap(textpos, text_len + data_len + extra +
|
vm_munmap(textpos, text_len + data_len + extra);
|
||||||
MAX_SHARED_LIBS * sizeof(u32));
|
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user