mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 21:07:35 +00:00
Kernel+LibC+LibELF: Set stack size based on PT_GNU_STACK during execve
Some programs explicitly ask for a different initial stack size than what the OS provides. This is implemented in ELF by having a PT_GNU_STACK header which has its p_memsz set to the amount that the program requires. This commit implements this policy by reading the p_memsz of the header and setting the main thread stack size to that. ELF::Image::validate_program_headers ensures that the size attribute is a reasonable value.
This commit is contained in:
parent
3275015786
commit
ef6921d7c7
9 changed files with 43 additions and 7 deletions
|
@ -7,6 +7,7 @@
|
|||
|
||||
#include <AK/Assertions.h>
|
||||
#include <AK/Checked.h>
|
||||
#include <Kernel/API/serenity_limits.h>
|
||||
#include <LibC/elf.h>
|
||||
#include <LibELF/Validation.h>
|
||||
#include <limits.h>
|
||||
|
@ -298,6 +299,21 @@ ErrorOr<bool> validate_program_headers(ElfW(Ehdr) const& elf_header, size_t file
|
|||
if (verbose)
|
||||
dbgln("Possible shenanigans! Validating an ELF with executable stack.");
|
||||
}
|
||||
|
||||
if (program_header.p_memsz != 0) {
|
||||
if (program_header.p_memsz < static_cast<unsigned>(PTHREAD_STACK_MIN) || program_header.p_memsz > static_cast<unsigned>(PTHREAD_STACK_MAX)) {
|
||||
if (verbose)
|
||||
dbgln("PT_GNU_STACK defines an unacceptable stack size.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (program_header.p_memsz % PAGE_SIZE != 0) {
|
||||
if (verbose)
|
||||
dbgln("PT_GNU_STACK size is not page-aligned.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
case PT_GNU_RELRO:
|
||||
if ((program_header.p_flags & PF_X) && (program_header.p_flags & PF_W)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue