1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-10 03:57:35 +00:00

Fix some bugs in execve() and make sh use it for process launching.

Interrupting children of sh now always works with ^C :^)
This commit is contained in:
Andreas Kling 2018-11-03 02:04:36 +01:00
parent 202bdb553c
commit 20fb1fc377
4 changed files with 24 additions and 24 deletions

View file

@ -346,8 +346,7 @@ int Process::sys$execve(const char* filename, const char** argv, const char** en
new_page_directory = reinterpret_cast<PageDirectory*>(kmalloc_page_aligned(sizeof(PageDirectory)));
MM.populate_page_directory(*new_page_directory);
m_page_directory = new_page_directory;
ProcessPagingScope pagingScope(*this);
MM.enter_process_paging_scope(*this);
space.hookableAlloc = [&] (const String& name, size_t size) {
if (!size)
return (void*)nullptr;
@ -357,11 +356,12 @@ int Process::sys$execve(const char* filename, const char** argv, const char** en
};
bool success = space.loadELF(move(elfData));
if (!success) {
MM.release_page_directory(*new_page_directory);
m_page_directory = old_page_directory;
MM.enter_process_paging_scope(*this);
MM.release_page_directory(*new_page_directory);
m_regions = move(old_regions);
m_subregions = move(old_subregions);
kprintf("Failure loading ELF %s\n", path.characters());
kprintf("sys$execve: Failure loading %s\n", path.characters());
return -ENOEXEC;
}
@ -378,8 +378,9 @@ int Process::sys$execve(const char* filename, const char** argv, const char** en
entry_eip = (dword)space.symbolPtr("_start");
if (!entry_eip) {
MM.release_page_directory(*new_page_directory);
m_page_directory = old_page_directory;
MM.enter_process_paging_scope(*this);
MM.release_page_directory(*new_page_directory);
m_regions = move(old_regions);
m_subregions = move(old_subregions);
return -ENOEXEC;