forked from Bananymous/banan-os
Kernel: cleanup sys_exec()
We now scope everyting so desctructors get called
This commit is contained in:
parent
ba9fa00947
commit
4d5b14753d
|
@ -315,77 +315,77 @@ namespace Kernel
|
||||||
|
|
||||||
BAN::ErrorOr<long> Process::sys_exec(BAN::StringView path, const char* const* argv, const char* const* envp)
|
BAN::ErrorOr<long> Process::sys_exec(BAN::StringView path, const char* const* argv, const char* const* envp)
|
||||||
{
|
{
|
||||||
BAN::Vector<BAN::String> str_argv;
|
// NOTE: We scope everything for automatic deletion
|
||||||
for (int i = 0; argv && argv[i]; i++)
|
|
||||||
TRY(str_argv.emplace_back(argv[i]));
|
|
||||||
|
|
||||||
BAN::Vector<BAN::StringView> path_env;
|
|
||||||
BAN::Vector<BAN::String> str_envp;
|
|
||||||
for (int i = 0; envp && envp[i]; i++)
|
|
||||||
{
|
{
|
||||||
TRY(str_envp.emplace_back(envp[i]));
|
BAN::Vector<BAN::String> str_argv;
|
||||||
if (strncmp(envp[i], "PATH=", 5) == 0)
|
for (int i = 0; argv && argv[i]; i++)
|
||||||
path_env = TRY(BAN::StringView(envp[i]).substring(5).split(':'));
|
TRY(str_argv.emplace_back(argv[i]));
|
||||||
}
|
|
||||||
|
|
||||||
BAN::String working_directory;
|
BAN::Vector<BAN::StringView> path_env;
|
||||||
|
BAN::Vector<BAN::String> str_envp;
|
||||||
{
|
for (int i = 0; envp && envp[i]; i++)
|
||||||
LockGuard _(m_lock);
|
|
||||||
TRY(working_directory.append(m_working_directory));
|
|
||||||
}
|
|
||||||
|
|
||||||
auto elf = TRY(load_elf_for_exec(m_credentials, path, working_directory, path_env));
|
|
||||||
|
|
||||||
LockGuard lock_guard(m_lock);
|
|
||||||
|
|
||||||
m_open_file_descriptors.close_cloexec();
|
|
||||||
|
|
||||||
m_fixed_width_allocators.clear();
|
|
||||||
m_general_allocator.clear();
|
|
||||||
m_mapped_ranges.clear();
|
|
||||||
|
|
||||||
load_elf_to_memory(*elf);
|
|
||||||
|
|
||||||
m_userspace_info.entry = elf->file_header_native().e_entry;
|
|
||||||
|
|
||||||
// NOTE: we clear the elf since we don't need the memory anymore
|
|
||||||
elf.clear();
|
|
||||||
|
|
||||||
ASSERT(m_threads.size() == 1);
|
|
||||||
ASSERT(&Process::current() == this);
|
|
||||||
|
|
||||||
{
|
|
||||||
LockGuard _(page_table());
|
|
||||||
|
|
||||||
m_userspace_info.argv = (char**)MUST(sys_alloc(sizeof(char**) * (str_argv.size() + 1)));
|
|
||||||
for (size_t i = 0; i < str_argv.size(); i++)
|
|
||||||
{
|
{
|
||||||
m_userspace_info.argv[i] = (char*)MUST(sys_alloc(str_argv[i].size() + 1));
|
TRY(str_envp.emplace_back(envp[i]));
|
||||||
memcpy(m_userspace_info.argv[i], str_argv[i].data(), str_argv[i].size());
|
if (strncmp(envp[i], "PATH=", 5) == 0)
|
||||||
m_userspace_info.argv[i][str_argv[i].size()] = '\0';
|
path_env = TRY(BAN::StringView(envp[i]).substring(5).split(':'));
|
||||||
}
|
}
|
||||||
m_userspace_info.argv[str_argv.size()] = nullptr;
|
|
||||||
|
|
||||||
m_userspace_info.envp = (char**)MUST(sys_alloc(sizeof(char**) * (str_envp.size() + 1)));
|
BAN::String working_directory;
|
||||||
for (size_t i = 0; i < str_envp.size(); i++)
|
|
||||||
{
|
{
|
||||||
m_userspace_info.envp[i] = (char*)MUST(sys_alloc(str_envp[i].size() + 1));
|
LockGuard _(m_lock);
|
||||||
memcpy(m_userspace_info.envp[i], str_envp[i].data(), str_envp[i].size());
|
TRY(working_directory.append(m_working_directory));
|
||||||
m_userspace_info.envp[i][str_envp[i].size()] = '\0';
|
|
||||||
}
|
}
|
||||||
m_userspace_info.envp[str_envp.size()] = nullptr;
|
|
||||||
|
auto elf = TRY(load_elf_for_exec(m_credentials, path, working_directory, path_env));
|
||||||
|
|
||||||
|
LockGuard lock_guard(m_lock);
|
||||||
|
|
||||||
|
m_open_file_descriptors.close_cloexec();
|
||||||
|
|
||||||
|
m_fixed_width_allocators.clear();
|
||||||
|
m_general_allocator.clear();
|
||||||
|
m_mapped_ranges.clear();
|
||||||
|
|
||||||
|
load_elf_to_memory(*elf);
|
||||||
|
|
||||||
|
m_userspace_info.entry = elf->file_header_native().e_entry;
|
||||||
|
|
||||||
|
// NOTE: we clear the elf since we don't need the memory anymore
|
||||||
|
elf.clear();
|
||||||
|
|
||||||
|
ASSERT(m_threads.size() == 1);
|
||||||
|
ASSERT(&Process::current() == this);
|
||||||
|
|
||||||
|
// allocate memory on the new process for arguments and environment
|
||||||
|
{
|
||||||
|
LockGuard _(page_table());
|
||||||
|
|
||||||
|
m_userspace_info.argv = (char**)MUST(sys_alloc(sizeof(char**) * (str_argv.size() + 1)));
|
||||||
|
for (size_t i = 0; i < str_argv.size(); i++)
|
||||||
|
{
|
||||||
|
m_userspace_info.argv[i] = (char*)MUST(sys_alloc(str_argv[i].size() + 1));
|
||||||
|
memcpy(m_userspace_info.argv[i], str_argv[i].data(), str_argv[i].size());
|
||||||
|
m_userspace_info.argv[i][str_argv[i].size()] = '\0';
|
||||||
|
}
|
||||||
|
m_userspace_info.argv[str_argv.size()] = nullptr;
|
||||||
|
|
||||||
|
m_userspace_info.envp = (char**)MUST(sys_alloc(sizeof(char**) * (str_envp.size() + 1)));
|
||||||
|
for (size_t i = 0; i < str_envp.size(); i++)
|
||||||
|
{
|
||||||
|
m_userspace_info.envp[i] = (char*)MUST(sys_alloc(str_envp[i].size() + 1));
|
||||||
|
memcpy(m_userspace_info.envp[i], str_envp[i].data(), str_envp[i].size());
|
||||||
|
m_userspace_info.envp[i][str_envp[i].size()] = '\0';
|
||||||
|
}
|
||||||
|
m_userspace_info.envp[str_envp.size()] = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_userspace_info.argc = str_argv.size();
|
||||||
|
|
||||||
|
asm volatile("cli");
|
||||||
|
m_threads.front()->setup_exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_userspace_info.argc = str_argv.size();
|
|
||||||
|
|
||||||
// NOTE: These must be manually cleared since this function won't return after this point
|
|
||||||
str_argv.clear();
|
|
||||||
str_envp.clear();
|
|
||||||
|
|
||||||
CriticalScope _;
|
|
||||||
lock_guard.~LockGuard();
|
|
||||||
m_threads.front()->setup_exec();
|
|
||||||
Scheduler::get().execute_current_thread();
|
Scheduler::get().execute_current_thread();
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue